old stuff removed
This commit is contained in:
parent
4eaea0c98b
commit
37214bf716
@ -13,9 +13,6 @@
|
|||||||
#include "isr.h"
|
#include "isr.h"
|
||||||
#include "sys_tick.h"
|
#include "sys_tick.h"
|
||||||
|
|
||||||
#include "ascii_font.h"
|
|
||||||
#include "bitmap.h"
|
|
||||||
|
|
||||||
#define STACK_SIZE 256
|
#define STACK_SIZE 256
|
||||||
stack_t tc_1_stack[STACK_SIZE];
|
stack_t tc_1_stack[STACK_SIZE];
|
||||||
struct thread_context tc_1;
|
struct thread_context tc_1;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
CHECK_FOLDER += firmware/arch/stm32f4xx/board/stm32f4-discovery
|
CHECK_FOLDER += firmware/arch/stm32f4xx/board/stm32f4-discovery
|
||||||
SUB_FOLDER += firmware/arch/stm32f4xx/board/stm32f4-discovery
|
SUB_FOLDER += firmware/arch/stm32f4xx/board/stm32f4-discovery
|
||||||
INCLUDES += firmware/arch/stm32f4xx/board/stm32f4-discovery
|
INCLUDES += firmware/arch/stm32f4xx/board/stm32f4-discovery/include
|
||||||
DOC_SRC += firmware/arch/stm32f4xx/board/stm32f4-discovery
|
DOC_SRC += firmware/arch/stm32f4xx/board/stm32f4-discovery
|
@ -1,5 +1,5 @@
|
|||||||
include firmware/arch/stm32f4xx/driver/gpio/gpio.mk
|
CHECK_FOLDER += firmware/arch/stm32f4xx/driver
|
||||||
include firmware/arch/stm32f4xx/driver/timer/timer.mk
|
SUB_FOLDER += firmware/arch/stm32f4xx/driver
|
||||||
include firmware/arch/stm32f4xx/driver/uart/uart.mk
|
INCLUDES += firmware/arch/stm32f4xx/driver/include
|
||||||
#include firmware/arch/stm32f4xx/driver/usb/usb.mk
|
DOC_SRC += firmware/arch/stm32f4xx/driver
|
||||||
#include firmware/arch/stm32f4xx/driver/usb_vport/usb_vport.mk
|
DOC_SRC += firmware/arch/stm32f4xx/driver/include
|
||||||
|
@ -1,4 +0,0 @@
|
|||||||
CHECK_FOLDER += firmware/arch/stm32f4xx/driver/gpio
|
|
||||||
SUB_FOLDER += firmware/arch/stm32f4xx/driver/gpio
|
|
||||||
INCLUDES += firmware/arch/stm32f4xx/driver/gpio
|
|
||||||
DOC_SRC += firmware/arch/stm32f4xx/driver/gpio
|
|
@ -1,4 +0,0 @@
|
|||||||
CHECK_FOLDER += firmware/arch/stm32f4xx/driver/timer
|
|
||||||
SUB_FOLDER += firmware/arch/stm32f4xx/driver/timer
|
|
||||||
INCLUDES += firmware/arch/stm32f4xx/driver/timer
|
|
||||||
DOC_SRC += firmware/arch/stm32f4xx/driver/timer
|
|
@ -1,4 +0,0 @@
|
|||||||
CHECK_FOLDER += firmware/arch/stm32f4xx/driver/uart
|
|
||||||
SUB_FOLDER += firmware/arch/stm32f4xx/driver/uart
|
|
||||||
INCLUDES += firmware/arch/stm32f4xx/driver/uart
|
|
||||||
DOC_SRC += firmware/arch/stm32f4xx/driver/uart
|
|
@ -1,5 +0,0 @@
|
|||||||
#SUB_FOLDER += firmware/arch/stm32f4xx/driver
|
|
||||||
#INCLUDES += firmware/arch/stm32f4xx/driver
|
|
||||||
#DOC_SRC += firmware/arch/stm32f4xx/driver
|
|
||||||
|
|
||||||
include firmware/arch/stm32f4xx/driver/usb/vcp/vcp.mk
|
|
@ -1,191 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usb_bsp.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief This file is responsible to offer board support package and is
|
|
||||||
* configurable by user.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usb_bsp.h"
|
|
||||||
#include "usbd_conf.h"
|
|
||||||
|
|
||||||
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_BSP
|
|
||||||
* @brief This file is responsible to offer board support package
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_BSP_Private_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_BSP_Private_TypesDefinitions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_BSP_Private_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBH_BSP_Private_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBH_BSP_Private_FunctionPrototypes
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_BSP_Private_Functions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USB_OTG_BSP_Init
|
|
||||||
* Initilizes BSP configurations
|
|
||||||
* @param None
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
|
|
||||||
void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE *pdev)
|
|
||||||
{
|
|
||||||
GPIO_InitTypeDef GPIO_InitStructure;
|
|
||||||
|
|
||||||
|
|
||||||
RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA , ENABLE);
|
|
||||||
|
|
||||||
/* Configure SOF VBUS ID DM DP Pins */
|
|
||||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 |
|
|
||||||
GPIO_Pin_9 |
|
|
||||||
GPIO_Pin_11 |
|
|
||||||
GPIO_Pin_12;
|
|
||||||
|
|
||||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
|
|
||||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
|
|
||||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
|
|
||||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
|
|
||||||
GPIO_Init(GPIOA, &GPIO_InitStructure);
|
|
||||||
|
|
||||||
GPIO_PinAFConfig(GPIOA,GPIO_PinSource8,GPIO_AF_OTG1_FS) ;
|
|
||||||
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_OTG1_FS) ;
|
|
||||||
GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_OTG1_FS) ;
|
|
||||||
GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_OTG1_FS) ;
|
|
||||||
|
|
||||||
/* this for ID line debug */
|
|
||||||
|
|
||||||
|
|
||||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
|
|
||||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
|
|
||||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
|
|
||||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
|
|
||||||
GPIO_Init(GPIOA, &GPIO_InitStructure);
|
|
||||||
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_OTG1_FS) ;
|
|
||||||
|
|
||||||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
|
|
||||||
RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_OTG_FS, ENABLE) ;
|
|
||||||
|
|
||||||
/* enable the PWR clock */
|
|
||||||
RCC_APB1PeriphResetCmd(RCC_APB1Periph_PWR, ENABLE);
|
|
||||||
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief USB_OTG_BSP_EnableInterrupt
|
|
||||||
* Enabele USB Global interrupt
|
|
||||||
* @param None
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void USB_OTG_BSP_EnableInterrupt(USB_OTG_CORE_HANDLE *pdev)
|
|
||||||
{
|
|
||||||
NVIC_InitTypeDef NVIC_InitStructure;
|
|
||||||
|
|
||||||
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
|
|
||||||
|
|
||||||
NVIC_InitStructure.NVIC_IRQChannel = OTG_FS_IRQn;
|
|
||||||
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
|
|
||||||
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
|
|
||||||
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
|
||||||
NVIC_Init(&NVIC_InitStructure);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief USB_OTG_BSP_uDelay
|
|
||||||
* This function provides delay time in micro sec
|
|
||||||
* @param usec : Value of delay required in micro sec
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void USB_OTG_BSP_uDelay (const uint32_t usec)
|
|
||||||
{
|
|
||||||
uint32_t count = 0;
|
|
||||||
const uint32_t utime = (120 * usec / 7);
|
|
||||||
do
|
|
||||||
{
|
|
||||||
if ( ++count > utime )
|
|
||||||
{
|
|
||||||
return ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USB_OTG_BSP_mDelay
|
|
||||||
* This function provides delay time in milli sec
|
|
||||||
* @param msec : Value of delay required in milli sec
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void USB_OTG_BSP_mDelay (const uint32_t msec)
|
|
||||||
{
|
|
||||||
USB_OTG_BSP_uDelay(msec * 1000);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
@ -1,164 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usb_conf.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief General low level driver configuration
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __USB_CONF__H__
|
|
||||||
#define __USB_CONF__H__
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "stm32f4xx.h"
|
|
||||||
|
|
||||||
|
|
||||||
/** @addtogroup USB_OTG_DRIVER
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_CONF
|
|
||||||
* @brief USB low level driver configuration file
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_CONF_Exported_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* USB Core and PHY interface configuration.
|
|
||||||
Tip: To avoid modifying these defines each time you need to change the USB
|
|
||||||
configuration, you can declare the needed define in your toolchain
|
|
||||||
compiler preprocessor.
|
|
||||||
*/
|
|
||||||
#ifndef USE_USB_OTG_FS
|
|
||||||
#define USE_USB_OTG_FS
|
|
||||||
#endif /* USE_USB_OTG_FS */
|
|
||||||
|
|
||||||
|
|
||||||
#define USB_OTG_FS_CORE
|
|
||||||
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* FIFO Size Configuration in Device mode
|
|
||||||
*
|
|
||||||
* (i) Receive data FIFO size = RAM for setup packets +
|
|
||||||
* OUT endpoint control information +
|
|
||||||
* data OUT packets + miscellaneous
|
|
||||||
* Space = ONE 32-bits words
|
|
||||||
* --> RAM for setup packets = 10 spaces
|
|
||||||
* (n is the nbr of CTRL EPs the device core supports)
|
|
||||||
* --> OUT EP CTRL info = 1 space
|
|
||||||
* (one space for status information written to the FIFO along with each
|
|
||||||
* received packet)
|
|
||||||
* --> data OUT packets = (Largest Packet Size / 4) + 1 spaces
|
|
||||||
* (MINIMUM to receive packets)
|
|
||||||
* --> OR data OUT packets = at least 2*(Largest Packet Size / 4) + 1 spaces
|
|
||||||
* (if high-bandwidth EP is enabled or multiple isochronous EPs)
|
|
||||||
* --> miscellaneous = 1 space per OUT EP
|
|
||||||
* (one space for transfer complete status information also pushed to the
|
|
||||||
* FIFO with each endpoint's last packet)
|
|
||||||
*
|
|
||||||
* (ii)MINIMUM RAM space required for each IN EP Tx FIFO = MAX packet size for
|
|
||||||
* that particular IN EP. More space allocated in the IN EP Tx FIFO results
|
|
||||||
* in a better performance on the USB and can hide latencies on the AHB.
|
|
||||||
*
|
|
||||||
* (iii) TXn min size = 16 words. (n : Transmit FIFO index)
|
|
||||||
* (iv) When a TxFIFO is not used, the Configuration should be as follows:
|
|
||||||
* case 1 : n > m and Txn is not used (n,m : Transmit FIFO indexes)
|
|
||||||
* --> Txm can use the space allocated for Txn.
|
|
||||||
* case2 : n < m and Txn is not used (n,m : Transmit FIFO indexes)
|
|
||||||
* --> Txn should be configured with the minimum space of 16 words
|
|
||||||
* (v) The FIFO is used optimally when used TxFIFOs are allocated in the top
|
|
||||||
* of the FIFO.Ex: use EP1 and EP2 as IN instead of EP1 and EP3 as IN ones.
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
/****************** USB OTG FS CONFIGURATION **********************************/
|
|
||||||
#ifdef USB_OTG_FS_CORE
|
|
||||||
#define RX_FIFO_FS_SIZE 128
|
|
||||||
#define TX0_FIFO_FS_SIZE 32
|
|
||||||
#define TX1_FIFO_FS_SIZE 128
|
|
||||||
#define TX2_FIFO_FS_SIZE 32
|
|
||||||
#define TX3_FIFO_FS_SIZE 0
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/****************** USB OTG MODE CONFIGURATION ********************************/
|
|
||||||
|
|
||||||
#define USE_DEVICE_MODE
|
|
||||||
|
|
||||||
|
|
||||||
/****************** C Compilers dependant keywords ****************************/
|
|
||||||
/* In HS mode and when the DMA is used, all variables and data structures dealing
|
|
||||||
with the DMA during the transaction process should be 4-bytes aligned */
|
|
||||||
|
|
||||||
#define __ALIGN_BEGIN
|
|
||||||
#define __ALIGN_END
|
|
||||||
|
|
||||||
|
|
||||||
/* __packed keyword used to decrease the data type alignment to 1-byte */
|
|
||||||
#define __packed __attribute__ ((__packed__))
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_CONF_Exported_Types
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_CONF_Exported_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_CONF_Exported_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_CONF_Exported_FunctionsPrototype
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#endif //__USB_CONF__H__
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
||||||
|
|
@ -1,27 +0,0 @@
|
|||||||
/*
|
|
||||||
* usb_it.c
|
|
||||||
*
|
|
||||||
* Created on: May 15, 2012
|
|
||||||
* Author: tkl
|
|
||||||
*/
|
|
||||||
#include "usb_core.h"
|
|
||||||
#include "usbd_core.h"
|
|
||||||
#include "usbd_cdc_core.h"
|
|
||||||
#include "usb_dcd_int.h"
|
|
||||||
|
|
||||||
#include "usb_vport.h"
|
|
||||||
|
|
||||||
void OTG_FS_WKUP_IRQHandler(void) {
|
|
||||||
if(USB_OTG_dev.cfg.low_power) {
|
|
||||||
*(uint32_t *)(0xE000ED10) &= 0xFFFFFFF9 ;
|
|
||||||
// TODO!!!
|
|
||||||
// SystemInit();
|
|
||||||
USB_OTG_UngateClock(&USB_OTG_dev);
|
|
||||||
}
|
|
||||||
EXTI_ClearITPendingBit(EXTI_Line18);
|
|
||||||
}
|
|
||||||
|
|
||||||
void OTG_FS_IRQHandler(void) {
|
|
||||||
USBD_OTG_ISR_Handler (&USB_OTG_dev);
|
|
||||||
}
|
|
||||||
|
|
@ -1,263 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_cdc_vcp.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief Generic media access Layer.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_cdc_vcp.h"
|
|
||||||
/* Private typedef -----------------------------------------------------------*/
|
|
||||||
/* Private define ------------------------------------------------------------*/
|
|
||||||
/* Private macro -------------------------------------------------------------*/
|
|
||||||
/* Private variables ---------------------------------------------------------*/
|
|
||||||
LINE_CODING linecoding =
|
|
||||||
{
|
|
||||||
115200, /* baud rate*/
|
|
||||||
0x00, /* stop bits-1*/
|
|
||||||
0x00, /* parity - none*/
|
|
||||||
0x08 /* nb. of bits 8*/
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* These are external variables imported from CDC core to be used for IN
|
|
||||||
transfer management. */
|
|
||||||
extern uint8_t APP_Rx_Buffer []; /* Write CDC received data in this buffer.
|
|
||||||
These data will be sent over USB IN endpoint
|
|
||||||
in the CDC core functions. */
|
|
||||||
extern uint32_t APP_Rx_ptr_in; /* Increment this pointer or roll it back to
|
|
||||||
start address when writing received data
|
|
||||||
in the buffer APP_Rx_Buffer. */
|
|
||||||
static uint8_t u8PortReady = 0;
|
|
||||||
/* Private function prototypes -----------------------------------------------*/
|
|
||||||
static uint16_t VCP_Init (void);
|
|
||||||
static uint16_t VCP_DeInit (void);
|
|
||||||
static uint16_t VCP_Ctrl (uint32_t Cmd, uint32_t wValue, uint8_t* Buf, uint32_t Len);
|
|
||||||
static uint16_t VCP_DataTx (uint8_t* Buf, uint32_t Len);
|
|
||||||
static uint16_t VCP_DataRx (uint8_t* Buf, uint32_t Len);
|
|
||||||
|
|
||||||
|
|
||||||
static uint16_t VCP_COMConfig(uint8_t Conf);
|
|
||||||
|
|
||||||
CDC_IF_Prop_TypeDef VCP_fops =
|
|
||||||
{
|
|
||||||
VCP_Init,
|
|
||||||
VCP_DeInit,
|
|
||||||
VCP_Ctrl,
|
|
||||||
VCP_DataTx,
|
|
||||||
VCP_DataRx
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Private functions ---------------------------------------------------------*/
|
|
||||||
/**
|
|
||||||
* @brief VCP_Init
|
|
||||||
* Initializes the Media on the STM32
|
|
||||||
* @param None
|
|
||||||
* @retval Result of the opeartion (USBD_OK in all cases)
|
|
||||||
*/
|
|
||||||
static uint16_t VCP_Init(void)
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief VCP_DeInit
|
|
||||||
* DeInitializes the Media on the STM32
|
|
||||||
* @param None
|
|
||||||
* @retval Result of the opeartion (USBD_OK in all cases)
|
|
||||||
*/
|
|
||||||
static uint16_t VCP_DeInit(void)
|
|
||||||
{
|
|
||||||
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief VCP_Ctrl
|
|
||||||
* Manage the CDC class requests
|
|
||||||
* @param Cmd: Command code
|
|
||||||
* @param Buf: Buffer containing command data (request parameters)
|
|
||||||
* @param Len: Number of data to be sent (in bytes)
|
|
||||||
* @retval Result of the opeartion (USBD_OK in all cases)
|
|
||||||
*/
|
|
||||||
static uint16_t VCP_Ctrl (uint32_t Cmd, uint32_t wValue, uint8_t* Buf, uint32_t Len)
|
|
||||||
{
|
|
||||||
uint32_t cacheCmd = 0;
|
|
||||||
switch (Cmd)
|
|
||||||
{
|
|
||||||
case SEND_ENCAPSULATED_COMMAND:
|
|
||||||
cacheCmd = Cmd;
|
|
||||||
/* Not needed for this driver */
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GET_ENCAPSULATED_RESPONSE:
|
|
||||||
cacheCmd = Cmd;
|
|
||||||
/* Not needed for this driver */
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SET_COMM_FEATURE:
|
|
||||||
cacheCmd = Cmd;
|
|
||||||
/* Not needed for this driver */
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GET_COMM_FEATURE:
|
|
||||||
cacheCmd = Cmd;
|
|
||||||
/* Not needed for this driver */
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CLEAR_COMM_FEATURE:
|
|
||||||
cacheCmd = Cmd;
|
|
||||||
/* Not needed for this driver */
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SET_LINE_CODING:
|
|
||||||
linecoding.bitrate = (uint32_t)(Buf[0] | (Buf[1] << 8) | (Buf[2] << 16) | (Buf[3] << 24));
|
|
||||||
linecoding.format = Buf[4];
|
|
||||||
linecoding.paritytype = Buf[5];
|
|
||||||
linecoding.datatype = Buf[6];
|
|
||||||
/* Set the new configuration */
|
|
||||||
VCP_COMConfig(OTHER_CONFIG);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GET_LINE_CODING:
|
|
||||||
Buf[0] = (uint8_t)(linecoding.bitrate);
|
|
||||||
Buf[1] = (uint8_t)(linecoding.bitrate >> 8);
|
|
||||||
Buf[2] = (uint8_t)(linecoding.bitrate >> 16);
|
|
||||||
Buf[3] = (uint8_t)(linecoding.bitrate >> 24);
|
|
||||||
Buf[4] = linecoding.format;
|
|
||||||
Buf[5] = linecoding.paritytype;
|
|
||||||
Buf[6] = linecoding.datatype;
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SET_CONTROL_LINE_STATE:
|
|
||||||
if(wValue & 1)
|
|
||||||
{
|
|
||||||
u8PortReady = 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
u8PortReady = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Not needed for this driver */
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SEND_BREAK:
|
|
||||||
cacheCmd = Cmd;
|
|
||||||
/* Not needed for this driver */
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
cacheCmd = Cmd;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief VCP_DataTx
|
|
||||||
* CDC received data to be send over USB IN endpoint are managed in
|
|
||||||
* this function.
|
|
||||||
* @param Buf: Buffer of data to be sent
|
|
||||||
* @param Len: Number of data to be sent (in bytes)
|
|
||||||
* @retval Result of the opeartion: USBD_OK if all operations are OK else VCP_FAIL
|
|
||||||
*/
|
|
||||||
static uint16_t VCP_DataTx (uint8_t* Buf, uint32_t Len)
|
|
||||||
{
|
|
||||||
uint32_t i = 0;
|
|
||||||
|
|
||||||
for(i=0; i<Len; i++)
|
|
||||||
{
|
|
||||||
|
|
||||||
if (linecoding.datatype == 7)
|
|
||||||
{
|
|
||||||
APP_Rx_Buffer[APP_Rx_ptr_in] = Buf[i] & 0x7F;
|
|
||||||
}
|
|
||||||
else if (linecoding.datatype == 8)
|
|
||||||
{
|
|
||||||
APP_Rx_Buffer[APP_Rx_ptr_in] = Buf[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
APP_Rx_ptr_in++;
|
|
||||||
|
|
||||||
/* To avoid buffer overflow */
|
|
||||||
if(APP_Rx_ptr_in == APP_RX_DATA_SIZE)
|
|
||||||
{
|
|
||||||
APP_Rx_ptr_in = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
extern void data_in(unsigned char *buffer, unsigned int size);
|
|
||||||
/**
|
|
||||||
* @brief VCP_DataRx
|
|
||||||
* Data received over USB OUT endpoint are sent over CDC interface
|
|
||||||
* through this function.
|
|
||||||
*
|
|
||||||
* @note
|
|
||||||
* This function will block any OUT packet reception on USB endpoint
|
|
||||||
* untill exiting this function. If you exit this function before transfer
|
|
||||||
* is complete on CDC interface (ie. using DMA controller) it will result
|
|
||||||
* in receiving more data while previous ones are still not sent.
|
|
||||||
*
|
|
||||||
* @param Buf: Buffer of data to be received
|
|
||||||
* @param Len: Number of data received (in bytes)
|
|
||||||
* @retval Result of the opeartion: USBD_OK if all operations are OK else VCP_FAIL
|
|
||||||
*/
|
|
||||||
static uint16_t VCP_DataRx (uint8_t* Buf, uint32_t Len)
|
|
||||||
{
|
|
||||||
data_in(Buf, Len);
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief VCP_COMConfig
|
|
||||||
* Configure the COM Port with default values or values received from host.
|
|
||||||
* @param Conf: can be DEFAULT_CONFIG to set the default configuration or OTHER_CONFIG
|
|
||||||
* to set a configuration received from the host.
|
|
||||||
* @retval None.
|
|
||||||
*/
|
|
||||||
static uint16_t VCP_COMConfig(uint8_t Conf)
|
|
||||||
{
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint16_t USB_VCOM_Send(char* buf, uint32_t len)
|
|
||||||
{
|
|
||||||
if(u8PortReady == 1)
|
|
||||||
{
|
|
||||||
return VCP_DataTx((uint8_t*)buf, len);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint16_t USB_VCOM_Receive(char* buf, uint32_t len)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
@ -1,59 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_cdc_vcp.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief Header for usbd_cdc_vcp.c file.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __USBD_CDC_VCP_H
|
|
||||||
#define __USBD_CDC_VCP_H
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include "stm32f4xx.h"
|
|
||||||
#include "usbd_cdc_core.h"
|
|
||||||
#include "usbd_conf.h"
|
|
||||||
|
|
||||||
|
|
||||||
/* Exported typef ------------------------------------------------------------*/
|
|
||||||
/* The following structures groups all needed parameters to be configured for the
|
|
||||||
ComPort. These parameters can modified on the fly by the host through CDC class
|
|
||||||
command class requests. */
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
uint32_t bitrate;
|
|
||||||
uint8_t format;
|
|
||||||
uint8_t paritytype;
|
|
||||||
uint8_t datatype;
|
|
||||||
}LINE_CODING;
|
|
||||||
|
|
||||||
/* Exported constants --------------------------------------------------------*/
|
|
||||||
/* The following define is used to route the USART IRQ handler to be used.
|
|
||||||
The IRQ handler function is implemented in the usbd_cdc_vcp.c file. */
|
|
||||||
|
|
||||||
|
|
||||||
#define DEFAULT_CONFIG 0
|
|
||||||
#define OTHER_CONFIG 1
|
|
||||||
|
|
||||||
/* Exported macro ------------------------------------------------------------*/
|
|
||||||
/* Exported functions ------------------------------------------------------- */
|
|
||||||
uint16_t USB_VCOM_Send(char* buf, uint32_t len);
|
|
||||||
|
|
||||||
#endif /* __USBD_CDC_VCP_H */
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
@ -1,88 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_conf.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief USB Device configuration file
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __USBD_CONF__H__
|
|
||||||
#define __USBD_CONF__H__
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/** @defgroup USB_CONF_Exported_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
#define USBD_CFG_MAX_NUM 1
|
|
||||||
#define USBD_ITF_MAX_NUM 1
|
|
||||||
#define USB_MAX_STR_DESC_SIZ 50
|
|
||||||
|
|
||||||
/** @defgroup USB_VCP_Class_Layer_Parameter
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
#define CDC_IN_EP 0x81 /* EP1 for data IN */
|
|
||||||
#define CDC_OUT_EP 0x01 /* EP1 for data OUT */
|
|
||||||
#define CDC_CMD_EP 0x82 /* EP2 for CDC commands */
|
|
||||||
|
|
||||||
/* CDC Endpoints parameters: you can fine tune these values depending on the needed baudrates and performance. */
|
|
||||||
|
|
||||||
#define CDC_DATA_MAX_PACKET_SIZE 64 /* Endpoint IN & OUT Packet size */
|
|
||||||
#define CDC_CMD_PACKET_SZE 8 /* Control Endpoint Packet size */
|
|
||||||
|
|
||||||
#define CDC_IN_FRAME_INTERVAL 5 /* Number of frames between IN transfers */
|
|
||||||
#define APP_RX_DATA_SIZE 2048 /* Total size of IN buffer:
|
|
||||||
APP_RX_DATA_SIZE*8/MAX_BAUDARATE*1000 should be > CDC_IN_FRAME_INTERVAL */
|
|
||||||
#define APP_FOPS VCP_fops
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_CONF_Exported_Types
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_CONF_Exported_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_CONF_Exported_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_CONF_Exported_FunctionsPrototype
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#endif //__USBD_CONF__H__
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
||||||
|
|
@ -1,303 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_desc.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief This file provides the USBD descriptors and string formating method.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_core.h"
|
|
||||||
#include "usbd_desc.h"
|
|
||||||
#include "usbd_req.h"
|
|
||||||
#include "usbd_conf.h"
|
|
||||||
#include "usb_regs.h"
|
|
||||||
|
|
||||||
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_DESC
|
|
||||||
* @brief USBD descriptors module
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_DESC_Private_TypesDefinitions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_DESC_Private_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
#define USBD_VID 0x0483
|
|
||||||
|
|
||||||
#define USBD_PID 0x5740
|
|
||||||
|
|
||||||
/** @defgroup USB_String_Descriptors
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
#define USBD_LANGID_STRING 0x409
|
|
||||||
#define USBD_MANUFACTURER_STRING "NoizeTronics"
|
|
||||||
|
|
||||||
#define USBD_PRODUCT_HS_STRING "cm4_discovery vcp in hs mode"
|
|
||||||
#define USBD_SERIALNUMBER_HS_STRING "00000000050B"
|
|
||||||
|
|
||||||
#define USBD_PRODUCT_FS_STRING "cm4_discovery vcp in fs Mode"
|
|
||||||
#define USBD_SERIALNUMBER_FS_STRING "00000000050C"
|
|
||||||
|
|
||||||
#define USBD_CONFIGURATION_HS_STRING "VCP Config"
|
|
||||||
#define USBD_INTERFACE_HS_STRING "VCP Interface"
|
|
||||||
|
|
||||||
#define USBD_CONFIGURATION_FS_STRING "VCP Config"
|
|
||||||
#define USBD_INTERFACE_FS_STRING "VCP Interface"
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_DESC_Private_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_DESC_Private_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
USBD_DEVICE USR_desc =
|
|
||||||
{
|
|
||||||
USBD_USR_DeviceDescriptor,
|
|
||||||
USBD_USR_LangIDStrDescriptor,
|
|
||||||
USBD_USR_ManufacturerStrDescriptor,
|
|
||||||
USBD_USR_ProductStrDescriptor,
|
|
||||||
USBD_USR_SerialStrDescriptor,
|
|
||||||
USBD_USR_ConfigStrDescriptor,
|
|
||||||
USBD_USR_InterfaceStrDescriptor,
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/* USB Standard Device Descriptor */
|
|
||||||
__ALIGN_BEGIN uint8_t USBD_DeviceDesc[USB_SIZ_DEVICE_DESC] __ALIGN_END =
|
|
||||||
{
|
|
||||||
0x12, /*bLength */
|
|
||||||
USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/
|
|
||||||
0x00, /*bcdUSB */
|
|
||||||
0x02,
|
|
||||||
0x00, /*bDeviceClass*/
|
|
||||||
0x00, /*bDeviceSubClass*/
|
|
||||||
0x00, /*bDeviceProtocol*/
|
|
||||||
USB_OTG_MAX_EP0_SIZE, /*bMaxPacketSize*/
|
|
||||||
LOBYTE(USBD_VID), /*idVendor*/
|
|
||||||
HIBYTE(USBD_VID), /*idVendor*/
|
|
||||||
LOBYTE(USBD_PID), /*idVendor*/
|
|
||||||
HIBYTE(USBD_PID), /*idVendor*/
|
|
||||||
0x00, /*bcdDevice rel. 2.00*/
|
|
||||||
0x02,
|
|
||||||
USBD_IDX_MFC_STR, /*Index of manufacturer string*/
|
|
||||||
USBD_IDX_PRODUCT_STR, /*Index of product string*/
|
|
||||||
USBD_IDX_SERIAL_STR, /*Index of serial number string*/
|
|
||||||
USBD_CFG_MAX_NUM /*bNumConfigurations*/
|
|
||||||
} ; /* USB_DeviceDescriptor */
|
|
||||||
|
|
||||||
/* USB Standard Device Descriptor */
|
|
||||||
__ALIGN_BEGIN uint8_t USBD_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END =
|
|
||||||
{
|
|
||||||
USB_LEN_DEV_QUALIFIER_DESC,
|
|
||||||
USB_DESC_TYPE_DEVICE_QUALIFIER,
|
|
||||||
0x00,
|
|
||||||
0x02,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x40,
|
|
||||||
0x01,
|
|
||||||
0x00,
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/* USB Standard Device Descriptor */
|
|
||||||
__ALIGN_BEGIN uint8_t USBD_LangIDDesc[USB_SIZ_STRING_LANGID] __ALIGN_END =
|
|
||||||
{
|
|
||||||
USB_SIZ_STRING_LANGID,
|
|
||||||
USB_DESC_TYPE_STRING,
|
|
||||||
LOBYTE(USBD_LANGID_STRING),
|
|
||||||
HIBYTE(USBD_LANGID_STRING),
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_DESC_Private_FunctionPrototypes
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_DESC_Private_Functions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_USR_DeviceDescriptor
|
|
||||||
* return the device descriptor
|
|
||||||
* @param speed : current device speed
|
|
||||||
* @param length : pointer to data length variable
|
|
||||||
* @retval pointer to descriptor buffer
|
|
||||||
*/
|
|
||||||
uint8_t * USBD_USR_DeviceDescriptor( uint8_t speed , uint16_t *length)
|
|
||||||
{
|
|
||||||
*length = sizeof(USBD_DeviceDesc);
|
|
||||||
return USBD_DeviceDesc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_USR_LangIDStrDescriptor
|
|
||||||
* return the LangID string descriptor
|
|
||||||
* @param speed : current device speed
|
|
||||||
* @param length : pointer to data length variable
|
|
||||||
* @retval pointer to descriptor buffer
|
|
||||||
*/
|
|
||||||
uint8_t * USBD_USR_LangIDStrDescriptor( uint8_t speed , uint16_t *length)
|
|
||||||
{
|
|
||||||
*length = sizeof(USBD_LangIDDesc);
|
|
||||||
return USBD_LangIDDesc;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_USR_ProductStrDescriptor
|
|
||||||
* return the product string descriptor
|
|
||||||
* @param speed : current device speed
|
|
||||||
* @param length : pointer to data length variable
|
|
||||||
* @retval pointer to descriptor buffer
|
|
||||||
*/
|
|
||||||
uint8_t * USBD_USR_ProductStrDescriptor( uint8_t speed , uint16_t *length)
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
if(speed == 0)
|
|
||||||
{
|
|
||||||
USBD_GetString (USBD_PRODUCT_HS_STRING, USBD_StrDesc, length);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
USBD_GetString (USBD_PRODUCT_FS_STRING, USBD_StrDesc, length);
|
|
||||||
}
|
|
||||||
return USBD_StrDesc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_USR_ManufacturerStrDescriptor
|
|
||||||
* return the manufacturer string descriptor
|
|
||||||
* @param speed : current device speed
|
|
||||||
* @param length : pointer to data length variable
|
|
||||||
* @retval pointer to descriptor buffer
|
|
||||||
*/
|
|
||||||
uint8_t * USBD_USR_ManufacturerStrDescriptor( uint8_t speed , uint16_t *length)
|
|
||||||
{
|
|
||||||
USBD_GetString (USBD_MANUFACTURER_STRING, USBD_StrDesc, length);
|
|
||||||
return USBD_StrDesc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_USR_SerialStrDescriptor
|
|
||||||
* return the serial number string descriptor
|
|
||||||
* @param speed : current device speed
|
|
||||||
* @param length : pointer to data length variable
|
|
||||||
* @retval pointer to descriptor buffer
|
|
||||||
*/
|
|
||||||
uint8_t * USBD_USR_SerialStrDescriptor( uint8_t speed , uint16_t *length)
|
|
||||||
{
|
|
||||||
if(speed == USB_OTG_SPEED_HIGH)
|
|
||||||
{
|
|
||||||
USBD_GetString (USBD_SERIALNUMBER_HS_STRING, USBD_StrDesc, length);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
USBD_GetString (USBD_SERIALNUMBER_FS_STRING, USBD_StrDesc, length);
|
|
||||||
}
|
|
||||||
return USBD_StrDesc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_USR_ConfigStrDescriptor
|
|
||||||
* return the configuration string descriptor
|
|
||||||
* @param speed : current device speed
|
|
||||||
* @param length : pointer to data length variable
|
|
||||||
* @retval pointer to descriptor buffer
|
|
||||||
*/
|
|
||||||
uint8_t * USBD_USR_ConfigStrDescriptor( uint8_t speed , uint16_t *length)
|
|
||||||
{
|
|
||||||
if(speed == USB_OTG_SPEED_HIGH)
|
|
||||||
{
|
|
||||||
USBD_GetString (USBD_CONFIGURATION_HS_STRING, USBD_StrDesc, length);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
USBD_GetString (USBD_CONFIGURATION_FS_STRING, USBD_StrDesc, length);
|
|
||||||
}
|
|
||||||
return USBD_StrDesc;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_USR_InterfaceStrDescriptor
|
|
||||||
* return the interface string descriptor
|
|
||||||
* @param speed : current device speed
|
|
||||||
* @param length : pointer to data length variable
|
|
||||||
* @retval pointer to descriptor buffer
|
|
||||||
*/
|
|
||||||
uint8_t * USBD_USR_InterfaceStrDescriptor( uint8_t speed , uint16_t *length)
|
|
||||||
{
|
|
||||||
if(speed == 0)
|
|
||||||
{
|
|
||||||
USBD_GetString (USBD_INTERFACE_HS_STRING, USBD_StrDesc, length);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
USBD_GetString (USBD_INTERFACE_FS_STRING, USBD_StrDesc, length);
|
|
||||||
}
|
|
||||||
return USBD_StrDesc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
||||||
|
|
@ -1,114 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_desc.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief header file for the usbd_desc.c file
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef __USB_DESC_H
|
|
||||||
#define __USB_DESC_H
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_def.h"
|
|
||||||
|
|
||||||
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_DESC
|
|
||||||
* @brief general defines for the usb device library file
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_DESC_Exported_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
#define USB_DEVICE_DESCRIPTOR_TYPE 0x01
|
|
||||||
#define USB_CONFIGURATION_DESCRIPTOR_TYPE 0x02
|
|
||||||
#define USB_STRING_DESCRIPTOR_TYPE 0x03
|
|
||||||
#define USB_INTERFACE_DESCRIPTOR_TYPE 0x04
|
|
||||||
#define USB_ENDPOINT_DESCRIPTOR_TYPE 0x05
|
|
||||||
#define USB_SIZ_DEVICE_DESC 18
|
|
||||||
#define USB_SIZ_STRING_LANGID 4
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_DESC_Exported_TypesDefinitions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_DESC_Exported_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_DESC_Exported_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
extern uint8_t USBD_DeviceDesc [USB_SIZ_DEVICE_DESC];
|
|
||||||
extern uint8_t USBD_StrDesc[USB_MAX_STR_DESC_SIZ];
|
|
||||||
extern uint8_t USBD_OtherSpeedCfgDesc[USB_LEN_CFG_DESC];
|
|
||||||
extern uint8_t USBD_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC];
|
|
||||||
extern uint8_t USBD_LangIDDesc[USB_SIZ_STRING_LANGID];
|
|
||||||
extern USBD_DEVICE USR_desc;
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_DESC_Exported_FunctionsPrototype
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
uint8_t * USBD_USR_DeviceDescriptor( uint8_t speed , uint16_t *length);
|
|
||||||
uint8_t * USBD_USR_LangIDStrDescriptor( uint8_t speed , uint16_t *length);
|
|
||||||
uint8_t * USBD_USR_ManufacturerStrDescriptor ( uint8_t speed , uint16_t *length);
|
|
||||||
uint8_t * USBD_USR_ProductStrDescriptor ( uint8_t speed , uint16_t *length);
|
|
||||||
uint8_t * USBD_USR_SerialStrDescriptor( uint8_t speed , uint16_t *length);
|
|
||||||
uint8_t * USBD_USR_ConfigStrDescriptor( uint8_t speed , uint16_t *length);
|
|
||||||
uint8_t * USBD_USR_InterfaceStrDescriptor( uint8_t speed , uint16_t *length);
|
|
||||||
|
|
||||||
#ifdef USB_SUPPORT_USER_STRING_DESC
|
|
||||||
uint8_t * USBD_USR_USRStringDesc (uint8_t speed, uint8_t idx , uint16_t *length);
|
|
||||||
#endif /* USB_SUPPORT_USER_STRING_DESC */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#endif /* __USBD_DESC_H */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
@ -1,160 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_usr.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief This file includes the user application layer
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_usr.h"
|
|
||||||
#include "usbd_ioreq.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_USR
|
|
||||||
* @brief This file includes the user application layer
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_USR_Private_TypesDefinitions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_USR_Private_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_USR_Private_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_USR_Private_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
USBD_Usr_cb_TypeDef USR_cb =
|
|
||||||
{
|
|
||||||
USBD_USR_Init,
|
|
||||||
USBD_USR_DeviceReset,
|
|
||||||
USBD_USR_DeviceConfigured,
|
|
||||||
USBD_USR_DeviceSuspended,
|
|
||||||
USBD_USR_DeviceResumed,
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_USR_Private_Constants
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_USR_Private_FunctionPrototypes
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_USR_Private_Functions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_USR_Init
|
|
||||||
* Displays the message on LCD for host lib initialization
|
|
||||||
* @param None
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void USBD_USR_Init(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_USR_DeviceReset
|
|
||||||
* Displays the message on LCD on device Reset Event
|
|
||||||
* @param speed : device speed
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void USBD_USR_DeviceReset(uint8_t speed )
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_USR_DeviceConfigured
|
|
||||||
* Displays the message on LCD on device configuration Event
|
|
||||||
* @param None
|
|
||||||
* @retval Staus
|
|
||||||
*/
|
|
||||||
void USBD_USR_DeviceConfigured (void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_USR_DeviceSuspended
|
|
||||||
* Displays the message on LCD on device suspend Event
|
|
||||||
* @param None
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void USBD_USR_DeviceSuspended(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_USR_DeviceResumed
|
|
||||||
* Displays the message on LCD on device resume Event
|
|
||||||
* @param None
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void USBD_USR_DeviceResumed(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
@ -1,3 +0,0 @@
|
|||||||
SUB_FOLDER += firmware/arch/stm32f4xx/driver/usb/vcp
|
|
||||||
INCLUDES += firmware/arch/stm32f4xx/driver/usb/vcp
|
|
||||||
#DOC_SRC += firmware/arch/stm32f4xx/driver/usb/vcp
|
|
@ -1,93 +0,0 @@
|
|||||||
/*
|
|
||||||
* drv_usb_vport.c
|
|
||||||
*
|
|
||||||
* Created on: Feb 2, 2012
|
|
||||||
* Author: tkl
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "usb_vport.h"
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
struct {
|
|
||||||
const void *callback;
|
|
||||||
const void *parameter;
|
|
||||||
char *buffer;
|
|
||||||
unsigned int size;
|
|
||||||
}usb_vport_obj;
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
typedef void* (*stm32_usb_vport_cb_t)(const void*);
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
int stm32_usb_vport_init(const stm32_usb_vport_t *this) {
|
|
||||||
usb_vport_obj.callback = NULL;
|
|
||||||
usb_vport_obj.parameter = NULL;
|
|
||||||
usb_vport_obj.buffer = NULL;
|
|
||||||
usb_vport_obj.size = 0;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
int stm32_usb_vport_open(const void *this) {
|
|
||||||
// USBD_Init(&USB_OTG_dev, USB_OTG_FS_CORE_ID, &USR_desc, &USBD_CDC_cb, &USR_cb);
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
int stm32_usb_vport_close(const void *this) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
int stm32_usb_vport_read(const void *this, char *buffer, int size) {
|
|
||||||
int ret = -1;
|
|
||||||
if(size >= usb_vport_obj.size) {
|
|
||||||
// no rest
|
|
||||||
memcpy(buffer, usb_vport_obj.buffer, usb_vport_obj.size);
|
|
||||||
usb_vport_obj.buffer = NULL;
|
|
||||||
ret = usb_vport_obj.size;
|
|
||||||
usb_vport_obj.size = 0;
|
|
||||||
}
|
|
||||||
else if(size < usb_vport_obj.size) {
|
|
||||||
memcpy(buffer, usb_vport_obj.buffer, size);
|
|
||||||
usb_vport_obj.buffer += size;
|
|
||||||
usb_vport_obj.size -= size;
|
|
||||||
ret = size;
|
|
||||||
/*
|
|
||||||
if(NULL != usb_vport_obj.callback) {
|
|
||||||
stm32_usb_vport_cb_t cb = usb_vport_obj.callback;
|
|
||||||
cb(usb_vport_obj.parameter);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
int stm32_usb_vport_write(const void *this, const char *buffer, int size) {
|
|
||||||
return USB_VCOM_Send((char *)buffer, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
int stm32_usb_vport_set_cb(const void *this, const void *callback, const void *param) {
|
|
||||||
if(NULL == callback) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
usb_vport_obj.callback = callback;
|
|
||||||
usb_vport_obj.parameter = param;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
extern void data_in(unsigned char *buffer, unsigned int size) {
|
|
||||||
if(NULL != usb_vport_obj.callback) {
|
|
||||||
stm32_usb_vport_cb_t cb = usb_vport_obj.callback;
|
|
||||||
usb_vport_obj.buffer = (char *)buffer;
|
|
||||||
usb_vport_obj.size = size;
|
|
||||||
cb(usb_vport_obj.parameter);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,54 +0,0 @@
|
|||||||
/*
|
|
||||||
* drv_usb_vport_interface.h
|
|
||||||
*
|
|
||||||
* Created on: Feb 2, 2012
|
|
||||||
* Author: tkl
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef DRV_USB_VPORT_INTERFACE_H_
|
|
||||||
#define DRV_USB_VPORT_INTERFACE_H_
|
|
||||||
|
|
||||||
#include "uart.h"
|
|
||||||
|
|
||||||
#include "usbd_cdc_core.h"
|
|
||||||
#include "usbd_usr.h"
|
|
||||||
#include "usbd_desc.h"
|
|
||||||
#include "usbd_cdc_vcp.h"
|
|
||||||
|
|
||||||
//! \brief Usb Device for stdout, stdin & stderr.
|
|
||||||
__ALIGN_BEGIN USB_OTG_CORE_HANDLE USB_OTG_dev __ALIGN_END ;
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
typedef struct {
|
|
||||||
}stm32_usb_vport_t;
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
int stm32_usb_vport_init(const stm32_usb_vport_t *this);
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
//! \brief open the virual com port device
|
|
||||||
int stm32_usb_vport_open(const void *this);
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
//! \brief close the virual com port device
|
|
||||||
int stm32_usb_vport_close(const void *this);
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
int stm32_usb_vport_read(const void *this, char *buffer, int size);
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
int stm32_usb_vport_write(const void *this, const char *buffer, int size);
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
int stm32_usb_vport_set_cb(const void *this, const void *callback, const void *param);
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
static const struct uart_fp usb_vport_fp = {
|
|
||||||
stm32_usb_vport_open,
|
|
||||||
stm32_usb_vport_close,
|
|
||||||
stm32_usb_vport_read,
|
|
||||||
stm32_usb_vport_write,
|
|
||||||
stm32_usb_vport_set_cb
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* DRV_USB_VPORT_INTERFACE_H_ */
|
|
@ -1,4 +0,0 @@
|
|||||||
CHECK_FOLDER += firmware/arch/stm32f4xx/driver/usb_vport
|
|
||||||
SUB_FOLDER += firmware/arch/stm32f4xx/driver/usb_vport
|
|
||||||
INCLUDES += firmware/arch/stm32f4xx/driver/usb_vport
|
|
||||||
DOC_SRC += firmware/arch/stm32f4xx/driver/usb_vport
|
|
@ -1,158 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_audio_core.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief header file for the usbd_audio_core.c file.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef __USB_AUDIO_CORE_H_
|
|
||||||
#define __USB_AUDIO_CORE_H_
|
|
||||||
|
|
||||||
#include "usbd_ioreq.h"
|
|
||||||
#include "usbd_req.h"
|
|
||||||
#include "usbd_desc.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup usbd_audio
|
|
||||||
* @brief This file is the Header file for USBD_audio.c
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup usbd_audio_Exported_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* AudioFreq * DataSize (2 bytes) * NumChannels (Stereo: 2) */
|
|
||||||
#define AUDIO_OUT_PACKET (uint32_t)(((USBD_AUDIO_FREQ * 2 * 2) /1000))
|
|
||||||
|
|
||||||
/* Number of sub-packets in the audio transfer buffer. You can modify this value but always make sure
|
|
||||||
that it is an even number and higher than 3 */
|
|
||||||
#define OUT_PACKET_NUM 4
|
|
||||||
/* Total size of the audio transfer buffer */
|
|
||||||
#define TOTAL_OUT_BUF_SIZE ((uint32_t)(AUDIO_OUT_PACKET * OUT_PACKET_NUM))
|
|
||||||
|
|
||||||
#define AUDIO_CONFIG_DESC_SIZE 109
|
|
||||||
#define AUDIO_INTERFACE_DESC_SIZE 9
|
|
||||||
#define USB_AUDIO_DESC_SIZ 0x09
|
|
||||||
#define AUDIO_STANDARD_ENDPOINT_DESC_SIZE 0x09
|
|
||||||
#define AUDIO_STREAMING_ENDPOINT_DESC_SIZE 0x07
|
|
||||||
|
|
||||||
#define AUDIO_DESCRIPTOR_TYPE 0x21
|
|
||||||
#define USB_DEVICE_CLASS_AUDIO 0x01
|
|
||||||
#define AUDIO_SUBCLASS_AUDIOCONTROL 0x01
|
|
||||||
#define AUDIO_SUBCLASS_AUDIOSTREAMING 0x02
|
|
||||||
#define AUDIO_PROTOCOL_UNDEFINED 0x00
|
|
||||||
#define AUDIO_STREAMING_GENERAL 0x01
|
|
||||||
#define AUDIO_STREAMING_FORMAT_TYPE 0x02
|
|
||||||
|
|
||||||
/* Audio Descriptor Types */
|
|
||||||
#define AUDIO_INTERFACE_DESCRIPTOR_TYPE 0x24
|
|
||||||
#define AUDIO_ENDPOINT_DESCRIPTOR_TYPE 0x25
|
|
||||||
|
|
||||||
/* Audio Control Interface Descriptor Subtypes */
|
|
||||||
#define AUDIO_CONTROL_HEADER 0x01
|
|
||||||
#define AUDIO_CONTROL_INPUT_TERMINAL 0x02
|
|
||||||
#define AUDIO_CONTROL_OUTPUT_TERMINAL 0x03
|
|
||||||
#define AUDIO_CONTROL_FEATURE_UNIT 0x06
|
|
||||||
|
|
||||||
#define AUDIO_INPUT_TERMINAL_DESC_SIZE 0x0C
|
|
||||||
#define AUDIO_OUTPUT_TERMINAL_DESC_SIZE 0x09
|
|
||||||
#define AUDIO_STREAMING_INTERFACE_DESC_SIZE 0x07
|
|
||||||
|
|
||||||
#define AUDIO_CONTROL_MUTE 0x0001
|
|
||||||
|
|
||||||
#define AUDIO_FORMAT_TYPE_I 0x01
|
|
||||||
#define AUDIO_FORMAT_TYPE_III 0x03
|
|
||||||
|
|
||||||
#define USB_ENDPOINT_TYPE_ISOCHRONOUS 0x01
|
|
||||||
#define AUDIO_ENDPOINT_GENERAL 0x01
|
|
||||||
|
|
||||||
#define AUDIO_REQ_GET_CUR 0x81
|
|
||||||
#define AUDIO_REQ_SET_CUR 0x01
|
|
||||||
|
|
||||||
#define AUDIO_OUT_STREAMING_CTRL 0x02
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_CORE_Exported_TypesDefinitions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
typedef struct _Audio_Fops
|
|
||||||
{
|
|
||||||
uint8_t (*Init) (uint32_t AudioFreq, uint32_t Volume, uint32_t options);
|
|
||||||
uint8_t (*DeInit) (uint32_t options);
|
|
||||||
uint8_t (*AudioCmd) (uint8_t* pbuf, uint32_t size, uint8_t cmd);
|
|
||||||
uint8_t (*VolumeCtl) (uint8_t vol);
|
|
||||||
uint8_t (*MuteCtl) (uint8_t cmd);
|
|
||||||
uint8_t (*PeriodicTC) (uint8_t cmd);
|
|
||||||
uint8_t (*GetState) (void);
|
|
||||||
}AUDIO_FOPS_TypeDef;
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_CORE_Exported_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
#define AUDIO_PACKET_SZE(frq) (uint8_t)(((frq * 2 * 2)/1000) & 0xFF), \
|
|
||||||
(uint8_t)((((frq * 2 * 2)/1000) >> 8) & 0xFF)
|
|
||||||
#define SAMPLE_FREQ(frq) (uint8_t)(frq), (uint8_t)((frq >> 8)), (uint8_t)((frq >> 16))
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_CORE_Exported_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
extern USBD_Class_cb_TypeDef AUDIO_cb;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_CORE_Exported_Functions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#endif // __USB_AUDIO_CORE_H_
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
@ -1,117 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_audio_out_if.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief header file for the usbd_audio_out_if.c file.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef __USB_AUDIO_OUT_IF_H_
|
|
||||||
#define __USB_AUDIO_OUT_IF_H_
|
|
||||||
|
|
||||||
#ifdef STM32F2XX
|
|
||||||
#include "stm322xg_usb_audio_codec.h"
|
|
||||||
#elif defined(STM32F10X_CL)
|
|
||||||
#include "stm3210c_usb_audio_codec.h"
|
|
||||||
#endif /* STM32F2XX */
|
|
||||||
|
|
||||||
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup usbd_audio
|
|
||||||
* @brief This file is the Header file for USBD_audio.c
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup usbd_audio_Exported_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/* Audio Commands enmueration */
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
AUDIO_CMD_PLAY = 1,
|
|
||||||
AUDIO_CMD_PAUSE,
|
|
||||||
AUDIO_CMD_STOP,
|
|
||||||
}AUDIO_CMD_TypeDef;
|
|
||||||
|
|
||||||
/* Mute commands */
|
|
||||||
#define AUDIO_MUTE 0x01
|
|
||||||
#define AUDIO_UNMUTE 0x00
|
|
||||||
|
|
||||||
/* Functions return value */
|
|
||||||
#define AUDIO_OK 0x00
|
|
||||||
#define AUDIO_FAIL 0xFF
|
|
||||||
|
|
||||||
/* Audio Machine States */
|
|
||||||
#define AUDIO_STATE_INACTIVE 0x00
|
|
||||||
#define AUDIO_STATE_ACTIVE 0x01
|
|
||||||
#define AUDIO_STATE_PLAYING 0x02
|
|
||||||
#define AUDIO_STATE_PAUSED 0x03
|
|
||||||
#define AUDIO_STATE_STOPPED 0x04
|
|
||||||
#define AUDIO_STATE_ERROR 0x05
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_CORE_Exported_TypesDefinitions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_CORE_Exported_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_CORE_Exported_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
extern AUDIO_FOPS_TypeDef AUDIO_OUT_fops;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_CORE_Exported_Functions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#endif /* __USB_AUDIO_OUT_IF_H_ */
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
@ -1,665 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_audio_core.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief This file provides the high layer firmware functions to manage the
|
|
||||||
* following functionalities of the USB Audio Class:
|
|
||||||
* - Initialization and Configuration of high and low layer
|
|
||||||
* - Enumeration as Audio Streaming Device
|
|
||||||
* - Audio Streaming data transfer
|
|
||||||
* - AudioControl requests management
|
|
||||||
* - Error management
|
|
||||||
*
|
|
||||||
* @verbatim
|
|
||||||
*
|
|
||||||
* ===================================================================
|
|
||||||
* Audio Class Driver Description
|
|
||||||
* ===================================================================
|
|
||||||
* This driver manages the Audio Class 1.0 following the "USB Device Class Definition for
|
|
||||||
* Audio Devices V1.0 Mar 18, 98".
|
|
||||||
* This driver implements the following aspects of the specification:
|
|
||||||
* - Device descriptor management
|
|
||||||
* - Configuration descriptor management
|
|
||||||
* - Standard AC Interface Descriptor management
|
|
||||||
* - 1 Audio Streaming Interface (with single channel, PCM, Stereo mode)
|
|
||||||
* - 1 Audio Streaming Endpoint
|
|
||||||
* - 1 Audio Terminal Input (1 channel)
|
|
||||||
* - Audio Class-Specific AC Interfaces
|
|
||||||
* - Audio Class-Specific AS Interfaces
|
|
||||||
* - AudioControl Requests: only SET_CUR and GET_CUR requests are supported (for Mute)
|
|
||||||
* - Audio Feature Unit (limited to Mute control)
|
|
||||||
* - Audio Synchronization type: Asynchronous
|
|
||||||
* - Single fixed audio sampling rate (configurable in usbd_conf.h file)
|
|
||||||
*
|
|
||||||
* @note
|
|
||||||
* The Audio Class 1.0 is based on USB Specification 1.0 and thus supports only
|
|
||||||
* Low and Full speed modes and does not allow High Speed transfers.
|
|
||||||
* Please refer to "USB Device Class Definition for Audio Devices V1.0 Mar 18, 98"
|
|
||||||
* for more details.
|
|
||||||
*
|
|
||||||
* These aspects may be enriched or modified for a specific user application.
|
|
||||||
*
|
|
||||||
* This driver doesn't implement the following aspects of the specification
|
|
||||||
* (but it is possible to manage these features with some modifications on this driver):
|
|
||||||
* - AudioControl Endpoint management
|
|
||||||
* - AudioControl requsests other than SET_CUR and GET_CUR
|
|
||||||
* - Abstraction layer for AudioControl requests (only Mute functionality is managed)
|
|
||||||
* - Audio Synchronization type: Adaptive
|
|
||||||
* - Audio Compression modules and interfaces
|
|
||||||
* - MIDI interfaces and modules
|
|
||||||
* - Mixer/Selector/Processing/Extension Units (Feature unit is limited to Mute control)
|
|
||||||
* - Any other application-specific modules
|
|
||||||
* - Multiple and Variable audio sampling rates
|
|
||||||
* - Out Streaming Endpoint/Interface (microphone)
|
|
||||||
*
|
|
||||||
* @endverbatim
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include "usbd_audio_core.h"
|
|
||||||
#include "usbd_audio_out_if.h"
|
|
||||||
|
|
||||||
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup usbd_audio
|
|
||||||
* @brief usbd core module
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup usbd_audio_Private_TypesDefinitions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup usbd_audio_Private_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup usbd_audio_Private_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup usbd_audio_Private_FunctionPrototypes
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*********************************************
|
|
||||||
AUDIO Device library callbacks
|
|
||||||
*********************************************/
|
|
||||||
static uint8_t usbd_audio_Init (void *pdev, uint8_t cfgidx);
|
|
||||||
static uint8_t usbd_audio_DeInit (void *pdev, uint8_t cfgidx);
|
|
||||||
static uint8_t usbd_audio_Setup (void *pdev, USB_SETUP_REQ *req);
|
|
||||||
static uint8_t usbd_audio_EP0_RxReady(void *pdev);
|
|
||||||
static uint8_t usbd_audio_DataIn (void *pdev, uint8_t epnum);
|
|
||||||
static uint8_t usbd_audio_DataOut (void *pdev, uint8_t epnum);
|
|
||||||
static uint8_t usbd_audio_SOF (void *pdev);
|
|
||||||
static uint8_t usbd_audio_OUT_Incplt (void *pdev);
|
|
||||||
|
|
||||||
/*********************************************
|
|
||||||
AUDIO Requests management functions
|
|
||||||
*********************************************/
|
|
||||||
static void AUDIO_Req_GetCurrent(void *pdev, USB_SETUP_REQ *req);
|
|
||||||
static void AUDIO_Req_SetCurrent(void *pdev, USB_SETUP_REQ *req);
|
|
||||||
static uint8_t *USBD_audio_GetCfgDesc (uint8_t speed, uint16_t *length);
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup usbd_audio_Private_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/* Main Buffer for Audio Data Out transfers and its relative pointers */
|
|
||||||
uint8_t IsocOutBuff [TOTAL_OUT_BUF_SIZE * 2];
|
|
||||||
uint8_t* IsocOutWrPtr = IsocOutBuff;
|
|
||||||
uint8_t* IsocOutRdPtr = IsocOutBuff;
|
|
||||||
|
|
||||||
/* Main Buffer for Audio Control Rrequests transfers and its relative variables */
|
|
||||||
uint8_t AudioCtl[64];
|
|
||||||
uint8_t AudioCtlCmd = 0;
|
|
||||||
uint32_t AudioCtlLen = 0;
|
|
||||||
uint8_t AudioCtlUnit = 0;
|
|
||||||
|
|
||||||
static uint32_t PlayFlag = 0;
|
|
||||||
|
|
||||||
static __IO uint32_t usbd_audio_AltSet = 0;
|
|
||||||
static uint8_t usbd_audio_CfgDesc[AUDIO_CONFIG_DESC_SIZE];
|
|
||||||
|
|
||||||
/* AUDIO interface class callbacks structure */
|
|
||||||
USBD_Class_cb_TypeDef AUDIO_cb =
|
|
||||||
{
|
|
||||||
usbd_audio_Init,
|
|
||||||
usbd_audio_DeInit,
|
|
||||||
usbd_audio_Setup,
|
|
||||||
NULL, /* EP0_TxSent */
|
|
||||||
usbd_audio_EP0_RxReady,
|
|
||||||
usbd_audio_DataIn,
|
|
||||||
usbd_audio_DataOut,
|
|
||||||
usbd_audio_SOF,
|
|
||||||
NULL,
|
|
||||||
usbd_audio_OUT_Incplt,
|
|
||||||
USBD_audio_GetCfgDesc,
|
|
||||||
#ifdef USB_OTG_HS_CORE
|
|
||||||
USBD_audio_GetCfgDesc, /* use same config as per FS */
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
/* USB AUDIO device Configuration Descriptor */
|
|
||||||
static uint8_t usbd_audio_CfgDesc[AUDIO_CONFIG_DESC_SIZE] =
|
|
||||||
{
|
|
||||||
/* Configuration 1 */
|
|
||||||
0x09, /* bLength */
|
|
||||||
USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
LOBYTE(AUDIO_CONFIG_DESC_SIZE), /* wTotalLength 109 bytes*/
|
|
||||||
HIBYTE(AUDIO_CONFIG_DESC_SIZE),
|
|
||||||
0x02, /* bNumInterfaces */
|
|
||||||
0x01, /* bConfigurationValue */
|
|
||||||
0x00, /* iConfiguration */
|
|
||||||
0xC0, /* bmAttributes BUS Powred*/
|
|
||||||
0x32, /* bMaxPower = 100 mA*/
|
|
||||||
/* 09 byte*/
|
|
||||||
|
|
||||||
/* USB Speaker Standard interface descriptor */
|
|
||||||
AUDIO_INTERFACE_DESC_SIZE, /* bLength */
|
|
||||||
USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
0x00, /* bInterfaceNumber */
|
|
||||||
0x00, /* bAlternateSetting */
|
|
||||||
0x00, /* bNumEndpoints */
|
|
||||||
USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */
|
|
||||||
AUDIO_SUBCLASS_AUDIOCONTROL, /* bInterfaceSubClass */
|
|
||||||
AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */
|
|
||||||
0x00, /* iInterface */
|
|
||||||
/* 09 byte*/
|
|
||||||
|
|
||||||
/* USB Speaker Class-specific AC Interface Descriptor */
|
|
||||||
AUDIO_INTERFACE_DESC_SIZE, /* bLength */
|
|
||||||
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
AUDIO_CONTROL_HEADER, /* bDescriptorSubtype */
|
|
||||||
0x00, /* 1.00 */ /* bcdADC */
|
|
||||||
0x01,
|
|
||||||
0x27, /* wTotalLength = 39*/
|
|
||||||
0x00,
|
|
||||||
0x01, /* bInCollection */
|
|
||||||
0x01, /* baInterfaceNr */
|
|
||||||
/* 09 byte*/
|
|
||||||
|
|
||||||
/* USB Speaker Input Terminal Descriptor */
|
|
||||||
AUDIO_INPUT_TERMINAL_DESC_SIZE, /* bLength */
|
|
||||||
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
AUDIO_CONTROL_INPUT_TERMINAL, /* bDescriptorSubtype */
|
|
||||||
0x01, /* bTerminalID */
|
|
||||||
0x01, /* wTerminalType AUDIO_TERMINAL_USB_STREAMING 0x0101 */
|
|
||||||
0x01,
|
|
||||||
0x00, /* bAssocTerminal */
|
|
||||||
0x01, /* bNrChannels */
|
|
||||||
0x00, /* wChannelConfig 0x0000 Mono */
|
|
||||||
0x00,
|
|
||||||
0x00, /* iChannelNames */
|
|
||||||
0x00, /* iTerminal */
|
|
||||||
/* 12 byte*/
|
|
||||||
|
|
||||||
/* USB Speaker Audio Feature Unit Descriptor */
|
|
||||||
0x09, /* bLength */
|
|
||||||
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
AUDIO_CONTROL_FEATURE_UNIT, /* bDescriptorSubtype */
|
|
||||||
AUDIO_OUT_STREAMING_CTRL, /* bUnitID */
|
|
||||||
0x01, /* bSourceID */
|
|
||||||
0x01, /* bControlSize */
|
|
||||||
AUDIO_CONTROL_MUTE, /* bmaControls(0) */
|
|
||||||
0x00, /* bmaControls(1) */
|
|
||||||
0x00, /* iTerminal */
|
|
||||||
/* 09 byte*/
|
|
||||||
|
|
||||||
/*USB Speaker Output Terminal Descriptor */
|
|
||||||
0x09, /* bLength */
|
|
||||||
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
AUDIO_CONTROL_OUTPUT_TERMINAL, /* bDescriptorSubtype */
|
|
||||||
0x03, /* bTerminalID */
|
|
||||||
0x01, /* wTerminalType 0x0301*/
|
|
||||||
0x03,
|
|
||||||
0x00, /* bAssocTerminal */
|
|
||||||
0x02, /* bSourceID */
|
|
||||||
0x00, /* iTerminal */
|
|
||||||
/* 09 byte*/
|
|
||||||
|
|
||||||
/* USB Speaker Standard AS Interface Descriptor - Audio Streaming Zero Bandwith */
|
|
||||||
/* Interface 1, Alternate Setting 0 */
|
|
||||||
AUDIO_INTERFACE_DESC_SIZE, /* bLength */
|
|
||||||
USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
0x01, /* bInterfaceNumber */
|
|
||||||
0x00, /* bAlternateSetting */
|
|
||||||
0x00, /* bNumEndpoints */
|
|
||||||
USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */
|
|
||||||
AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */
|
|
||||||
AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */
|
|
||||||
0x00, /* iInterface */
|
|
||||||
/* 09 byte*/
|
|
||||||
|
|
||||||
/* USB Speaker Standard AS Interface Descriptor - Audio Streaming Operational */
|
|
||||||
/* Interface 1, Alternate Setting 1 */
|
|
||||||
AUDIO_INTERFACE_DESC_SIZE, /* bLength */
|
|
||||||
USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
0x01, /* bInterfaceNumber */
|
|
||||||
0x01, /* bAlternateSetting */
|
|
||||||
0x01, /* bNumEndpoints */
|
|
||||||
USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */
|
|
||||||
AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */
|
|
||||||
AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */
|
|
||||||
0x00, /* iInterface */
|
|
||||||
/* 09 byte*/
|
|
||||||
|
|
||||||
/* USB Speaker Audio Streaming Interface Descriptor */
|
|
||||||
AUDIO_STREAMING_INTERFACE_DESC_SIZE, /* bLength */
|
|
||||||
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
AUDIO_STREAMING_GENERAL, /* bDescriptorSubtype */
|
|
||||||
0x01, /* bTerminalLink */
|
|
||||||
0x01, /* bDelay */
|
|
||||||
0x01, /* wFormatTag AUDIO_FORMAT_PCM 0x0001*/
|
|
||||||
0x00,
|
|
||||||
/* 07 byte*/
|
|
||||||
|
|
||||||
/* USB Speaker Audio Type III Format Interface Descriptor */
|
|
||||||
0x0B, /* bLength */
|
|
||||||
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
AUDIO_STREAMING_FORMAT_TYPE, /* bDescriptorSubtype */
|
|
||||||
AUDIO_FORMAT_TYPE_III, /* bFormatType */
|
|
||||||
0x02, /* bNrChannels */
|
|
||||||
0x02, /* bSubFrameSize : 2 Bytes per frame (16bits) */
|
|
||||||
16, /* bBitResolution (16-bits per sample) */
|
|
||||||
0x01, /* bSamFreqType only one frequency supported */
|
|
||||||
SAMPLE_FREQ(USBD_AUDIO_FREQ), /* Audio sampling frequency coded on 3 bytes */
|
|
||||||
/* 11 byte*/
|
|
||||||
|
|
||||||
/* Endpoint 1 - Standard Descriptor */
|
|
||||||
AUDIO_STANDARD_ENDPOINT_DESC_SIZE, /* bLength */
|
|
||||||
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
AUDIO_OUT_EP, /* bEndpointAddress 1 out endpoint*/
|
|
||||||
USB_ENDPOINT_TYPE_ISOCHRONOUS, /* bmAttributes */
|
|
||||||
AUDIO_PACKET_SZE(USBD_AUDIO_FREQ), /* wMaxPacketSize in Bytes (Freq(Samples)*2(Stereo)*2(HalfWord)) */
|
|
||||||
0x01, /* bInterval */
|
|
||||||
0x00, /* bRefresh */
|
|
||||||
0x00, /* bSynchAddress */
|
|
||||||
/* 09 byte*/
|
|
||||||
|
|
||||||
/* Endpoint - Audio Streaming Descriptor*/
|
|
||||||
AUDIO_STREAMING_ENDPOINT_DESC_SIZE, /* bLength */
|
|
||||||
AUDIO_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
AUDIO_ENDPOINT_GENERAL, /* bDescriptor */
|
|
||||||
0x00, /* bmAttributes */
|
|
||||||
0x00, /* bLockDelayUnits */
|
|
||||||
0x00, /* wLockDelay */
|
|
||||||
0x00,
|
|
||||||
/* 07 byte*/
|
|
||||||
} ;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup usbd_audio_Private_Functions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief usbd_audio_Init
|
|
||||||
* Initilaizes the AUDIO interface.
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param cfgidx: Configuration index
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint8_t usbd_audio_Init (void *pdev,
|
|
||||||
uint8_t cfgidx)
|
|
||||||
{
|
|
||||||
/* Open EP OUT */
|
|
||||||
DCD_EP_Open(pdev,
|
|
||||||
AUDIO_OUT_EP,
|
|
||||||
AUDIO_OUT_PACKET,
|
|
||||||
USB_OTG_EP_ISOC);
|
|
||||||
|
|
||||||
/* Initialize the Audio output Hardware layer */
|
|
||||||
if (AUDIO_OUT_fops.Init(USBD_AUDIO_FREQ, DEFAULT_VOLUME, 0) != USBD_OK)
|
|
||||||
{
|
|
||||||
return USBD_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Prepare Out endpoint to receive audio data */
|
|
||||||
DCD_EP_PrepareRx(pdev,
|
|
||||||
AUDIO_OUT_EP,
|
|
||||||
(uint8_t*)IsocOutBuff,
|
|
||||||
AUDIO_OUT_PACKET);
|
|
||||||
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief usbd_audio_Init
|
|
||||||
* DeInitializes the AUDIO layer.
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param cfgidx: Configuration index
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint8_t usbd_audio_DeInit (void *pdev,
|
|
||||||
uint8_t cfgidx)
|
|
||||||
{
|
|
||||||
DCD_EP_Close (pdev , AUDIO_OUT_EP);
|
|
||||||
|
|
||||||
/* DeInitialize the Audio output Hardware layer */
|
|
||||||
if (AUDIO_OUT_fops.DeInit(0) != USBD_OK)
|
|
||||||
{
|
|
||||||
return USBD_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief usbd_audio_Setup
|
|
||||||
* Handles the Audio control request parsing.
|
|
||||||
* @param pdev: instance
|
|
||||||
* @param req: usb requests
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint8_t usbd_audio_Setup (void *pdev,
|
|
||||||
USB_SETUP_REQ *req)
|
|
||||||
{
|
|
||||||
uint16_t len;
|
|
||||||
uint8_t *pbuf;
|
|
||||||
|
|
||||||
switch (req->bmRequest & USB_REQ_TYPE_MASK)
|
|
||||||
{
|
|
||||||
/* AUDIO Class Requests -------------------------------*/
|
|
||||||
case USB_REQ_TYPE_CLASS :
|
|
||||||
switch (req->bRequest)
|
|
||||||
{
|
|
||||||
case AUDIO_REQ_GET_CUR:
|
|
||||||
AUDIO_Req_GetCurrent(pdev, req);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AUDIO_REQ_SET_CUR:
|
|
||||||
AUDIO_Req_SetCurrent(pdev, req);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
USBD_CtlError (pdev, req);
|
|
||||||
return USBD_FAIL;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* Standard Requests -------------------------------*/
|
|
||||||
case USB_REQ_TYPE_STANDARD:
|
|
||||||
switch (req->bRequest)
|
|
||||||
{
|
|
||||||
case USB_REQ_GET_DESCRIPTOR:
|
|
||||||
if( (req->wValue >> 8) == AUDIO_DESCRIPTOR_TYPE)
|
|
||||||
{
|
|
||||||
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
|
||||||
pbuf = usbd_audio_Desc;
|
|
||||||
#else
|
|
||||||
pbuf = usbd_audio_CfgDesc + 18;
|
|
||||||
#endif
|
|
||||||
len = MIN(USB_AUDIO_DESC_SIZ , req->wLength);
|
|
||||||
}
|
|
||||||
|
|
||||||
USBD_CtlSendData (pdev,
|
|
||||||
pbuf,
|
|
||||||
len);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case USB_REQ_GET_INTERFACE :
|
|
||||||
USBD_CtlSendData (pdev,
|
|
||||||
(uint8_t *)&usbd_audio_AltSet,
|
|
||||||
1);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case USB_REQ_SET_INTERFACE :
|
|
||||||
if ((uint8_t)(req->wValue) < AUDIO_TOTAL_IF_NUM)
|
|
||||||
{
|
|
||||||
usbd_audio_AltSet = (uint8_t)(req->wValue);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Call the error management function (command will be nacked */
|
|
||||||
USBD_CtlError (pdev, req);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief usbd_audio_EP0_RxReady
|
|
||||||
* Handles audio control requests data.
|
|
||||||
* @param pdev: device device instance
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint8_t usbd_audio_EP0_RxReady (void *pdev)
|
|
||||||
{
|
|
||||||
/* Check if an AudioControl request has been issued */
|
|
||||||
if (AudioCtlCmd == AUDIO_REQ_SET_CUR)
|
|
||||||
{/* In this driver, to simplify code, only SET_CUR request is managed */
|
|
||||||
/* Check for which addressed unit the AudioControl request has been issued */
|
|
||||||
if (AudioCtlUnit == AUDIO_OUT_STREAMING_CTRL)
|
|
||||||
{/* In this driver, to simplify code, only one unit is manage */
|
|
||||||
/* Call the audio interface mute function */
|
|
||||||
AUDIO_OUT_fops.MuteCtl(AudioCtl[0]);
|
|
||||||
|
|
||||||
/* Reset the AudioCtlCmd variable to prevent re-entering this function */
|
|
||||||
AudioCtlCmd = 0;
|
|
||||||
AudioCtlLen = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief usbd_audio_DataIn
|
|
||||||
* Handles the audio IN data stage.
|
|
||||||
* @param pdev: instance
|
|
||||||
* @param epnum: endpoint number
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint8_t usbd_audio_DataIn (void *pdev, uint8_t epnum)
|
|
||||||
{
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief usbd_audio_DataOut
|
|
||||||
* Handles the Audio Out data stage.
|
|
||||||
* @param pdev: instance
|
|
||||||
* @param epnum: endpoint number
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint8_t usbd_audio_DataOut (void *pdev, uint8_t epnum)
|
|
||||||
{
|
|
||||||
if (epnum == AUDIO_OUT_EP)
|
|
||||||
{
|
|
||||||
/* Increment the Buffer pointer or roll it back when all buffers are full */
|
|
||||||
if (IsocOutWrPtr >= (IsocOutBuff + (AUDIO_OUT_PACKET * OUT_PACKET_NUM)))
|
|
||||||
{/* All buffers are full: roll back */
|
|
||||||
IsocOutWrPtr = IsocOutBuff;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{/* Increment the buffer pointer */
|
|
||||||
IsocOutWrPtr += AUDIO_OUT_PACKET;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Toggle the frame index */
|
|
||||||
((USB_OTG_CORE_HANDLE*)pdev)->dev.out_ep[epnum].even_odd_frame =
|
|
||||||
(((USB_OTG_CORE_HANDLE*)pdev)->dev.out_ep[epnum].even_odd_frame)? 0:1;
|
|
||||||
|
|
||||||
/* Prepare Out endpoint to receive next audio packet */
|
|
||||||
DCD_EP_PrepareRx(pdev,
|
|
||||||
AUDIO_OUT_EP,
|
|
||||||
(uint8_t*)(IsocOutWrPtr),
|
|
||||||
AUDIO_OUT_PACKET);
|
|
||||||
|
|
||||||
/* Trigger the start of streaming only when half buffer is full */
|
|
||||||
if ((PlayFlag == 0) && (IsocOutWrPtr >= (IsocOutBuff + ((AUDIO_OUT_PACKET * OUT_PACKET_NUM) / 2))))
|
|
||||||
{
|
|
||||||
/* Enable start of Streaming */
|
|
||||||
PlayFlag = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief usbd_audio_SOF
|
|
||||||
* Handles the SOF event (data buffer update and synchronization).
|
|
||||||
* @param pdev: instance
|
|
||||||
* @param epnum: endpoint number
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint8_t usbd_audio_SOF (void *pdev)
|
|
||||||
{
|
|
||||||
/* Check if there are available data in stream buffer.
|
|
||||||
In this function, a single variable (PlayFlag) is used to avoid software delays.
|
|
||||||
The play operation must be executed as soon as possible after the SOF detection. */
|
|
||||||
if (PlayFlag)
|
|
||||||
{
|
|
||||||
/* Start playing received packet */
|
|
||||||
AUDIO_OUT_fops.AudioCmd((uint8_t*)(IsocOutRdPtr), /* Samples buffer pointer */
|
|
||||||
AUDIO_OUT_PACKET, /* Number of samples in Bytes */
|
|
||||||
AUDIO_CMD_PLAY); /* Command to be processed */
|
|
||||||
|
|
||||||
/* Increment the Buffer pointer or roll it back when all buffers all full */
|
|
||||||
if (IsocOutRdPtr >= (IsocOutBuff + (AUDIO_OUT_PACKET * OUT_PACKET_NUM)))
|
|
||||||
{/* Roll back to the start of buffer */
|
|
||||||
IsocOutRdPtr = IsocOutBuff;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{/* Increment to the next sub-buffer */
|
|
||||||
IsocOutRdPtr += AUDIO_OUT_PACKET;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If all available buffers have been consumed, stop playing */
|
|
||||||
if (IsocOutRdPtr == IsocOutWrPtr)
|
|
||||||
{
|
|
||||||
/* Pause the audio stream */
|
|
||||||
AUDIO_OUT_fops.AudioCmd((uint8_t*)(IsocOutBuff), /* Samples buffer pointer */
|
|
||||||
AUDIO_OUT_PACKET, /* Number of samples in Bytes */
|
|
||||||
AUDIO_CMD_PAUSE); /* Command to be processed */
|
|
||||||
|
|
||||||
/* Stop entering play loop */
|
|
||||||
PlayFlag = 0;
|
|
||||||
|
|
||||||
/* Reset buffer pointers */
|
|
||||||
IsocOutRdPtr = IsocOutBuff;
|
|
||||||
IsocOutWrPtr = IsocOutBuff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief usbd_audio_OUT_Incplt
|
|
||||||
* Handles the iso out incomplete event.
|
|
||||||
* @param pdev: instance
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint8_t usbd_audio_OUT_Incplt (void *pdev)
|
|
||||||
{
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/******************************************************************************
|
|
||||||
AUDIO Class requests management
|
|
||||||
******************************************************************************/
|
|
||||||
/**
|
|
||||||
* @brief AUDIO_Req_GetCurrent
|
|
||||||
* Handles the GET_CUR Audio control request.
|
|
||||||
* @param pdev: instance
|
|
||||||
* @param req: setup class request
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static void AUDIO_Req_GetCurrent(void *pdev, USB_SETUP_REQ *req)
|
|
||||||
{
|
|
||||||
/* Send the current mute state */
|
|
||||||
USBD_CtlSendData (pdev,
|
|
||||||
AudioCtl,
|
|
||||||
req->wLength);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief AUDIO_Req_SetCurrent
|
|
||||||
* Handles the SET_CUR Audio control request.
|
|
||||||
* @param pdev: instance
|
|
||||||
* @param req: setup class request
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static void AUDIO_Req_SetCurrent(void *pdev, USB_SETUP_REQ *req)
|
|
||||||
{
|
|
||||||
if (req->wLength)
|
|
||||||
{
|
|
||||||
/* Prepare the reception of the buffer over EP0 */
|
|
||||||
USBD_CtlPrepareRx (pdev,
|
|
||||||
AudioCtl,
|
|
||||||
req->wLength);
|
|
||||||
|
|
||||||
/* Set the global variables indicating current request and its length
|
|
||||||
to the function usbd_audio_EP0_RxReady() which will process the request */
|
|
||||||
AudioCtlCmd = AUDIO_REQ_SET_CUR; /* Set the request value */
|
|
||||||
AudioCtlLen = req->wLength; /* Set the request data length */
|
|
||||||
AudioCtlUnit = HIBYTE(req->wIndex); /* Set the request target unit */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_audio_GetCfgDesc
|
|
||||||
* Returns configuration descriptor.
|
|
||||||
* @param speed : current device speed
|
|
||||||
* @param length : pointer data length
|
|
||||||
* @retval pointer to descriptor buffer
|
|
||||||
*/
|
|
||||||
static uint8_t *USBD_audio_GetCfgDesc (uint8_t speed, uint16_t *length)
|
|
||||||
{
|
|
||||||
*length = sizeof (usbd_audio_CfgDesc);
|
|
||||||
return usbd_audio_CfgDesc;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
@ -1,318 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_audio_out_if.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief This file provides the Audio Out (palyback) interface API.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_audio_core.h"
|
|
||||||
#include "usbd_audio_out_if.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup usbd_audio_out_if
|
|
||||||
* @brief usbd out interface module
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup usbd_audio_out_if_Private_TypesDefinitions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup usbd_audio_out_if_Private_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup usbd_audio_out_if_Private_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup usbd_audio_out_if_Private_FunctionPrototypes
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
static uint8_t Init (uint32_t AudioFreq, uint32_t Volume, uint32_t options);
|
|
||||||
static uint8_t DeInit (uint32_t options);
|
|
||||||
static uint8_t AudioCmd (uint8_t* pbuf, uint32_t size, uint8_t cmd);
|
|
||||||
static uint8_t VolumeCtl (uint8_t vol);
|
|
||||||
static uint8_t MuteCtl (uint8_t cmd);
|
|
||||||
static uint8_t PeriodicTC (uint8_t cmd);
|
|
||||||
static uint8_t GetState (void);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup usbd_audio_out_if_Private_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
AUDIO_FOPS_TypeDef AUDIO_OUT_fops =
|
|
||||||
{
|
|
||||||
Init,
|
|
||||||
DeInit,
|
|
||||||
AudioCmd,
|
|
||||||
VolumeCtl,
|
|
||||||
MuteCtl,
|
|
||||||
PeriodicTC,
|
|
||||||
GetState
|
|
||||||
};
|
|
||||||
|
|
||||||
static uint8_t AudioState = AUDIO_STATE_INACTIVE;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup usbd_audio_out_if_Private_Functions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Init
|
|
||||||
* Initialize and configures all required resources for audio play function.
|
|
||||||
* @param AudioFreq: Statrtup audio frequency.
|
|
||||||
* @param Volume: Startup volume to be set.
|
|
||||||
* @param options: specific options passed to low layer function.
|
|
||||||
* @retval AUDIO_OK if all operations succeed, AUDIO_FAIL else.
|
|
||||||
*/
|
|
||||||
static uint8_t Init (uint32_t AudioFreq,
|
|
||||||
uint32_t Volume,
|
|
||||||
uint32_t options)
|
|
||||||
{
|
|
||||||
static uint32_t Initialized = 0;
|
|
||||||
|
|
||||||
/* Check if the low layer has already been initialized */
|
|
||||||
if (Initialized == 0)
|
|
||||||
{
|
|
||||||
/* Call low layer function */
|
|
||||||
if (EVAL_AUDIO_Init(OUTPUT_DEVICE_AUTO, Volume, AudioFreq) != 0)
|
|
||||||
{
|
|
||||||
AudioState = AUDIO_STATE_ERROR;
|
|
||||||
return AUDIO_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set the Initialization flag to prevent reinitializing the interface again */
|
|
||||||
Initialized = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Update the Audio state machine */
|
|
||||||
AudioState = AUDIO_STATE_ACTIVE;
|
|
||||||
|
|
||||||
return AUDIO_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief DeInit
|
|
||||||
* Free all resources used by low layer and stops audio-play function.
|
|
||||||
* @param options: options passed to low layer function.
|
|
||||||
* @retval AUDIO_OK if all operations succeed, AUDIO_FAIL else.
|
|
||||||
*/
|
|
||||||
static uint8_t DeInit (uint32_t options)
|
|
||||||
{
|
|
||||||
/* Update the Audio state machine */
|
|
||||||
AudioState = AUDIO_STATE_INACTIVE;
|
|
||||||
|
|
||||||
return AUDIO_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief AudioCmd
|
|
||||||
* Play, Stop, Pause or Resume current file.
|
|
||||||
* @param pbuf: address from which file shoud be played.
|
|
||||||
* @param size: size of the current buffer/file.
|
|
||||||
* @param cmd: command to be executed, can be AUDIO_CMD_PLAY , AUDIO_CMD_PAUSE,
|
|
||||||
* AUDIO_CMD_RESUME or AUDIO_CMD_STOP.
|
|
||||||
* @retval AUDIO_OK if all operations succeed, AUDIO_FAIL else.
|
|
||||||
*/
|
|
||||||
static uint8_t AudioCmd(uint8_t* pbuf,
|
|
||||||
uint32_t size,
|
|
||||||
uint8_t cmd)
|
|
||||||
{
|
|
||||||
/* Check the current state */
|
|
||||||
if ((AudioState == AUDIO_STATE_INACTIVE) || (AudioState == AUDIO_STATE_ERROR))
|
|
||||||
{
|
|
||||||
AudioState = AUDIO_STATE_ERROR;
|
|
||||||
return AUDIO_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (cmd)
|
|
||||||
{
|
|
||||||
/* Process the PLAY command ----------------------------*/
|
|
||||||
case AUDIO_CMD_PLAY:
|
|
||||||
/* If current state is Active or Stopped */
|
|
||||||
if ((AudioState == AUDIO_STATE_ACTIVE) || \
|
|
||||||
(AudioState == AUDIO_STATE_STOPPED) || \
|
|
||||||
(AudioState == AUDIO_STATE_PLAYING))
|
|
||||||
{
|
|
||||||
Audio_MAL_Play((uint32_t)pbuf, (size/2));
|
|
||||||
AudioState = AUDIO_STATE_PLAYING;
|
|
||||||
return AUDIO_OK;
|
|
||||||
}
|
|
||||||
/* If current state is Paused */
|
|
||||||
else if (AudioState == AUDIO_STATE_PAUSED)
|
|
||||||
{
|
|
||||||
if (EVAL_AUDIO_PauseResume(AUDIO_RESUME, (uint32_t)pbuf, (size/2)) != 0)
|
|
||||||
{
|
|
||||||
AudioState = AUDIO_STATE_ERROR;
|
|
||||||
return AUDIO_FAIL;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
AudioState = AUDIO_STATE_PLAYING;
|
|
||||||
return AUDIO_OK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else /* Not allowed command */
|
|
||||||
{
|
|
||||||
return AUDIO_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Process the STOP command ----------------------------*/
|
|
||||||
case AUDIO_CMD_STOP:
|
|
||||||
if (AudioState != AUDIO_STATE_PLAYING)
|
|
||||||
{
|
|
||||||
/* Unsupported command */
|
|
||||||
return AUDIO_FAIL;
|
|
||||||
}
|
|
||||||
else if (EVAL_AUDIO_Stop(CODEC_PDWN_SW) != 0)
|
|
||||||
{
|
|
||||||
AudioState = AUDIO_STATE_ERROR;
|
|
||||||
return AUDIO_FAIL;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
AudioState = AUDIO_STATE_STOPPED;
|
|
||||||
return AUDIO_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Process the PAUSE command ---------------------------*/
|
|
||||||
case AUDIO_CMD_PAUSE:
|
|
||||||
if (AudioState != AUDIO_STATE_PLAYING)
|
|
||||||
{
|
|
||||||
/* Unsupported command */
|
|
||||||
return AUDIO_FAIL;
|
|
||||||
}
|
|
||||||
else if (EVAL_AUDIO_PauseResume(AUDIO_PAUSE, (uint32_t)pbuf, (size/2)) != 0)
|
|
||||||
{
|
|
||||||
AudioState = AUDIO_STATE_ERROR;
|
|
||||||
return AUDIO_FAIL;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
AudioState = AUDIO_STATE_PAUSED;
|
|
||||||
return AUDIO_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Unsupported command ---------------------------------*/
|
|
||||||
default:
|
|
||||||
return AUDIO_FAIL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief VolumeCtl
|
|
||||||
* Set the volume level in %
|
|
||||||
* @param vol: volume level to be set in % (from 0% to 100%)
|
|
||||||
* @retval AUDIO_OK if all operations succeed, AUDIO_FAIL else.
|
|
||||||
*/
|
|
||||||
static uint8_t VolumeCtl (uint8_t vol)
|
|
||||||
{
|
|
||||||
/* Call low layer volume setting function */
|
|
||||||
if (EVAL_AUDIO_VolumeCtl(vol) != 0)
|
|
||||||
{
|
|
||||||
AudioState = AUDIO_STATE_ERROR;
|
|
||||||
return AUDIO_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return AUDIO_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief MuteCtl
|
|
||||||
* Mute or Unmute the audio current output
|
|
||||||
* @param cmd: can be 0 to unmute, or 1 to mute.
|
|
||||||
* @retval AUDIO_OK if all operations succeed, AUDIO_FAIL else.
|
|
||||||
*/
|
|
||||||
static uint8_t MuteCtl (uint8_t cmd)
|
|
||||||
{
|
|
||||||
/* Call low layer mute setting function */
|
|
||||||
if (EVAL_AUDIO_Mute(cmd) != 0)
|
|
||||||
{
|
|
||||||
AudioState = AUDIO_STATE_ERROR;
|
|
||||||
return AUDIO_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return AUDIO_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief
|
|
||||||
*
|
|
||||||
* @param
|
|
||||||
* @param
|
|
||||||
* @retval AUDIO_OK if all operations succeed, AUDIO_FAIL else.
|
|
||||||
*/
|
|
||||||
static uint8_t PeriodicTC (uint8_t cmd)
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
return AUDIO_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief GetState
|
|
||||||
* Return the current state of the audio machine
|
|
||||||
* @param None
|
|
||||||
* @retval Current State.
|
|
||||||
*/
|
|
||||||
static uint8_t GetState (void)
|
|
||||||
{
|
|
||||||
return AudioState;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
@ -1,2 +0,0 @@
|
|||||||
SUB_FOLDER += firmware/arch/stm32f4xx/lib/STM32_USB_Device_Library/Class/cdc/src
|
|
||||||
INCLUDES += firmware/arch/stm32f4xx/lib/STM32_USB_Device_Library/Class/cdc/inc
|
|
@ -1,137 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_cdc_core.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief header file for the usbd_cdc_core.c file.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef __USB_CDC_CORE_H_
|
|
||||||
#define __USB_CDC_CORE_H_
|
|
||||||
|
|
||||||
#include "usbd_ioreq.h"
|
|
||||||
|
|
||||||
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup usbd_cdc
|
|
||||||
* @brief This file is the Header file for USBD_cdc.c
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup usbd_cdc_Exported_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
#define USB_CDC_CONFIG_DESC_SIZ (67)
|
|
||||||
#define USB_CDC_DESC_SIZ (67-9)
|
|
||||||
|
|
||||||
#define CDC_DESCRIPTOR_TYPE 0x21
|
|
||||||
|
|
||||||
#define DEVICE_CLASS_CDC 0x02
|
|
||||||
#define DEVICE_SUBCLASS_CDC 0x00
|
|
||||||
|
|
||||||
|
|
||||||
#define USB_DEVICE_DESCRIPTOR_TYPE 0x01
|
|
||||||
#define USB_CONFIGURATION_DESCRIPTOR_TYPE 0x02
|
|
||||||
#define USB_STRING_DESCRIPTOR_TYPE 0x03
|
|
||||||
#define USB_INTERFACE_DESCRIPTOR_TYPE 0x04
|
|
||||||
#define USB_ENDPOINT_DESCRIPTOR_TYPE 0x05
|
|
||||||
|
|
||||||
#define STANDARD_ENDPOINT_DESC_SIZE 0x09
|
|
||||||
|
|
||||||
#define CDC_DATA_IN_PACKET_SIZE *(uint16_t *)(((USB_OTG_CORE_HANDLE *)pdev)->dev.pConfig_descriptor + 57)
|
|
||||||
|
|
||||||
#define CDC_DATA_OUT_PACKET_SIZE *(uint16_t *)(((USB_OTG_CORE_HANDLE *)pdev)->dev.pConfig_descriptor + 64)
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------*/
|
|
||||||
/* CDC definitions */
|
|
||||||
/*---------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**************************************************/
|
|
||||||
/* CDC Requests */
|
|
||||||
/**************************************************/
|
|
||||||
#define SEND_ENCAPSULATED_COMMAND 0x00
|
|
||||||
#define GET_ENCAPSULATED_RESPONSE 0x01
|
|
||||||
#define SET_COMM_FEATURE 0x02
|
|
||||||
#define GET_COMM_FEATURE 0x03
|
|
||||||
#define CLEAR_COMM_FEATURE 0x04
|
|
||||||
#define SET_LINE_CODING 0x20
|
|
||||||
#define GET_LINE_CODING 0x21
|
|
||||||
#define SET_CONTROL_LINE_STATE 0x22
|
|
||||||
#define SEND_BREAK 0x23
|
|
||||||
#define NO_CMD 0xFF
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_CORE_Exported_TypesDefinitions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
typedef struct _CDC_IF_PROP
|
|
||||||
{
|
|
||||||
uint16_t (*pIf_Init) (void);
|
|
||||||
uint16_t (*pIf_DeInit) (void);
|
|
||||||
uint16_t (*pIf_Ctrl) (uint32_t Cmd, uint32_t wValue, uint8_t* Buf, uint32_t Len);
|
|
||||||
uint16_t (*pIf_DataTx) (uint8_t* Buf, uint32_t Len);
|
|
||||||
uint16_t (*pIf_DataRx) (uint8_t* Buf, uint32_t Len);
|
|
||||||
}
|
|
||||||
CDC_IF_Prop_TypeDef;
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_CORE_Exported_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_CORE_Exported_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
extern USBD_Class_cb_TypeDef USBD_CDC_cb;
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_CORE_Exported_Functions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#endif // __USB_CDC_CORE_H_
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
@ -1,830 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_cdc_core.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief This file provides the high layer firmware functions to manage the
|
|
||||||
* following functionalities of the USB CDC Class:
|
|
||||||
* - Initialization and Configuration of high and low layer
|
|
||||||
* - Enumeration as CDC Device (and enumeration for each implemented memory interface)
|
|
||||||
* - OUT/IN data transfer
|
|
||||||
* - Command IN transfer (class requests management)
|
|
||||||
* - Error management
|
|
||||||
*
|
|
||||||
* @verbatim
|
|
||||||
*
|
|
||||||
* ===================================================================
|
|
||||||
* CDC Class Driver Description
|
|
||||||
* ===================================================================
|
|
||||||
* This driver manages the "Universal Serial Bus Class Definitions for Communications Devices
|
|
||||||
* Revision 1.2 November 16, 2007" and the sub-protocol specification of "Universal Serial Bus
|
|
||||||
* Communications Class Subclass Specification for PSTN Devices Revision 1.2 February 9, 2007"
|
|
||||||
* This driver implements the following aspects of the specification:
|
|
||||||
* - Device descriptor management
|
|
||||||
* - Configuration descriptor management
|
|
||||||
* - Enumeration as CDC device with 2 data endpoints (IN and OUT) and 1 command endpoint (IN)
|
|
||||||
* - Requests management (as described in section 6.2 in specification)
|
|
||||||
* - Abstract Control Model compliant
|
|
||||||
* - Union Functional collection (using 1 IN endpoint for control)
|
|
||||||
* - Data interface class
|
|
||||||
|
|
||||||
* @note
|
|
||||||
* For the Abstract Control Model, this core allows only transmitting the requests to
|
|
||||||
* lower layer dispatcher (ie. usbd_cdc_vcp.c/.h) which should manage each request and
|
|
||||||
* perform relative actions.
|
|
||||||
*
|
|
||||||
* These aspects may be enriched or modified for a specific user application.
|
|
||||||
*
|
|
||||||
* This driver doesn't implement the following aspects of the specification
|
|
||||||
* (but it is possible to manage these features with some modifications on this driver):
|
|
||||||
* - Any class-specific aspect relative to communication classes should be managed by user application.
|
|
||||||
* - All communication classes other than PSTN are not managed
|
|
||||||
*
|
|
||||||
* @endverbatim
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_cdc_core.h"
|
|
||||||
#include "usbd_desc.h"
|
|
||||||
#include "usbd_req.h"
|
|
||||||
|
|
||||||
|
|
||||||
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup usbd_cdc
|
|
||||||
* @brief usbd core module
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup usbd_cdc_Private_TypesDefinitions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup usbd_cdc_Private_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup usbd_cdc_Private_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup usbd_cdc_Private_FunctionPrototypes
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*********************************************
|
|
||||||
CDC Device library callbacks
|
|
||||||
*********************************************/
|
|
||||||
static uint8_t usbd_cdc_Init (void *pdev, uint8_t cfgidx);
|
|
||||||
static uint8_t usbd_cdc_DeInit (void *pdev, uint8_t cfgidx);
|
|
||||||
static uint8_t usbd_cdc_Setup (void *pdev, USB_SETUP_REQ *req);
|
|
||||||
static uint8_t usbd_cdc_EP0_RxReady (void *pdev);
|
|
||||||
static uint8_t usbd_cdc_DataIn (void *pdev, uint8_t epnum);
|
|
||||||
static uint8_t usbd_cdc_DataOut (void *pdev, uint8_t epnum);
|
|
||||||
static uint8_t usbd_cdc_SOF (void *pdev);
|
|
||||||
|
|
||||||
/*********************************************
|
|
||||||
CDC specific management functions
|
|
||||||
*********************************************/
|
|
||||||
static void Handle_USBAsynchXfer (void *pdev);
|
|
||||||
static uint8_t *USBD_cdc_GetCfgDesc (uint8_t speed, uint16_t *length);
|
|
||||||
#ifdef USE_USB_OTG_HS
|
|
||||||
static uint8_t *USBD_cdc_GetOtherCfgDesc (uint8_t speed, uint16_t *length);
|
|
||||||
#endif
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup usbd_cdc_Private_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
extern CDC_IF_Prop_TypeDef APP_FOPS;
|
|
||||||
extern uint8_t USBD_DeviceDesc [USB_SIZ_DEVICE_DESC];
|
|
||||||
|
|
||||||
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
|
||||||
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
|
||||||
#pragma data_alignment=4
|
|
||||||
#endif
|
|
||||||
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
|
||||||
__ALIGN_BEGIN uint8_t usbd_cdc_CfgDesc [USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END ;
|
|
||||||
|
|
||||||
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
|
||||||
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
|
||||||
#pragma data_alignment=4
|
|
||||||
#endif
|
|
||||||
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
|
||||||
__ALIGN_BEGIN uint8_t usbd_cdc_OtherCfgDesc [USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END ;
|
|
||||||
|
|
||||||
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
|
||||||
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
|
||||||
#pragma data_alignment=4
|
|
||||||
#endif
|
|
||||||
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
|
||||||
__ALIGN_BEGIN static __IO uint32_t usbd_cdc_AltSet __ALIGN_END = 0;
|
|
||||||
|
|
||||||
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
|
||||||
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
|
||||||
#pragma data_alignment=4
|
|
||||||
#endif
|
|
||||||
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
|
||||||
__ALIGN_BEGIN uint8_t USB_Rx_Buffer [CDC_DATA_MAX_PACKET_SIZE] __ALIGN_END ;
|
|
||||||
|
|
||||||
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
|
||||||
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
|
||||||
#pragma data_alignment=4
|
|
||||||
#endif
|
|
||||||
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
|
||||||
__ALIGN_BEGIN uint8_t APP_Rx_Buffer [APP_RX_DATA_SIZE] __ALIGN_END ;
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
|
||||||
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
|
||||||
#pragma data_alignment=4
|
|
||||||
#endif
|
|
||||||
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
|
||||||
__ALIGN_BEGIN uint8_t CmdBuff[CDC_CMD_PACKET_SZE] __ALIGN_END ;
|
|
||||||
|
|
||||||
uint32_t APP_Rx_ptr_in = 0;
|
|
||||||
uint32_t APP_Rx_ptr_out = 0;
|
|
||||||
uint32_t APP_Rx_length = 0;
|
|
||||||
|
|
||||||
uint8_t USB_Tx_State = 0;
|
|
||||||
|
|
||||||
static uint32_t cdcCmd = 0xFF;
|
|
||||||
static uint32_t cdcLen = 0;
|
|
||||||
|
|
||||||
/* CDC interface class callbacks structure */
|
|
||||||
USBD_Class_cb_TypeDef USBD_CDC_cb =
|
|
||||||
{
|
|
||||||
usbd_cdc_Init,
|
|
||||||
usbd_cdc_DeInit,
|
|
||||||
usbd_cdc_Setup,
|
|
||||||
NULL, /* EP0_TxSent, */
|
|
||||||
usbd_cdc_EP0_RxReady,
|
|
||||||
usbd_cdc_DataIn,
|
|
||||||
usbd_cdc_DataOut,
|
|
||||||
usbd_cdc_SOF,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
USBD_cdc_GetCfgDesc,
|
|
||||||
#ifdef USE_USB_OTG_HS
|
|
||||||
USBD_cdc_GetOtherCfgDesc, /* use same cobfig as per FS */
|
|
||||||
#endif /* USE_USB_OTG_HS */
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
|
||||||
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
|
||||||
#pragma data_alignment=4
|
|
||||||
#endif
|
|
||||||
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
|
||||||
/* USB CDC device Configuration Descriptor */
|
|
||||||
__ALIGN_BEGIN uint8_t usbd_cdc_CfgDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END =
|
|
||||||
{
|
|
||||||
/*Configuration Descriptor*/
|
|
||||||
0x09, /* bLength: Configuration Descriptor size */
|
|
||||||
USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */
|
|
||||||
USB_CDC_CONFIG_DESC_SIZ, /* wTotalLength:no of returned bytes */
|
|
||||||
0x00,
|
|
||||||
0x02, /* bNumInterfaces: 2 interface */
|
|
||||||
0x01, /* bConfigurationValue: Configuration value */
|
|
||||||
0x00, /* iConfiguration: Index of string descriptor describing the configuration */
|
|
||||||
0xC0, /* bmAttributes: self powered */
|
|
||||||
0x32, /* MaxPower 0 mA */
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*Interface Descriptor */
|
|
||||||
0x09, /* bLength: Interface Descriptor size */
|
|
||||||
USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: Interface */
|
|
||||||
/* Interface descriptor type */
|
|
||||||
0x00, /* bInterfaceNumber: Number of Interface */
|
|
||||||
0x00, /* bAlternateSetting: Alternate setting */
|
|
||||||
0x01, /* bNumEndpoints: One endpoints used */
|
|
||||||
0x02, /* bInterfaceClass: Communication Interface Class */
|
|
||||||
0x02, /* bInterfaceSubClass: Abstract Control Model */
|
|
||||||
0x01, /* bInterfaceProtocol: Common AT commands */
|
|
||||||
0x00, /* iInterface: */
|
|
||||||
|
|
||||||
/*Header Functional Descriptor*/
|
|
||||||
0x05, /* bLength: Endpoint Descriptor size */
|
|
||||||
0x24, /* bDescriptorType: CS_INTERFACE */
|
|
||||||
0x00, /* bDescriptorSubtype: Header Func Desc */
|
|
||||||
0x10, /* bcdCDC: spec release number */
|
|
||||||
0x01,
|
|
||||||
|
|
||||||
/*Call Management Functional Descriptor*/
|
|
||||||
0x05, /* bFunctionLength */
|
|
||||||
0x24, /* bDescriptorType: CS_INTERFACE */
|
|
||||||
0x01, /* bDescriptorSubtype: Call Management Func Desc */
|
|
||||||
0x00, /* bmCapabilities: D0+D1 */
|
|
||||||
0x01, /* bDataInterface: 1 */
|
|
||||||
|
|
||||||
/*ACM Functional Descriptor*/
|
|
||||||
0x04, /* bFunctionLength */
|
|
||||||
0x24, /* bDescriptorType: CS_INTERFACE */
|
|
||||||
0x02, /* bDescriptorSubtype: Abstract Control Management desc */
|
|
||||||
0x02, /* bmCapabilities */
|
|
||||||
|
|
||||||
/*Union Functional Descriptor*/
|
|
||||||
0x05, /* bFunctionLength */
|
|
||||||
0x24, /* bDescriptorType: CS_INTERFACE */
|
|
||||||
0x06, /* bDescriptorSubtype: Union func desc */
|
|
||||||
0x00, /* bMasterInterface: Communication class interface */
|
|
||||||
0x01, /* bSlaveInterface0: Data Class Interface */
|
|
||||||
|
|
||||||
/*Endpoint 2 Descriptor*/
|
|
||||||
0x07, /* bLength: Endpoint Descriptor size */
|
|
||||||
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */
|
|
||||||
CDC_CMD_EP, /* bEndpointAddress */
|
|
||||||
0x03, /* bmAttributes: Interrupt */
|
|
||||||
LOBYTE(CDC_CMD_PACKET_SZE), /* wMaxPacketSize: */
|
|
||||||
HIBYTE(CDC_CMD_PACKET_SZE),
|
|
||||||
#ifdef USE_USB_OTG_HS
|
|
||||||
0x10, /* bInterval: */
|
|
||||||
#else
|
|
||||||
0xFF, /* bInterval: */
|
|
||||||
#endif /* USE_USB_OTG_HS */
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*Data class interface descriptor*/
|
|
||||||
0x09, /* bLength: Endpoint Descriptor size */
|
|
||||||
USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: */
|
|
||||||
0x01, /* bInterfaceNumber: Number of Interface */
|
|
||||||
0x00, /* bAlternateSetting: Alternate setting */
|
|
||||||
0x02, /* bNumEndpoints: Two endpoints used */
|
|
||||||
0x0A, /* bInterfaceClass: CDC */
|
|
||||||
0x00, /* bInterfaceSubClass: */
|
|
||||||
0x00, /* bInterfaceProtocol: */
|
|
||||||
0x00, /* iInterface: */
|
|
||||||
|
|
||||||
/*Endpoint OUT Descriptor*/
|
|
||||||
0x07, /* bLength: Endpoint Descriptor size */
|
|
||||||
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */
|
|
||||||
CDC_OUT_EP, /* bEndpointAddress */
|
|
||||||
0x02, /* bmAttributes: Bulk */
|
|
||||||
LOBYTE(CDC_DATA_MAX_PACKET_SIZE), /* wMaxPacketSize: */
|
|
||||||
HIBYTE(CDC_DATA_MAX_PACKET_SIZE),
|
|
||||||
0x00, /* bInterval: ignore for Bulk transfer */
|
|
||||||
|
|
||||||
/*Endpoint IN Descriptor*/
|
|
||||||
0x07, /* bLength: Endpoint Descriptor size */
|
|
||||||
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */
|
|
||||||
CDC_IN_EP, /* bEndpointAddress */
|
|
||||||
0x02, /* bmAttributes: Bulk */
|
|
||||||
LOBYTE(CDC_DATA_MAX_PACKET_SIZE), /* wMaxPacketSize: */
|
|
||||||
HIBYTE(CDC_DATA_MAX_PACKET_SIZE),
|
|
||||||
0x00 /* bInterval: ignore for Bulk transfer */
|
|
||||||
} ;
|
|
||||||
|
|
||||||
#ifdef USE_USB_OTG_HS
|
|
||||||
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
|
||||||
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
|
||||||
#pragma data_alignment=4
|
|
||||||
#endif
|
|
||||||
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
|
||||||
__ALIGN_BEGIN uint8_t usbd_cdc_OtherCfgDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END =
|
|
||||||
{
|
|
||||||
0x09, /* bLength: Configuation Descriptor size */
|
|
||||||
USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION,
|
|
||||||
USB_CDC_CONFIG_DESC_SIZ,
|
|
||||||
0x00,
|
|
||||||
0x02, /* bNumInterfaces: 2 interfaces */
|
|
||||||
0x01, /* bConfigurationValue: */
|
|
||||||
0x04, /* iConfiguration: */
|
|
||||||
0xC0, /* bmAttributes: */
|
|
||||||
0x32, /* MaxPower 100 mA */
|
|
||||||
|
|
||||||
/*Interface Descriptor */
|
|
||||||
0x09, /* bLength: Interface Descriptor size */
|
|
||||||
USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: Interface */
|
|
||||||
/* Interface descriptor type */
|
|
||||||
0x00, /* bInterfaceNumber: Number of Interface */
|
|
||||||
0x00, /* bAlternateSetting: Alternate setting */
|
|
||||||
0x01, /* bNumEndpoints: One endpoints used */
|
|
||||||
0x02, /* bInterfaceClass: Communication Interface Class */
|
|
||||||
0x02, /* bInterfaceSubClass: Abstract Control Model */
|
|
||||||
0x01, /* bInterfaceProtocol: Common AT commands */
|
|
||||||
0x00, /* iInterface: */
|
|
||||||
|
|
||||||
/*Header Functional Descriptor*/
|
|
||||||
0x05, /* bLength: Endpoint Descriptor size */
|
|
||||||
0x24, /* bDescriptorType: CS_INTERFACE */
|
|
||||||
0x00, /* bDescriptorSubtype: Header Func Desc */
|
|
||||||
0x10, /* bcdCDC: spec release number */
|
|
||||||
0x01,
|
|
||||||
|
|
||||||
/*Call Management Functional Descriptor*/
|
|
||||||
0x05, /* bFunctionLength */
|
|
||||||
0x24, /* bDescriptorType: CS_INTERFACE */
|
|
||||||
0x01, /* bDescriptorSubtype: Call Management Func Desc */
|
|
||||||
0x00, /* bmCapabilities: D0+D1 */
|
|
||||||
0x01, /* bDataInterface: 1 */
|
|
||||||
|
|
||||||
/*ACM Functional Descriptor*/
|
|
||||||
0x04, /* bFunctionLength */
|
|
||||||
0x24, /* bDescriptorType: CS_INTERFACE */
|
|
||||||
0x02, /* bDescriptorSubtype: Abstract Control Management desc */
|
|
||||||
0x02, /* bmCapabilities */
|
|
||||||
|
|
||||||
/*Union Functional Descriptor*/
|
|
||||||
0x05, /* bFunctionLength */
|
|
||||||
0x24, /* bDescriptorType: CS_INTERFACE */
|
|
||||||
0x06, /* bDescriptorSubtype: Union func desc */
|
|
||||||
0x00, /* bMasterInterface: Communication class interface */
|
|
||||||
0x01, /* bSlaveInterface0: Data Class Interface */
|
|
||||||
|
|
||||||
/*Endpoint 2 Descriptor*/
|
|
||||||
0x07, /* bLength: Endpoint Descriptor size */
|
|
||||||
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */
|
|
||||||
CDC_CMD_EP, /* bEndpointAddress */
|
|
||||||
0x03, /* bmAttributes: Interrupt */
|
|
||||||
LOBYTE(CDC_CMD_PACKET_SZE), /* wMaxPacketSize: */
|
|
||||||
HIBYTE(CDC_CMD_PACKET_SZE),
|
|
||||||
0xFF, /* bInterval: */
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*Data class interface descriptor*/
|
|
||||||
0x09, /* bLength: Endpoint Descriptor size */
|
|
||||||
USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: */
|
|
||||||
0x01, /* bInterfaceNumber: Number of Interface */
|
|
||||||
0x00, /* bAlternateSetting: Alternate setting */
|
|
||||||
0x02, /* bNumEndpoints: Two endpoints used */
|
|
||||||
0x0A, /* bInterfaceClass: CDC */
|
|
||||||
0x00, /* bInterfaceSubClass: */
|
|
||||||
0x00, /* bInterfaceProtocol: */
|
|
||||||
0x00, /* iInterface: */
|
|
||||||
|
|
||||||
/*Endpoint OUT Descriptor*/
|
|
||||||
0x07, /* bLength: Endpoint Descriptor size */
|
|
||||||
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */
|
|
||||||
CDC_OUT_EP, /* bEndpointAddress */
|
|
||||||
0x02, /* bmAttributes: Bulk */
|
|
||||||
0x40, /* wMaxPacketSize: */
|
|
||||||
0x00,
|
|
||||||
0x00, /* bInterval: ignore for Bulk transfer */
|
|
||||||
|
|
||||||
/*Endpoint IN Descriptor*/
|
|
||||||
0x07, /* bLength: Endpoint Descriptor size */
|
|
||||||
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */
|
|
||||||
CDC_IN_EP, /* bEndpointAddress */
|
|
||||||
0x02, /* bmAttributes: Bulk */
|
|
||||||
0x40, /* wMaxPacketSize: */
|
|
||||||
0x00,
|
|
||||||
0x00 /* bInterval */
|
|
||||||
};
|
|
||||||
#endif /* USE_USB_OTG_HS */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup usbd_cdc_Private_Functions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief usbd_cdc_Init
|
|
||||||
* Initilaize the CDC interface
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param cfgidx: Configuration index
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint8_t usbd_cdc_Init (void *pdev,
|
|
||||||
uint8_t cfgidx)
|
|
||||||
{
|
|
||||||
uint8_t *pbuf;
|
|
||||||
|
|
||||||
/* Open EP IN */
|
|
||||||
DCD_EP_Open(pdev,
|
|
||||||
CDC_IN_EP,
|
|
||||||
CDC_DATA_IN_PACKET_SIZE,
|
|
||||||
USB_OTG_EP_BULK);
|
|
||||||
|
|
||||||
/* Open EP OUT */
|
|
||||||
DCD_EP_Open(pdev,
|
|
||||||
CDC_OUT_EP,
|
|
||||||
CDC_DATA_OUT_PACKET_SIZE,
|
|
||||||
USB_OTG_EP_BULK);
|
|
||||||
|
|
||||||
/* Open Command IN EP */
|
|
||||||
DCD_EP_Open(pdev,
|
|
||||||
CDC_CMD_EP,
|
|
||||||
CDC_CMD_PACKET_SZE,
|
|
||||||
USB_OTG_EP_INT);
|
|
||||||
|
|
||||||
pbuf = (uint8_t *)USBD_DeviceDesc;
|
|
||||||
pbuf[4] = DEVICE_CLASS_CDC;
|
|
||||||
pbuf[5] = DEVICE_SUBCLASS_CDC;
|
|
||||||
|
|
||||||
/* Initialize the Interface physical components */
|
|
||||||
APP_FOPS.pIf_Init();
|
|
||||||
|
|
||||||
/* Prepare Out endpoint to receive next packet */
|
|
||||||
DCD_EP_PrepareRx(pdev,
|
|
||||||
CDC_OUT_EP,
|
|
||||||
(uint8_t*)(USB_Rx_Buffer),
|
|
||||||
CDC_DATA_OUT_PACKET_SIZE);
|
|
||||||
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief usbd_cdc_Init
|
|
||||||
* DeInitialize the CDC layer
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param cfgidx: Configuration index
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint8_t usbd_cdc_DeInit (void *pdev,
|
|
||||||
uint8_t cfgidx)
|
|
||||||
{
|
|
||||||
/* Open EP IN */
|
|
||||||
DCD_EP_Close(pdev,
|
|
||||||
CDC_IN_EP);
|
|
||||||
|
|
||||||
/* Open EP OUT */
|
|
||||||
DCD_EP_Close(pdev,
|
|
||||||
CDC_OUT_EP);
|
|
||||||
|
|
||||||
/* Open Command IN EP */
|
|
||||||
DCD_EP_Close(pdev,
|
|
||||||
CDC_CMD_EP);
|
|
||||||
|
|
||||||
/* Restore default state of the Interface physical components */
|
|
||||||
APP_FOPS.pIf_DeInit();
|
|
||||||
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief usbd_cdc_Setup
|
|
||||||
* Handle the CDC specific requests
|
|
||||||
* @param pdev: instance
|
|
||||||
* @param req: usb requests
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint8_t usbd_cdc_Setup (void *pdev,
|
|
||||||
USB_SETUP_REQ *req)
|
|
||||||
{
|
|
||||||
uint16_t len;
|
|
||||||
uint8_t *pbuf;
|
|
||||||
|
|
||||||
switch (req->bmRequest & USB_REQ_TYPE_MASK)
|
|
||||||
{
|
|
||||||
/* CDC Class Requests -------------------------------*/
|
|
||||||
case USB_REQ_TYPE_CLASS :
|
|
||||||
/* Check if the request is a data setup packet */
|
|
||||||
if (req->wLength)
|
|
||||||
{
|
|
||||||
/* Check if the request is Device-to-Host */
|
|
||||||
if (req->bmRequest & 0x80)
|
|
||||||
{
|
|
||||||
/* Get the data to be sent to Host from interface layer */
|
|
||||||
APP_FOPS.pIf_Ctrl(req->bRequest, req->wValue, CmdBuff, req->wLength);
|
|
||||||
|
|
||||||
/* Send the data to the host */
|
|
||||||
USBD_CtlSendData (pdev,
|
|
||||||
CmdBuff,
|
|
||||||
req->wLength);
|
|
||||||
}
|
|
||||||
else /* Host-to-Device requeset */
|
|
||||||
{
|
|
||||||
/* Set the value of the current command to be processed */
|
|
||||||
cdcCmd = req->bRequest;
|
|
||||||
cdcLen = req->wLength;
|
|
||||||
|
|
||||||
/* Prepare the reception of the buffer over EP0
|
|
||||||
Next step: the received data will be managed in usbd_cdc_EP0_TxSent()
|
|
||||||
function. */
|
|
||||||
USBD_CtlPrepareRx (pdev,
|
|
||||||
CmdBuff,
|
|
||||||
req->wLength);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else /* No Data request */
|
|
||||||
{
|
|
||||||
/* Transfer the command to the interface layer */
|
|
||||||
APP_FOPS.pIf_Ctrl(req->bRequest, req->wValue, NULL, 0);
|
|
||||||
if(req->bRequest == SET_CONTROL_LINE_STATE)
|
|
||||||
{
|
|
||||||
if(req->wValue & 1)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// HOST Virtual COM Port is closed
|
|
||||||
// Disable TxFifoEmpty interrupt on endpoint 0x01 to avoid interrupt lock-up
|
|
||||||
uint32_t fifoemptymsk;
|
|
||||||
|
|
||||||
fifoemptymsk = 0x1 << 1;
|
|
||||||
USB_OTG_MODIFY_REG32(&((USB_OTG_CORE_HANDLE*)pdev)->regs.DREGS->DIEPEMPMSK, fifoemptymsk, 0);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return USBD_OK;
|
|
||||||
|
|
||||||
default:
|
|
||||||
USBD_CtlError (pdev, req);
|
|
||||||
return USBD_FAIL;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Standard Requests -------------------------------*/
|
|
||||||
case USB_REQ_TYPE_STANDARD:
|
|
||||||
switch (req->bRequest)
|
|
||||||
{
|
|
||||||
case USB_REQ_GET_DESCRIPTOR:
|
|
||||||
if( (req->wValue >> 8) == CDC_DESCRIPTOR_TYPE)
|
|
||||||
{
|
|
||||||
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
|
||||||
pbuf = usbd_cdc_Desc;
|
|
||||||
#else
|
|
||||||
pbuf = usbd_cdc_CfgDesc + 9 + (9 * USBD_ITF_MAX_NUM);
|
|
||||||
#endif
|
|
||||||
len = MIN(USB_CDC_DESC_SIZ , req->wLength);
|
|
||||||
}
|
|
||||||
|
|
||||||
USBD_CtlSendData (pdev,
|
|
||||||
pbuf,
|
|
||||||
len);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case USB_REQ_GET_INTERFACE :
|
|
||||||
USBD_CtlSendData (pdev,
|
|
||||||
(uint8_t *)&usbd_cdc_AltSet,
|
|
||||||
1);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case USB_REQ_SET_INTERFACE :
|
|
||||||
if ((uint8_t)(req->wValue) < USBD_ITF_MAX_NUM)
|
|
||||||
{
|
|
||||||
usbd_cdc_AltSet = (uint8_t)(req->wValue);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Call the error management function (command will be nacked */
|
|
||||||
USBD_CtlError (pdev, req);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief usbd_cdc_EP0_RxReady
|
|
||||||
* Data received on control endpoint
|
|
||||||
* @param pdev: device device instance
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint8_t usbd_cdc_EP0_RxReady (void *pdev)
|
|
||||||
{
|
|
||||||
if (cdcCmd != NO_CMD)
|
|
||||||
{
|
|
||||||
/* Process the data */
|
|
||||||
APP_FOPS.pIf_Ctrl(cdcCmd, 0, CmdBuff, cdcLen);
|
|
||||||
|
|
||||||
/* Reset the command variable to default value */
|
|
||||||
cdcCmd = NO_CMD;
|
|
||||||
}
|
|
||||||
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief usbd_audio_DataIn
|
|
||||||
* Data sent on non-control IN endpoint
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param epnum: endpoint number
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint8_t usbd_cdc_DataIn (void *pdev, uint8_t epnum)
|
|
||||||
{
|
|
||||||
uint16_t USB_Tx_ptr;
|
|
||||||
uint16_t USB_Tx_length;
|
|
||||||
|
|
||||||
if (USB_Tx_State == 1)
|
|
||||||
{
|
|
||||||
if (APP_Rx_length == 0)
|
|
||||||
{
|
|
||||||
USB_Tx_State = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (APP_Rx_length > CDC_DATA_IN_PACKET_SIZE){
|
|
||||||
USB_Tx_ptr = APP_Rx_ptr_out;
|
|
||||||
USB_Tx_length = CDC_DATA_IN_PACKET_SIZE;
|
|
||||||
|
|
||||||
APP_Rx_ptr_out += CDC_DATA_IN_PACKET_SIZE;
|
|
||||||
APP_Rx_length -= CDC_DATA_IN_PACKET_SIZE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
USB_Tx_ptr = APP_Rx_ptr_out;
|
|
||||||
USB_Tx_length = APP_Rx_length;
|
|
||||||
|
|
||||||
APP_Rx_ptr_out += APP_Rx_length;
|
|
||||||
APP_Rx_length = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Prepare the available data buffer to be sent on IN endpoint */
|
|
||||||
DCD_EP_Tx (pdev,
|
|
||||||
CDC_IN_EP,
|
|
||||||
(uint8_t*)&APP_Rx_Buffer[USB_Tx_ptr],
|
|
||||||
USB_Tx_length);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief usbd_audio_DataOut
|
|
||||||
* Data received on non-control Out endpoint
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param epnum: endpoint number
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint8_t usbd_cdc_DataOut (void *pdev, uint8_t epnum)
|
|
||||||
{
|
|
||||||
uint16_t USB_Rx_Cnt;
|
|
||||||
|
|
||||||
/* Get the received data buffer and update the counter */
|
|
||||||
USB_Rx_Cnt = ((USB_OTG_CORE_HANDLE*)pdev)->dev.out_ep[epnum].xfer_count;
|
|
||||||
|
|
||||||
/* USB data will be immediately processed, this allow next USB traffic being
|
|
||||||
NAKed till the end of the application Xfer */
|
|
||||||
APP_FOPS.pIf_DataRx(USB_Rx_Buffer, USB_Rx_Cnt);
|
|
||||||
|
|
||||||
/* Prepare Out endpoint to receive next packet */
|
|
||||||
DCD_EP_PrepareRx(pdev,
|
|
||||||
CDC_OUT_EP,
|
|
||||||
(uint8_t*)(USB_Rx_Buffer),
|
|
||||||
CDC_DATA_OUT_PACKET_SIZE);
|
|
||||||
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief usbd_audio_SOF
|
|
||||||
* Start Of Frame event management
|
|
||||||
* @param pdev: instance
|
|
||||||
* @param epnum: endpoint number
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint8_t usbd_cdc_SOF (void *pdev)
|
|
||||||
{
|
|
||||||
static uint32_t FrameCount = 0;
|
|
||||||
|
|
||||||
if (FrameCount++ == CDC_IN_FRAME_INTERVAL)
|
|
||||||
{
|
|
||||||
/* Reset the frame counter */
|
|
||||||
FrameCount = 0;
|
|
||||||
|
|
||||||
/* Check the data to be sent through IN pipe */
|
|
||||||
Handle_USBAsynchXfer(pdev);
|
|
||||||
}
|
|
||||||
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Handle_USBAsynchXfer
|
|
||||||
* Send data to USB
|
|
||||||
* @param pdev: instance
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
static void Handle_USBAsynchXfer (void *pdev)
|
|
||||||
{
|
|
||||||
uint16_t USB_Tx_ptr;
|
|
||||||
uint16_t USB_Tx_length;
|
|
||||||
|
|
||||||
if(USB_Tx_State != 1)
|
|
||||||
{
|
|
||||||
if (APP_Rx_ptr_out == APP_RX_DATA_SIZE)
|
|
||||||
{
|
|
||||||
APP_Rx_ptr_out = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(APP_Rx_ptr_out == APP_Rx_ptr_in)
|
|
||||||
{
|
|
||||||
USB_Tx_State = 0;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(APP_Rx_ptr_out > APP_Rx_ptr_in) /* rollback */
|
|
||||||
{
|
|
||||||
APP_Rx_length = APP_RX_DATA_SIZE - APP_Rx_ptr_out;
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
APP_Rx_length = APP_Rx_ptr_in - APP_Rx_ptr_out;
|
|
||||||
|
|
||||||
}
|
|
||||||
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
|
||||||
APP_Rx_length &= ~0x03;
|
|
||||||
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
|
||||||
|
|
||||||
if (APP_Rx_length > CDC_DATA_IN_PACKET_SIZE)
|
|
||||||
{
|
|
||||||
USB_Tx_ptr = APP_Rx_ptr_out;
|
|
||||||
USB_Tx_length = CDC_DATA_IN_PACKET_SIZE;
|
|
||||||
|
|
||||||
APP_Rx_ptr_out += CDC_DATA_IN_PACKET_SIZE;
|
|
||||||
APP_Rx_length -= CDC_DATA_IN_PACKET_SIZE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
USB_Tx_ptr = APP_Rx_ptr_out;
|
|
||||||
USB_Tx_length = APP_Rx_length;
|
|
||||||
|
|
||||||
APP_Rx_ptr_out += APP_Rx_length;
|
|
||||||
APP_Rx_length = 0;
|
|
||||||
}
|
|
||||||
USB_Tx_State = 1;
|
|
||||||
|
|
||||||
DCD_EP_Tx (pdev,
|
|
||||||
CDC_IN_EP,
|
|
||||||
(uint8_t*)&APP_Rx_Buffer[USB_Tx_ptr],
|
|
||||||
USB_Tx_length);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_cdc_GetCfgDesc
|
|
||||||
* Return configuration descriptor
|
|
||||||
* @param speed : current device speed
|
|
||||||
* @param length : pointer data length
|
|
||||||
* @retval pointer to descriptor buffer
|
|
||||||
*/
|
|
||||||
static uint8_t *USBD_cdc_GetCfgDesc (uint8_t speed, uint16_t *length)
|
|
||||||
{
|
|
||||||
*length = sizeof (usbd_cdc_CfgDesc);
|
|
||||||
return usbd_cdc_CfgDesc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_cdc_GetCfgDesc
|
|
||||||
* Return configuration descriptor
|
|
||||||
* @param speed : current device speed
|
|
||||||
* @param length : pointer data length
|
|
||||||
* @retval pointer to descriptor buffer
|
|
||||||
*/
|
|
||||||
#ifdef USE_USB_OTG_HS
|
|
||||||
static uint8_t *USBD_cdc_GetOtherCfgDesc (uint8_t speed, uint16_t *length)
|
|
||||||
{
|
|
||||||
*length = sizeof (usbd_cdc_OtherCfgDesc);
|
|
||||||
return usbd_cdc_OtherCfgDesc;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
@ -1,4 +0,0 @@
|
|||||||
#SUB_FOLDER += firmware/arch/stm32f4xx/lib
|
|
||||||
#INCLUDES += firmware/arch/stm32f4xx/lib
|
|
||||||
|
|
||||||
include firmware/arch/stm32f4xx/lib/STM32_USB_Device_Library/Class/cdc/cdc.mk
|
|
@ -1,187 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_dfu_core.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief header file for the usbd_dfu_core.c file.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef __USB_DFU_CORE_H_
|
|
||||||
#define __USB_DFU_CORE_H_
|
|
||||||
|
|
||||||
#include "usbd_ioreq.h"
|
|
||||||
#include "usbd_dfu_mal.h"
|
|
||||||
|
|
||||||
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup usbd_dfu
|
|
||||||
* @brief This file is the Header file for USBD_dfu.c
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup usbd_dfu_Exported_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
#define USB_DFU_CONFIG_DESC_SIZ (18 + (9 * USBD_ITF_MAX_NUM))
|
|
||||||
#define USB_DFU_DESC_SIZ 9
|
|
||||||
|
|
||||||
#define DFU_DESCRIPTOR_TYPE 0x21
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------*/
|
|
||||||
/* DFU definitions */
|
|
||||||
/*---------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************/
|
|
||||||
/* DFU Requests DFU states */
|
|
||||||
/**************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
#define STATE_appIDLE 0
|
|
||||||
#define STATE_appDETACH 1
|
|
||||||
#define STATE_dfuIDLE 2
|
|
||||||
#define STATE_dfuDNLOAD_SYNC 3
|
|
||||||
#define STATE_dfuDNBUSY 4
|
|
||||||
#define STATE_dfuDNLOAD_IDLE 5
|
|
||||||
#define STATE_dfuMANIFEST_SYNC 6
|
|
||||||
#define STATE_dfuMANIFEST 7
|
|
||||||
#define STATE_dfuMANIFEST_WAIT_RESET 8
|
|
||||||
#define STATE_dfuUPLOAD_IDLE 9
|
|
||||||
#define STATE_dfuERROR 10
|
|
||||||
|
|
||||||
/**************************************************/
|
|
||||||
/* DFU Requests DFU status */
|
|
||||||
/**************************************************/
|
|
||||||
|
|
||||||
#define STATUS_OK 0x00
|
|
||||||
#define STATUS_ERRTARGET 0x01
|
|
||||||
#define STATUS_ERRFILE 0x02
|
|
||||||
#define STATUS_ERRWRITE 0x03
|
|
||||||
#define STATUS_ERRERASE 0x04
|
|
||||||
#define STATUS_ERRCHECK_ERASED 0x05
|
|
||||||
#define STATUS_ERRPROG 0x06
|
|
||||||
#define STATUS_ERRVERIFY 0x07
|
|
||||||
#define STATUS_ERRADDRESS 0x08
|
|
||||||
#define STATUS_ERRNOTDONE 0x09
|
|
||||||
#define STATUS_ERRFIRMWARE 0x0A
|
|
||||||
#define STATUS_ERRVENDOR 0x0B
|
|
||||||
#define STATUS_ERRUSBR 0x0C
|
|
||||||
#define STATUS_ERRPOR 0x0D
|
|
||||||
#define STATUS_ERRUNKNOWN 0x0E
|
|
||||||
#define STATUS_ERRSTALLEDPKT 0x0F
|
|
||||||
|
|
||||||
/**************************************************/
|
|
||||||
/* DFU Requests DFU states Manifestation State */
|
|
||||||
/**************************************************/
|
|
||||||
|
|
||||||
#define Manifest_complete 0x00
|
|
||||||
#define Manifest_In_Progress 0x01
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************/
|
|
||||||
/* Special Commands with Download Request */
|
|
||||||
/**************************************************/
|
|
||||||
|
|
||||||
#define CMD_GETCOMMANDS 0x00
|
|
||||||
#define CMD_SETADDRESSPOINTER 0x21
|
|
||||||
#define CMD_ERASE 0x41
|
|
||||||
|
|
||||||
/**************************************************/
|
|
||||||
/* Other defines */
|
|
||||||
/**************************************************/
|
|
||||||
/* Bit Detach capable = bit 3 in bmAttributes field */
|
|
||||||
#define DFU_DETACH_MASK (uint8_t)(1 << 4)
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_CORE_Exported_TypesDefinitions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**************************************************/
|
|
||||||
/* DFU Requests */
|
|
||||||
/**************************************************/
|
|
||||||
|
|
||||||
typedef enum _DFU_REQUESTS {
|
|
||||||
DFU_DETACH = 0,
|
|
||||||
DFU_DNLOAD = 1,
|
|
||||||
DFU_UPLOAD,
|
|
||||||
DFU_GETSTATUS,
|
|
||||||
DFU_CLRSTATUS,
|
|
||||||
DFU_GETSTATE,
|
|
||||||
DFU_ABORT
|
|
||||||
} DFU_REQUESTS;
|
|
||||||
|
|
||||||
typedef void (*pFunction)(void);
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_CORE_Exported_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/********** Descriptor of DFU interface 0 Alternate setting n ****************/
|
|
||||||
#define USBD_DFU_IF_DESC(n) 0x09, /* bLength: Interface Descriptor size */ \
|
|
||||||
USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \
|
|
||||||
0x00, /* bInterfaceNumber: Number of Interface */ \
|
|
||||||
(n), /* bAlternateSetting: Alternate setting */ \
|
|
||||||
0x00, /* bNumEndpoints*/ \
|
|
||||||
0xFE, /* bInterfaceClass: Application Specific Class Code */ \
|
|
||||||
0x01, /* bInterfaceSubClass : Device Firmware Upgrade Code */ \
|
|
||||||
0x02, /* nInterfaceProtocol: DFU mode protocol */ \
|
|
||||||
USBD_IDX_INTERFACE_STR + (n) + 1 /* iInterface: Index of string descriptor */ \
|
|
||||||
/* 18 */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_CORE_Exported_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
extern USBD_Class_cb_TypeDef DFU_cb;
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_CORE_Exported_Functions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#endif // __USB_DFU_CORE_H_
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
@ -1,79 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_dfu_mal.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief Header for usbd_dfu_mal.c file.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __DFU_MAL_H
|
|
||||||
#define __DFU_MAL_H
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#ifdef STM32F2XX
|
|
||||||
#include "stm32f2xx.h"
|
|
||||||
#elif defined(STM32F10X_CL)
|
|
||||||
#include "stm32f10x.h"
|
|
||||||
#endif /* STM32F2XX */
|
|
||||||
|
|
||||||
#include "usbd_conf.h"
|
|
||||||
#include "usbd_dfu_core.h"
|
|
||||||
|
|
||||||
/* Exported types ------------------------------------------------------------*/
|
|
||||||
typedef struct _DFU_MAL_PROP
|
|
||||||
{
|
|
||||||
const uint8_t* pStrDesc;
|
|
||||||
uint16_t (*pMAL_Init) (void);
|
|
||||||
uint16_t (*pMAL_DeInit) (void);
|
|
||||||
uint16_t (*pMAL_Erase) (uint32_t Add);
|
|
||||||
uint16_t (*pMAL_Write) (uint32_t Add, uint32_t Len);
|
|
||||||
uint8_t *(*pMAL_Read) (uint32_t Add, uint32_t Len);
|
|
||||||
uint16_t (*pMAL_CheckAdd) (uint32_t Add);
|
|
||||||
const uint32_t EraseTiming;
|
|
||||||
const uint32_t WriteTiming;
|
|
||||||
}
|
|
||||||
DFU_MAL_Prop_TypeDef;
|
|
||||||
|
|
||||||
|
|
||||||
/* Exported constants --------------------------------------------------------*/
|
|
||||||
#define MAL_OK 0
|
|
||||||
#define MAL_FAIL 1
|
|
||||||
|
|
||||||
/* utils macro ---------------------------------------------------------------*/
|
|
||||||
#define _1st_BYTE(x) (uint8_t)((x)&0xFF) /* 1st addressing cycle */
|
|
||||||
#define _2nd_BYTE(x) (uint8_t)(((x)&0xFF00)>>8) /* 2nd addressing cycle */
|
|
||||||
#define _3rd_BYTE(x) (uint8_t)(((x)&0xFF0000)>>16) /* 3rd addressing cycle */
|
|
||||||
#define _4th_BYTE(x) (uint8_t)(((x)&0xFF000000)>>24) /* 4th addressing cycle */
|
|
||||||
|
|
||||||
/* Exported macro ------------------------------------------------------------*/
|
|
||||||
#define SET_POLLING_TIMING(x) buffer[1] = _1st_BYTE(x);\
|
|
||||||
buffer[2] = _2nd_BYTE(x);\
|
|
||||||
buffer[3] = _3rd_BYTE(x);
|
|
||||||
|
|
||||||
/* Exported functions ------------------------------------------------------- */
|
|
||||||
|
|
||||||
uint16_t MAL_Init (void);
|
|
||||||
uint16_t MAL_DeInit (void);
|
|
||||||
uint16_t MAL_Erase (uint32_t SectorAddress);
|
|
||||||
uint16_t MAL_Write (uint32_t SectorAddress, uint32_t DataLength);
|
|
||||||
uint8_t *MAL_Read (uint32_t SectorAddress, uint32_t DataLength);
|
|
||||||
uint16_t MAL_GetStatus(uint32_t SectorAddress ,uint8_t Cmd, uint8_t *buffer);
|
|
||||||
|
|
||||||
extern uint8_t MAL_Buffer[XFERSIZE]; /* RAM Buffer for Downloaded Data */
|
|
||||||
#endif /* __DFU_MAL_H */
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
@ -1,49 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_flash_if.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0RC1
|
|
||||||
* @date 18-March-2011
|
|
||||||
* @brief Header for usbd_flash_if.c file.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __FLASH_IF_MAL_H
|
|
||||||
#define __FLASH_IF_MAL_H
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_dfu_mal.h"
|
|
||||||
|
|
||||||
/* Exported types ------------------------------------------------------------*/
|
|
||||||
/* Exported constants --------------------------------------------------------*/
|
|
||||||
#define FLASH_START_ADD 0x08000000
|
|
||||||
|
|
||||||
#ifdef STM32F2XX
|
|
||||||
#define FLASH_END_ADD 0x08100000
|
|
||||||
#define FLASH_IF_STRING "@Internal Flash /0x08000000/03*016Ka,01*016Kg,01*064Kg,07*128Kg"
|
|
||||||
#elif defined(STM32F10X_CL)
|
|
||||||
#define FLASH_END_ADD 0x08040000
|
|
||||||
#define FLASH_IF_STRING "@Internal Flash /0x08000000/06*002Ka,122*002Kg"
|
|
||||||
#endif /* STM32F2XX */
|
|
||||||
|
|
||||||
|
|
||||||
extern DFU_MAL_Prop_TypeDef DFU_Flash_cb;
|
|
||||||
|
|
||||||
/* Exported macro ------------------------------------------------------------*/
|
|
||||||
/* Exported functions ------------------------------------------------------- */
|
|
||||||
|
|
||||||
#endif /* __FLASH_IF_MAL_H */
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
@ -1,46 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_mem_if_template.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief Header for usbd_mem_if_template.c file.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __MEM_IF_MAL_H
|
|
||||||
#define __MEM_IF_MAL_H
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#ifdef STM32F2XX
|
|
||||||
#include "stm32f2xx.h"
|
|
||||||
#endif /* STM32F2XX */
|
|
||||||
#include "usbd_dfu_mal.h"
|
|
||||||
|
|
||||||
/* Exported types ------------------------------------------------------------*/
|
|
||||||
/* Exported constants --------------------------------------------------------*/
|
|
||||||
#define MEM_START_ADD 0x00000000 /* Dummy start address */
|
|
||||||
#define MEM_END_ADD (uint32_t)(MEM_START_ADD + (5 * 1024)) /* Dummy Size = 5KB */
|
|
||||||
|
|
||||||
#define MEM_IF_STRING "@Dummy Memory /0x00000000/01*002Kg,03*001Kg"
|
|
||||||
|
|
||||||
extern DFU_MAL_Prop_TypeDef DFU_Mem_cb;
|
|
||||||
|
|
||||||
/* Exported macro ------------------------------------------------------------*/
|
|
||||||
/* Exported functions ------------------------------------------------------- */
|
|
||||||
|
|
||||||
#endif /* __MEM_IF_MAL_H */
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
@ -1,43 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_otp_if.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief Header for usbd_otp_if.c file.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __OTP_IF_MAL_H
|
|
||||||
#define __OTP_IF_MAL_H
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_dfu_mal.h"
|
|
||||||
|
|
||||||
/* Exported types ------------------------------------------------------------*/
|
|
||||||
/* Exported constants --------------------------------------------------------*/
|
|
||||||
#define OTP_START_ADD 0x1FFF7800
|
|
||||||
#define OTP_END_ADD (uint32_t)(OTP_START_ADD + 528)
|
|
||||||
|
|
||||||
#define OTP_IF_STRING "@OTP Area /0x1FFF7800/01*512 g,01*016 g"
|
|
||||||
|
|
||||||
extern DFU_MAL_Prop_TypeDef DFU_Otp_cb;
|
|
||||||
|
|
||||||
/* Exported macro ------------------------------------------------------------*/
|
|
||||||
/* Exported functions ------------------------------------------------------- */
|
|
||||||
|
|
||||||
#endif /* __OTP_IF_MAL_H */
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
File diff suppressed because it is too large
Load Diff
@ -1,281 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_dfu_mal.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief Generic media access Layer.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_dfu_mal.h"
|
|
||||||
|
|
||||||
#include "usbd_flash_if.h"
|
|
||||||
|
|
||||||
#ifdef DFU_MAL_SUPPORT_OTP
|
|
||||||
#include "usbd_otp_if.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef DFU_MAL_SUPPORT_MEM
|
|
||||||
#include "usbd_mem_if_template.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Private typedef -----------------------------------------------------------*/
|
|
||||||
/* Private define ------------------------------------------------------------*/
|
|
||||||
/* Private macro -------------------------------------------------------------*/
|
|
||||||
/* Private variables ---------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Global Memories callback and string descriptors reference tables.
|
|
||||||
To add a new memory, modify the value of MAX_USED_MEDIA in usbd_dfu_mal.h
|
|
||||||
and add the pointer to the callback structure in this table.
|
|
||||||
Then add the pointer to the memory string descriptor in usbd_dfu_StringDesc table.
|
|
||||||
No other operation is required. */
|
|
||||||
DFU_MAL_Prop_TypeDef* tMALTab[MAX_USED_MEDIA] = {
|
|
||||||
&DFU_Flash_cb
|
|
||||||
#ifdef DFU_MAL_SUPPORT_OTP
|
|
||||||
, &DFU_Otp_cb
|
|
||||||
#endif
|
|
||||||
#ifdef DFU_MAL_SUPPORT_MEM
|
|
||||||
, &DFU_Mem_cb
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
|
||||||
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
|
||||||
#pragma data_alignment=4
|
|
||||||
#endif
|
|
||||||
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
|
||||||
|
|
||||||
__ALIGN_BEGIN const uint8_t* usbd_dfu_StringDesc[MAX_USED_MEDIA] __ALIGN_END = {
|
|
||||||
FLASH_IF_STRING
|
|
||||||
#ifdef DFU_MAL_SUPPORT_OTP
|
|
||||||
, OTP_IF_STRING
|
|
||||||
#endif
|
|
||||||
#ifdef DFU_MAL_SUPPORT_MEM
|
|
||||||
, MEM_IF_STRING
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
|
||||||
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
|
||||||
#pragma data_alignment=4
|
|
||||||
#endif
|
|
||||||
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
|
||||||
/* RAM Buffer for Downloaded Data */
|
|
||||||
__ALIGN_BEGIN uint8_t MAL_Buffer[XFERSIZE] __ALIGN_END ;
|
|
||||||
|
|
||||||
/* Private function prototypes -----------------------------------------------*/
|
|
||||||
static uint8_t MAL_CheckAdd (uint32_t Add);
|
|
||||||
/* Private functions ---------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief MAL_Init
|
|
||||||
* Initializes the Media on the STM32
|
|
||||||
* @param None
|
|
||||||
* @retval Result of the opeartion (MAL_OK in all cases)
|
|
||||||
*/
|
|
||||||
uint16_t MAL_Init(void)
|
|
||||||
{
|
|
||||||
uint32_t memIdx = 0;
|
|
||||||
|
|
||||||
/* Init all supported memories */
|
|
||||||
for(memIdx = 0; memIdx < MAX_USED_MEDIA; memIdx++)
|
|
||||||
{
|
|
||||||
/* If the check addres is positive, exit with the memory index */
|
|
||||||
if (tMALTab[memIdx]->pMAL_Init != NULL)
|
|
||||||
{
|
|
||||||
tMALTab[memIdx]->pMAL_Init();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return MAL_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief MAL_DeInit
|
|
||||||
* DeInitializes the Media on the STM32
|
|
||||||
* @param None
|
|
||||||
* @retval Result of the opeartion (MAL_OK in all cases)
|
|
||||||
*/
|
|
||||||
uint16_t MAL_DeInit(void)
|
|
||||||
{
|
|
||||||
uint32_t memIdx = 0;
|
|
||||||
|
|
||||||
/* Init all supported memories */
|
|
||||||
for(memIdx = 0; memIdx < MAX_USED_MEDIA; memIdx++)
|
|
||||||
{
|
|
||||||
/* Check if the command is supported */
|
|
||||||
if (tMALTab[memIdx]->pMAL_DeInit != NULL)
|
|
||||||
{
|
|
||||||
tMALTab[memIdx]->pMAL_DeInit();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return MAL_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief MAL_Erase
|
|
||||||
* Erase a sector of memory.
|
|
||||||
* @param Add: Sector address/code
|
|
||||||
* @retval Result of the opeartion: MAL_OK if all operations are OK else MAL_FAIL
|
|
||||||
*/
|
|
||||||
uint16_t MAL_Erase(uint32_t Add)
|
|
||||||
{
|
|
||||||
uint32_t memIdx = MAL_CheckAdd(Add);
|
|
||||||
|
|
||||||
/* Check if the area is protected */
|
|
||||||
if (DFU_MAL_IS_PROTECTED_AREA(Add))
|
|
||||||
{
|
|
||||||
return MAL_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (memIdx < MAX_USED_MEDIA)
|
|
||||||
{
|
|
||||||
/* Check if the command is supported */
|
|
||||||
if (tMALTab[memIdx]->pMAL_Erase != NULL)
|
|
||||||
{
|
|
||||||
return tMALTab[memIdx]->pMAL_Erase(Add);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return MAL_FAIL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return MAL_FAIL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief MAL_Write
|
|
||||||
* Write sectors of memory.
|
|
||||||
* @param Add: Sector address/code
|
|
||||||
* @param Len: Number of data to be written (in bytes)
|
|
||||||
* @retval Result of the opeartion: MAL_OK if all operations are OK else MAL_FAIL
|
|
||||||
*/
|
|
||||||
uint16_t MAL_Write (uint32_t Add, uint32_t Len)
|
|
||||||
{
|
|
||||||
uint32_t memIdx = MAL_CheckAdd(Add);
|
|
||||||
|
|
||||||
/* Check if the area is protected */
|
|
||||||
if (DFU_MAL_IS_PROTECTED_AREA(Add))
|
|
||||||
{
|
|
||||||
return MAL_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (memIdx < MAX_USED_MEDIA)
|
|
||||||
{
|
|
||||||
/* Check if the command is supported */
|
|
||||||
if (tMALTab[memIdx]->pMAL_Write != NULL)
|
|
||||||
{
|
|
||||||
return tMALTab[memIdx]->pMAL_Write(Add, Len);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return MAL_FAIL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return MAL_FAIL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief MAL_Read
|
|
||||||
* Read sectors of memory.
|
|
||||||
* @param Add: Sector address/code
|
|
||||||
* @param Len: Number of data to be written (in bytes)
|
|
||||||
* @retval Buffer pointer
|
|
||||||
*/
|
|
||||||
uint8_t *MAL_Read (uint32_t Add, uint32_t Len)
|
|
||||||
{
|
|
||||||
uint32_t memIdx = MAL_CheckAdd(Add);
|
|
||||||
|
|
||||||
if (memIdx < MAX_USED_MEDIA)
|
|
||||||
{
|
|
||||||
/* Check if the command is supported */
|
|
||||||
if (tMALTab[memIdx]->pMAL_Read != NULL)
|
|
||||||
{
|
|
||||||
return tMALTab[memIdx]->pMAL_Read(Add, Len);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return MAL_Buffer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return MAL_Buffer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief MAL_GetStatus
|
|
||||||
* Get the status of a given memory.
|
|
||||||
* @param Add: Sector address/code (allow to determine which memory will be addressed)
|
|
||||||
* @param Cmd: 0 for erase and 1 for write
|
|
||||||
* @param buffer: pointer to the buffer where the status data will be stored.
|
|
||||||
* @retval Buffer pointer
|
|
||||||
*/
|
|
||||||
uint16_t MAL_GetStatus(uint32_t Add , uint8_t Cmd, uint8_t *buffer)
|
|
||||||
{
|
|
||||||
uint32_t memIdx = MAL_CheckAdd(Add);
|
|
||||||
|
|
||||||
if (memIdx < MAX_USED_MEDIA)
|
|
||||||
{
|
|
||||||
if (Cmd & 0x01)
|
|
||||||
{
|
|
||||||
SET_POLLING_TIMING(tMALTab[memIdx]->EraseTiming);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SET_POLLING_TIMING(tMALTab[memIdx]->WriteTiming);
|
|
||||||
}
|
|
||||||
|
|
||||||
return MAL_OK;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return MAL_FAIL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief MAL_CheckAdd
|
|
||||||
* Determine which memory should be managed.
|
|
||||||
* @param Add: Sector address/code (allow to determine which memory will be addressed)
|
|
||||||
* @retval Index of the addressed memory.
|
|
||||||
*/
|
|
||||||
static uint8_t MAL_CheckAdd(uint32_t Add)
|
|
||||||
{
|
|
||||||
uint32_t memIdx = 0;
|
|
||||||
|
|
||||||
/* Check with all supported memories */
|
|
||||||
for(memIdx = 0; memIdx < MAX_USED_MEDIA; memIdx++)
|
|
||||||
{
|
|
||||||
/* If the check addres is positive, exit with the memory index */
|
|
||||||
if (tMALTab[memIdx]->pMAL_CheckAdd(Add) == MAL_OK)
|
|
||||||
{
|
|
||||||
return memIdx;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* If no memory found, return MAX_USED_MEDIA */
|
|
||||||
return (MAX_USED_MEDIA);
|
|
||||||
}
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
@ -1,221 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_flash_if.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief Specific media access Layer for internal flash.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_flash_if.h"
|
|
||||||
#include "usbd_dfu_mal.h"
|
|
||||||
|
|
||||||
/* Private typedef -----------------------------------------------------------*/
|
|
||||||
/* Private define ------------------------------------------------------------*/
|
|
||||||
/* Private macro -------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Private function prototypes -----------------------------------------------*/
|
|
||||||
uint16_t FLASH_If_Init(void);
|
|
||||||
uint16_t FLASH_If_Erase (uint32_t Add);
|
|
||||||
uint16_t FLASH_If_Write (uint32_t Add, uint32_t Len);
|
|
||||||
uint8_t *FLASH_If_Read (uint32_t Add, uint32_t Len);
|
|
||||||
uint16_t FLASH_If_DeInit(void);
|
|
||||||
uint16_t FLASH_If_CheckAdd(uint32_t Add);
|
|
||||||
|
|
||||||
|
|
||||||
/* Private variables ---------------------------------------------------------*/
|
|
||||||
DFU_MAL_Prop_TypeDef DFU_Flash_cb =
|
|
||||||
{
|
|
||||||
FLASH_IF_STRING,
|
|
||||||
FLASH_If_Init,
|
|
||||||
FLASH_If_DeInit,
|
|
||||||
FLASH_If_Erase,
|
|
||||||
FLASH_If_Write,
|
|
||||||
FLASH_If_Read,
|
|
||||||
FLASH_If_CheckAdd,
|
|
||||||
50, /* Erase Time in ms */
|
|
||||||
50 /* Programming Time in ms */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Private functions ---------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief FLASH_If_Init
|
|
||||||
* Memory initialization routine.
|
|
||||||
* @param None
|
|
||||||
* @retval MAL_OK if operation is successeful, MAL_FAIL else.
|
|
||||||
*/
|
|
||||||
uint16_t FLASH_If_Init(void)
|
|
||||||
{
|
|
||||||
/* Unlock the internal flash */
|
|
||||||
FLASH_Unlock();
|
|
||||||
|
|
||||||
return MAL_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief FLASH_If_DeInit
|
|
||||||
* Memory deinitialization routine.
|
|
||||||
* @param None
|
|
||||||
* @retval MAL_OK if operation is successeful, MAL_FAIL else.
|
|
||||||
*/
|
|
||||||
uint16_t FLASH_If_DeInit(void)
|
|
||||||
{
|
|
||||||
/* Lock the internal flash */
|
|
||||||
FLASH_Lock();
|
|
||||||
|
|
||||||
return MAL_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Function Name : FLASH_If_Erase
|
|
||||||
* Description : Erase sector
|
|
||||||
* Input : None
|
|
||||||
* Output : None
|
|
||||||
* Return : None
|
|
||||||
*******************************************************************************/
|
|
||||||
uint16_t FLASH_If_Erase(uint32_t Add)
|
|
||||||
{
|
|
||||||
#ifdef STM32F2XX
|
|
||||||
/* Check which sector has to be erased */
|
|
||||||
if (Add < 0x08004000)
|
|
||||||
{
|
|
||||||
FLASH_EraseSector(FLASH_Sector_0, VoltageRange_3);
|
|
||||||
}
|
|
||||||
else if (Add < 0x08008000)
|
|
||||||
{
|
|
||||||
FLASH_EraseSector(FLASH_Sector_1, VoltageRange_3);
|
|
||||||
}
|
|
||||||
else if (Add < 0x0800C000)
|
|
||||||
{
|
|
||||||
FLASH_EraseSector(FLASH_Sector_2, VoltageRange_3);
|
|
||||||
}
|
|
||||||
else if (Add < 0x08010000)
|
|
||||||
{
|
|
||||||
FLASH_EraseSector(FLASH_Sector_3, VoltageRange_3);
|
|
||||||
}
|
|
||||||
else if (Add < 0x08020000)
|
|
||||||
{
|
|
||||||
FLASH_EraseSector(FLASH_Sector_4, VoltageRange_3);
|
|
||||||
}
|
|
||||||
else if (Add < 0x08040000)
|
|
||||||
{
|
|
||||||
FLASH_EraseSector(FLASH_Sector_5, VoltageRange_3);
|
|
||||||
}
|
|
||||||
else if (Add < 0x08060000)
|
|
||||||
{
|
|
||||||
FLASH_EraseSector(FLASH_Sector_6, VoltageRange_3);
|
|
||||||
}
|
|
||||||
else if (Add < 0x08080000)
|
|
||||||
{
|
|
||||||
FLASH_EraseSector(FLASH_Sector_7, VoltageRange_3);
|
|
||||||
}
|
|
||||||
else if (Add < 0x080A0000)
|
|
||||||
{
|
|
||||||
FLASH_EraseSector(FLASH_Sector_8, VoltageRange_3);
|
|
||||||
}
|
|
||||||
else if (Add < 0x080C0000)
|
|
||||||
{
|
|
||||||
FLASH_EraseSector(FLASH_Sector_9, VoltageRange_3);
|
|
||||||
}
|
|
||||||
else if (Add < 0x080E0000)
|
|
||||||
{
|
|
||||||
FLASH_EraseSector(FLASH_Sector_10, VoltageRange_3);
|
|
||||||
}
|
|
||||||
else if (Add < 0x08100000)
|
|
||||||
{
|
|
||||||
FLASH_EraseSector(FLASH_Sector_11, VoltageRange_3);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return MAL_FAIL;
|
|
||||||
}
|
|
||||||
#elif defined(STM32F10X_CL)
|
|
||||||
/* Call the standard Flash erase function */
|
|
||||||
FLASH_ErasePage(Add);
|
|
||||||
#endif /* STM32F2XX */
|
|
||||||
|
|
||||||
return MAL_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief FLASH_If_Write
|
|
||||||
* Memory write routine.
|
|
||||||
* @param Add: Address to be written to.
|
|
||||||
* @param Len: Number of data to be written (in bytes).
|
|
||||||
* @retval MAL_OK if operation is successeful, MAL_FAIL else.
|
|
||||||
*/
|
|
||||||
uint16_t FLASH_If_Write(uint32_t Add, uint32_t Len)
|
|
||||||
{
|
|
||||||
uint32_t idx = 0;
|
|
||||||
|
|
||||||
if (Len & 0x3) /* Not an aligned data */
|
|
||||||
{
|
|
||||||
for (idx = Len; idx < ((Len & 0xFFFC) + 4); idx++)
|
|
||||||
{
|
|
||||||
MAL_Buffer[idx] = 0xFF;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Data received are Word multiple */
|
|
||||||
for (idx = 0; idx < Len; idx = idx + 4)
|
|
||||||
{
|
|
||||||
FLASH_ProgramWord(Add, *(uint32_t *)(MAL_Buffer + idx));
|
|
||||||
Add += 4;
|
|
||||||
}
|
|
||||||
return MAL_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief FLASH_If_Read
|
|
||||||
* Memory read routine.
|
|
||||||
* @param Add: Address to be read from.
|
|
||||||
* @param Len: Number of data to be read (in bytes).
|
|
||||||
* @retval Pointer to the phyisical address where data should be read.
|
|
||||||
*/
|
|
||||||
uint8_t *FLASH_If_Read (uint32_t Add, uint32_t Len)
|
|
||||||
{
|
|
||||||
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
|
||||||
uint32_t idx = 0;
|
|
||||||
for (idx = 0; idx < Len; idx += 4)
|
|
||||||
{
|
|
||||||
*(uint32_t*)(MAL_Buffer + idx) = *(uint32_t *)(Add + idx);
|
|
||||||
}
|
|
||||||
return (uint8_t*)(MAL_Buffer);
|
|
||||||
#else
|
|
||||||
return (uint8_t *)(Add);
|
|
||||||
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief FLASH_If_CheckAdd
|
|
||||||
* Check if the address is an allowed address for this memory.
|
|
||||||
* @param Add: Address to be checked.
|
|
||||||
* @param Len: Number of data to be read (in bytes).
|
|
||||||
* @retval MAL_OK if the address is allowed, MAL_FAIL else.
|
|
||||||
*/
|
|
||||||
uint16_t FLASH_If_CheckAdd(uint32_t Add)
|
|
||||||
{
|
|
||||||
if ((Add >= FLASH_START_ADD) && (Add < FLASH_END_ADD))
|
|
||||||
{
|
|
||||||
return MAL_OK;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return MAL_FAIL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
@ -1,133 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_mem_if_template.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief Specific media access Layer for a template memory. This file is
|
|
||||||
provided as template example showing how to implement a new memory
|
|
||||||
interface based on pre-defined API.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_mem_if_template.h"
|
|
||||||
#include "usbd_dfu_mal.h"
|
|
||||||
|
|
||||||
/* Private typedef -----------------------------------------------------------*/
|
|
||||||
/* Private define ------------------------------------------------------------*/
|
|
||||||
/* Private macro -------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Private function prototypes -----------------------------------------------*/
|
|
||||||
uint16_t MEM_If_Init(void);
|
|
||||||
uint16_t MEM_If_Erase (uint32_t Add);
|
|
||||||
uint16_t MEM_If_Write (uint32_t Add, uint32_t Len);
|
|
||||||
uint8_t *MEM_If_Read (uint32_t Add, uint32_t Len);
|
|
||||||
uint16_t MEM_If_DeInit(void);
|
|
||||||
uint16_t MEM_If_CheckAdd(uint32_t Add);
|
|
||||||
|
|
||||||
|
|
||||||
/* Private variables ---------------------------------------------------------*/
|
|
||||||
DFU_MAL_Prop_TypeDef DFU_Mem_cb =
|
|
||||||
{
|
|
||||||
MEM_IF_STRING,
|
|
||||||
MEM_If_Init,
|
|
||||||
MEM_If_DeInit,
|
|
||||||
MEM_If_Erase,
|
|
||||||
MEM_If_Write,
|
|
||||||
MEM_If_Read,
|
|
||||||
MEM_If_CheckAdd,
|
|
||||||
10, /* Erase Time in ms */
|
|
||||||
10 /* Programming Time in ms */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Private functions ---------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief MEM_If_Init
|
|
||||||
* Memory initialization routine.
|
|
||||||
* @param None
|
|
||||||
* @retval MAL_OK if operation is successeful, MAL_FAIL else.
|
|
||||||
*/
|
|
||||||
uint16_t MEM_If_Init(void)
|
|
||||||
{
|
|
||||||
return MAL_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief MEM_If_DeInit
|
|
||||||
* Memory deinitialization routine.
|
|
||||||
* @param None
|
|
||||||
* @retval MAL_OK if operation is successeful, MAL_FAIL else.
|
|
||||||
*/
|
|
||||||
uint16_t MEM_If_DeInit(void)
|
|
||||||
{
|
|
||||||
return MAL_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief MEM_If_Erase
|
|
||||||
* Erase sector.
|
|
||||||
* @param Add: Address of sector to be erased.
|
|
||||||
* @retval MAL_OK if operation is successeful, MAL_FAIL else.
|
|
||||||
*/
|
|
||||||
uint16_t MEM_If_Erase(uint32_t Add)
|
|
||||||
{
|
|
||||||
return MAL_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief MEM_If_Write
|
|
||||||
* Memory write routine.
|
|
||||||
* @param Add: Address to be written to.
|
|
||||||
* @param Len: Number of data to be written (in bytes).
|
|
||||||
* @retval MAL_OK if operation is successeful, MAL_FAIL else.
|
|
||||||
*/
|
|
||||||
uint16_t MEM_If_Write(uint32_t Add, uint32_t Len)
|
|
||||||
{
|
|
||||||
return MAL_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief MEM_If_Read
|
|
||||||
* Memory read routine.
|
|
||||||
* @param Add: Address to be read from.
|
|
||||||
* @param Len: Number of data to be read (in bytes).
|
|
||||||
* @retval Pointer to the phyisical address where data should be read.
|
|
||||||
*/
|
|
||||||
uint8_t *MEM_If_Read (uint32_t Add, uint32_t Len)
|
|
||||||
{
|
|
||||||
/* Return a valid address to avoid HardFault */
|
|
||||||
return (uint8_t*)(MAL_Buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief MEM_If_CheckAdd
|
|
||||||
* Check if the address is an allowed address for this memory.
|
|
||||||
* @param Add: Address to be checked.
|
|
||||||
* @param Len: Number of data to be read (in bytes).
|
|
||||||
* @retval MAL_OK if the address is allowed, MAL_FAIL else.
|
|
||||||
*/
|
|
||||||
uint16_t MEM_If_CheckAdd(uint32_t Add)
|
|
||||||
{
|
|
||||||
if ((Add >= MEM_START_ADD) && (Add < MEM_END_ADD))
|
|
||||||
{
|
|
||||||
return MAL_OK;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return MAL_FAIL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
@ -1,120 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_otp_if.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief Specific media access Layer for OTP (One Time Programming) memory.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_otp_if.h"
|
|
||||||
#include "usbd_dfu_mal.h"
|
|
||||||
|
|
||||||
/* Private typedef -----------------------------------------------------------*/
|
|
||||||
/* Private define ------------------------------------------------------------*/
|
|
||||||
/* Private macro -------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Private function prototypes -----------------------------------------------*/
|
|
||||||
uint16_t OTP_If_Write (uint32_t Add, uint32_t Len);
|
|
||||||
uint8_t *OTP_If_Read (uint32_t Add, uint32_t Len);
|
|
||||||
uint16_t OTP_If_DeInit(void);
|
|
||||||
uint16_t OTP_If_CheckAdd(uint32_t Add);
|
|
||||||
|
|
||||||
|
|
||||||
/* Private variables ---------------------------------------------------------*/
|
|
||||||
DFU_MAL_Prop_TypeDef DFU_Otp_cb =
|
|
||||||
{
|
|
||||||
OTP_IF_STRING,
|
|
||||||
NULL, /* Init not supported*/
|
|
||||||
NULL, /* DeInit not supported */
|
|
||||||
NULL, /* Erase not supported */
|
|
||||||
OTP_If_Write,
|
|
||||||
OTP_If_Read,
|
|
||||||
OTP_If_CheckAdd,
|
|
||||||
1, /* Erase Time in ms */
|
|
||||||
10 /* Programming Time in ms */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Private functions ---------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief OTP_If_Write
|
|
||||||
* Memory write routine.
|
|
||||||
* @param Add: Address to be written to.
|
|
||||||
* @param Len: Number of data to be written (in bytes).
|
|
||||||
* @retval MAL_OK if operation is successeful, MAL_FAIL else.
|
|
||||||
*/
|
|
||||||
uint16_t OTP_If_Write(uint32_t Add, uint32_t Len)
|
|
||||||
{
|
|
||||||
uint32_t idx = 0;
|
|
||||||
|
|
||||||
if (Len & 0x3) /* Not an aligned data */
|
|
||||||
{
|
|
||||||
for (idx = Len; idx < ((Len & 0xFFFC) + 4); idx++)
|
|
||||||
{
|
|
||||||
MAL_Buffer[idx] = 0xFF;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Data received are Word multiple */
|
|
||||||
for (idx = 0; idx < Len; idx = idx + 4)
|
|
||||||
{
|
|
||||||
FLASH_ProgramWord(Add, *(uint32_t *)(MAL_Buffer + idx));
|
|
||||||
Add += 4;
|
|
||||||
}
|
|
||||||
return MAL_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief OTP_If_Read
|
|
||||||
* Memory read routine.
|
|
||||||
* @param Add: Address to be read from.
|
|
||||||
* @param Len: Number of data to be read (in bytes).
|
|
||||||
* @retval Pointer to the phyisical address where data should be read.
|
|
||||||
*/
|
|
||||||
uint8_t *OTP_If_Read (uint32_t Add, uint32_t Len)
|
|
||||||
{
|
|
||||||
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
|
||||||
uint32_t idx = 0;
|
|
||||||
for (idx = 0; idx < Len; idx += 4)
|
|
||||||
{
|
|
||||||
*(uint32_t*)(MAL_Buffer + idx) = *(uint32_t *)(Add + idx);
|
|
||||||
}
|
|
||||||
return (uint8_t*)(MAL_Buffer);
|
|
||||||
#else
|
|
||||||
return (uint8_t*)(Add);
|
|
||||||
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief OTP_If_CheckAdd
|
|
||||||
* Check if the address is an allowed address for this memory.
|
|
||||||
* @param Add: Address to be checked.
|
|
||||||
* @param Len: Number of data to be read (in bytes).
|
|
||||||
* @retval MAL_OK if the address is allowed, MAL_FAIL else.
|
|
||||||
*/
|
|
||||||
uint16_t OTP_If_CheckAdd(uint32_t Add)
|
|
||||||
{
|
|
||||||
if ((Add >= OTP_START_ADD) && (Add < OTP_END_ADD))
|
|
||||||
{
|
|
||||||
return MAL_OK;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return MAL_FAIL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
@ -1,110 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_hid_core.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief header file for the usbd_hid_core.c file.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef __USB_HID_CORE_H_
|
|
||||||
#define __USB_HID_CORE_H_
|
|
||||||
|
|
||||||
#include "usbd_ioreq.h"
|
|
||||||
|
|
||||||
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_HID
|
|
||||||
* @brief This file is the Header file for USBD_msc.c
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_HID_Exported_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
#define USB_HID_CONFIG_DESC_SIZ 34
|
|
||||||
#define USB_HID_DESC_SIZ 9
|
|
||||||
#define HID_MOUSE_REPORT_DESC_SIZE 74
|
|
||||||
|
|
||||||
#define HID_DESCRIPTOR_TYPE 0x21
|
|
||||||
#define HID_REPORT_DESC 0x22
|
|
||||||
|
|
||||||
|
|
||||||
#define HID_REQ_SET_PROTOCOL 0x0B
|
|
||||||
#define HID_REQ_GET_PROTOCOL 0x03
|
|
||||||
|
|
||||||
#define HID_REQ_SET_IDLE 0x0A
|
|
||||||
#define HID_REQ_GET_IDLE 0x02
|
|
||||||
|
|
||||||
#define HID_REQ_SET_REPORT 0x09
|
|
||||||
#define HID_REQ_GET_REPORT 0x01
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_CORE_Exported_TypesDefinitions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_CORE_Exported_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_CORE_Exported_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
extern USBD_Class_cb_TypeDef USBD_HID_cb;
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_CORE_Exported_Functions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
uint8_t USBD_HID_SendReport (USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
uint8_t *report,
|
|
||||||
uint16_t len);
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#endif // __USB_HID_CORE_H_
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
@ -1,460 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_hid_core.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief This file provides the HID core functions.
|
|
||||||
*
|
|
||||||
* @verbatim
|
|
||||||
*
|
|
||||||
* ===================================================================
|
|
||||||
* HID Class Description
|
|
||||||
* ===================================================================
|
|
||||||
* This module manages the HID class V1.11 following the "Device Class Definition
|
|
||||||
* for Human Interface Devices (HID) Version 1.11 Jun 27, 2001".
|
|
||||||
* This driver implements the following aspects of the specification:
|
|
||||||
* - The Boot Interface Subclass
|
|
||||||
* - The Mouse protocol
|
|
||||||
* - Usage Page : Generic Desktop
|
|
||||||
* - Usage : Joystick)
|
|
||||||
* - Collection : Application
|
|
||||||
*
|
|
||||||
* @note In HS mode and when the DMA is used, all variables and data structures
|
|
||||||
* dealing with the DMA during the transaction process should be 32-bit aligned.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @endverbatim
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_hid_core.h"
|
|
||||||
#include "usbd_desc.h"
|
|
||||||
#include "usbd_req.h"
|
|
||||||
|
|
||||||
|
|
||||||
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_HID
|
|
||||||
* @brief usbd core module
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_HID_Private_TypesDefinitions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_HID_Private_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_HID_Private_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_HID_Private_FunctionPrototypes
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
static uint8_t USBD_HID_Init (void *pdev,
|
|
||||||
uint8_t cfgidx);
|
|
||||||
|
|
||||||
static uint8_t USBD_HID_DeInit (void *pdev,
|
|
||||||
uint8_t cfgidx);
|
|
||||||
|
|
||||||
static uint8_t USBD_HID_Setup (void *pdev,
|
|
||||||
USB_SETUP_REQ *req);
|
|
||||||
|
|
||||||
static uint8_t *USBD_HID_GetCfgDesc (uint8_t speed, uint16_t *length);
|
|
||||||
|
|
||||||
static uint8_t USBD_HID_DataIn (void *pdev, uint8_t epnum);
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_HID_Private_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
USBD_Class_cb_TypeDef USBD_HID_cb =
|
|
||||||
{
|
|
||||||
USBD_HID_Init,
|
|
||||||
USBD_HID_DeInit,
|
|
||||||
USBD_HID_Setup,
|
|
||||||
NULL, /*EP0_TxSent*/
|
|
||||||
NULL, /*EP0_RxReady*/
|
|
||||||
USBD_HID_DataIn, /*DataIn*/
|
|
||||||
NULL, /*DataOut*/
|
|
||||||
NULL, /*SOF */
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
USBD_HID_GetCfgDesc,
|
|
||||||
#ifdef USB_OTG_HS_CORE
|
|
||||||
USBD_HID_GetCfgDesc, /* use same config as per FS */
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
|
||||||
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
|
||||||
#pragma data_alignment=4
|
|
||||||
#endif
|
|
||||||
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
|
||||||
__ALIGN_BEGIN static uint32_t USBD_HID_AltSet __ALIGN_END = 0;
|
|
||||||
|
|
||||||
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
|
||||||
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
|
||||||
#pragma data_alignment=4
|
|
||||||
#endif
|
|
||||||
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
|
||||||
__ALIGN_BEGIN static uint32_t USBD_HID_Protocol __ALIGN_END = 0;
|
|
||||||
|
|
||||||
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
|
||||||
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
|
||||||
#pragma data_alignment=4
|
|
||||||
#endif
|
|
||||||
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
|
||||||
__ALIGN_BEGIN static uint32_t USBD_HID_IdleState __ALIGN_END = 0;
|
|
||||||
|
|
||||||
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
|
||||||
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
|
||||||
#pragma data_alignment=4
|
|
||||||
#endif
|
|
||||||
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
|
||||||
/* USB HID device Configuration Descriptor */
|
|
||||||
__ALIGN_BEGIN static uint8_t USBD_HID_CfgDesc[USB_HID_CONFIG_DESC_SIZ] __ALIGN_END =
|
|
||||||
{
|
|
||||||
0x09, /* bLength: Configuration Descriptor size */
|
|
||||||
USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */
|
|
||||||
USB_HID_CONFIG_DESC_SIZ,
|
|
||||||
/* wTotalLength: Bytes returned */
|
|
||||||
0x00,
|
|
||||||
0x01, /*bNumInterfaces: 1 interface*/
|
|
||||||
0x01, /*bConfigurationValue: Configuration value*/
|
|
||||||
0x00, /*iConfiguration: Index of string descriptor describing
|
|
||||||
the configuration*/
|
|
||||||
0xE0, /*bmAttributes: bus powered and Support Remote Wake-up */
|
|
||||||
0x32, /*MaxPower 100 mA: this current is used for detecting Vbus*/
|
|
||||||
|
|
||||||
/************** Descriptor of Joystick Mouse interface ****************/
|
|
||||||
/* 09 */
|
|
||||||
0x09, /*bLength: Interface Descriptor size*/
|
|
||||||
USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType: Interface descriptor type*/
|
|
||||||
0x00, /*bInterfaceNumber: Number of Interface*/
|
|
||||||
0x00, /*bAlternateSetting: Alternate setting*/
|
|
||||||
0x01, /*bNumEndpoints*/
|
|
||||||
0x03, /*bInterfaceClass: HID*/
|
|
||||||
0x01, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/
|
|
||||||
0x02, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/
|
|
||||||
0, /*iInterface: Index of string descriptor*/
|
|
||||||
/******************** Descriptor of Joystick Mouse HID ********************/
|
|
||||||
/* 18 */
|
|
||||||
0x09, /*bLength: HID Descriptor size*/
|
|
||||||
HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/
|
|
||||||
0x11, /*bcdHID: HID Class Spec release number*/
|
|
||||||
0x01,
|
|
||||||
0x00, /*bCountryCode: Hardware target country*/
|
|
||||||
0x01, /*bNumDescriptors: Number of HID class descriptors to follow*/
|
|
||||||
0x22, /*bDescriptorType*/
|
|
||||||
HID_MOUSE_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/
|
|
||||||
0x00,
|
|
||||||
/******************** Descriptor of Mouse endpoint ********************/
|
|
||||||
/* 27 */
|
|
||||||
0x07, /*bLength: Endpoint Descriptor size*/
|
|
||||||
USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/
|
|
||||||
|
|
||||||
HID_IN_EP, /*bEndpointAddress: Endpoint Address (IN)*/
|
|
||||||
0x03, /*bmAttributes: Interrupt endpoint*/
|
|
||||||
HID_IN_PACKET, /*wMaxPacketSize: 4 Byte max */
|
|
||||||
0x00,
|
|
||||||
0x0A, /*bInterval: Polling Interval (10 ms)*/
|
|
||||||
/* 34 */
|
|
||||||
} ;
|
|
||||||
|
|
||||||
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
|
||||||
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
|
||||||
#pragma data_alignment=4
|
|
||||||
#endif
|
|
||||||
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
|
||||||
__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] __ALIGN_END =
|
|
||||||
{
|
|
||||||
0x05, 0x01,
|
|
||||||
0x09, 0x02,
|
|
||||||
0xA1, 0x01,
|
|
||||||
0x09, 0x01,
|
|
||||||
|
|
||||||
0xA1, 0x00,
|
|
||||||
0x05, 0x09,
|
|
||||||
0x19, 0x01,
|
|
||||||
0x29, 0x03,
|
|
||||||
|
|
||||||
0x15, 0x00,
|
|
||||||
0x25, 0x01,
|
|
||||||
0x95, 0x03,
|
|
||||||
0x75, 0x01,
|
|
||||||
|
|
||||||
0x81, 0x02,
|
|
||||||
0x95, 0x01,
|
|
||||||
0x75, 0x05,
|
|
||||||
0x81, 0x01,
|
|
||||||
|
|
||||||
0x05, 0x01,
|
|
||||||
0x09, 0x30,
|
|
||||||
0x09, 0x31,
|
|
||||||
0x09, 0x38,
|
|
||||||
|
|
||||||
0x15, 0x81,
|
|
||||||
0x25, 0x7F,
|
|
||||||
0x75, 0x08,
|
|
||||||
0x95, 0x03,
|
|
||||||
|
|
||||||
0x81, 0x06,
|
|
||||||
0xC0, 0x09,
|
|
||||||
0x3c, 0x05,
|
|
||||||
0xff, 0x09,
|
|
||||||
|
|
||||||
0x01, 0x15,
|
|
||||||
0x00, 0x25,
|
|
||||||
0x01, 0x75,
|
|
||||||
0x01, 0x95,
|
|
||||||
|
|
||||||
0x02, 0xb1,
|
|
||||||
0x22, 0x75,
|
|
||||||
0x06, 0x95,
|
|
||||||
0x01, 0xb1,
|
|
||||||
|
|
||||||
0x01, 0xc0
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_HID_Private_Functions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_HID_Init
|
|
||||||
* Initialize the HID interface
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param cfgidx: Configuration index
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint8_t USBD_HID_Init (void *pdev,
|
|
||||||
uint8_t cfgidx)
|
|
||||||
{
|
|
||||||
|
|
||||||
/* Open EP IN */
|
|
||||||
DCD_EP_Open(pdev,
|
|
||||||
HID_IN_EP,
|
|
||||||
HID_IN_PACKET,
|
|
||||||
USB_OTG_EP_INT);
|
|
||||||
|
|
||||||
/* Open EP OUT */
|
|
||||||
DCD_EP_Open(pdev,
|
|
||||||
HID_OUT_EP,
|
|
||||||
HID_OUT_PACKET,
|
|
||||||
USB_OTG_EP_INT);
|
|
||||||
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_HID_Init
|
|
||||||
* DeInitialize the HID layer
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param cfgidx: Configuration index
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint8_t USBD_HID_DeInit (void *pdev,
|
|
||||||
uint8_t cfgidx)
|
|
||||||
{
|
|
||||||
/* Close HID EPs */
|
|
||||||
DCD_EP_Close (pdev , HID_IN_EP);
|
|
||||||
DCD_EP_Close (pdev , HID_OUT_EP);
|
|
||||||
|
|
||||||
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_HID_Setup
|
|
||||||
* Handle the HID specific requests
|
|
||||||
* @param pdev: instance
|
|
||||||
* @param req: usb requests
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint8_t USBD_HID_Setup (void *pdev,
|
|
||||||
USB_SETUP_REQ *req)
|
|
||||||
{
|
|
||||||
uint16_t len = 0;
|
|
||||||
uint8_t *pbuf = NULL;
|
|
||||||
|
|
||||||
switch (req->bmRequest & USB_REQ_TYPE_MASK)
|
|
||||||
{
|
|
||||||
case USB_REQ_TYPE_CLASS :
|
|
||||||
switch (req->bRequest)
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
case HID_REQ_SET_PROTOCOL:
|
|
||||||
USBD_HID_Protocol = (uint8_t)(req->wValue);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HID_REQ_GET_PROTOCOL:
|
|
||||||
USBD_CtlSendData (pdev,
|
|
||||||
(uint8_t *)&USBD_HID_Protocol,
|
|
||||||
1);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HID_REQ_SET_IDLE:
|
|
||||||
USBD_HID_IdleState = (uint8_t)(req->wValue >> 8);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HID_REQ_GET_IDLE:
|
|
||||||
USBD_CtlSendData (pdev,
|
|
||||||
(uint8_t *)&USBD_HID_IdleState,
|
|
||||||
1);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
USBD_CtlError (pdev, req);
|
|
||||||
return USBD_FAIL;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case USB_REQ_TYPE_STANDARD:
|
|
||||||
switch (req->bRequest)
|
|
||||||
{
|
|
||||||
case USB_REQ_GET_DESCRIPTOR:
|
|
||||||
if( req->wValue >> 8 == HID_REPORT_DESC)
|
|
||||||
{
|
|
||||||
len = MIN(HID_MOUSE_REPORT_DESC_SIZE , req->wLength);
|
|
||||||
pbuf = HID_MOUSE_ReportDesc;
|
|
||||||
}
|
|
||||||
else if( req->wValue >> 8 == HID_DESCRIPTOR_TYPE)
|
|
||||||
{
|
|
||||||
|
|
||||||
//#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
|
||||||
// pbuf = USBD_HID_Desc;
|
|
||||||
//#else
|
|
||||||
pbuf = USBD_HID_CfgDesc + 0x12;
|
|
||||||
//#endif
|
|
||||||
len = MIN(USB_HID_DESC_SIZ , req->wLength);
|
|
||||||
}
|
|
||||||
|
|
||||||
USBD_CtlSendData (pdev,
|
|
||||||
pbuf,
|
|
||||||
len);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case USB_REQ_GET_INTERFACE :
|
|
||||||
USBD_CtlSendData (pdev,
|
|
||||||
(uint8_t *)&USBD_HID_AltSet,
|
|
||||||
1);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case USB_REQ_SET_INTERFACE :
|
|
||||||
USBD_HID_AltSet = (uint8_t)(req->wValue);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_HID_SendReport
|
|
||||||
* Send HID Report
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param buff: pointer to report
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
uint8_t USBD_HID_SendReport (USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
uint8_t *report,
|
|
||||||
uint16_t len)
|
|
||||||
{
|
|
||||||
if (pdev->dev.device_status == USB_OTG_CONFIGURED )
|
|
||||||
{
|
|
||||||
DCD_EP_Tx (pdev, HID_IN_EP, report, len);
|
|
||||||
}
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_HID_GetCfgDesc
|
|
||||||
* return configuration descriptor
|
|
||||||
* @param speed : current device speed
|
|
||||||
* @param length : pointer data length
|
|
||||||
* @retval pointer to descriptor buffer
|
|
||||||
*/
|
|
||||||
static uint8_t *USBD_HID_GetCfgDesc (uint8_t speed, uint16_t *length)
|
|
||||||
{
|
|
||||||
*length = sizeof (USBD_HID_CfgDesc);
|
|
||||||
return USBD_HID_CfgDesc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_HID_DataIn
|
|
||||||
* handle data IN Stage
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param epnum: endpoint index
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint8_t USBD_HID_DataIn (void *pdev,
|
|
||||||
uint8_t epnum)
|
|
||||||
{
|
|
||||||
|
|
||||||
/* Ensure that the FIFO is empty before a new transfer, this condition could
|
|
||||||
be caused by a new transfer before the end of the previous transfer */
|
|
||||||
DCD_EP_Flush(pdev, HID_IN_EP);
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
@ -1,147 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_msc_bot.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief header for the usbd_msc_bot.c file
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
|
|
||||||
#include "usbd_core.h"
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __USBD_MSC_BOT_H
|
|
||||||
#define __USBD_MSC_BOT_H
|
|
||||||
|
|
||||||
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup MSC_BOT
|
|
||||||
* @brief This file is the Header file for usbd_bot.c
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_CORE_Exported_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
#define BOT_IDLE 0 /* Idle state */
|
|
||||||
#define BOT_DATA_OUT 1 /* Data Out state */
|
|
||||||
#define BOT_DATA_IN 2 /* Data In state */
|
|
||||||
#define BOT_LAST_DATA_IN 3 /* Last Data In Last */
|
|
||||||
#define BOT_SEND_DATA 4 /* Send Immediate data */
|
|
||||||
|
|
||||||
#define BOT_CBW_SIGNATURE 0x43425355
|
|
||||||
#define BOT_CSW_SIGNATURE 0x53425355
|
|
||||||
#define BOT_CBW_LENGTH 31
|
|
||||||
#define BOT_CSW_LENGTH 13
|
|
||||||
|
|
||||||
/* CSW Status Definitions */
|
|
||||||
#define CSW_CMD_PASSED 0x00
|
|
||||||
#define CSW_CMD_FAILED 0x01
|
|
||||||
#define CSW_PHASE_ERROR 0x02
|
|
||||||
|
|
||||||
/* BOT Status */
|
|
||||||
#define BOT_STATE_NORMAL 0
|
|
||||||
#define BOT_STATE_RECOVERY 1
|
|
||||||
#define BOT_STATE_ERROR 2
|
|
||||||
|
|
||||||
|
|
||||||
#define DIR_IN 0
|
|
||||||
#define DIR_OUT 1
|
|
||||||
#define BOTH_DIR 2
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup MSC_CORE_Private_TypesDefinitions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef struct _MSC_BOT_CBW
|
|
||||||
{
|
|
||||||
uint32_t dSignature;
|
|
||||||
uint32_t dTag;
|
|
||||||
uint32_t dDataLength;
|
|
||||||
uint8_t bmFlags;
|
|
||||||
uint8_t bLUN;
|
|
||||||
uint8_t bCBLength;
|
|
||||||
uint8_t CB[16];
|
|
||||||
}
|
|
||||||
MSC_BOT_CBW_TypeDef;
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct _MSC_BOT_CSW
|
|
||||||
{
|
|
||||||
uint32_t dSignature;
|
|
||||||
uint32_t dTag;
|
|
||||||
uint32_t dDataResidue;
|
|
||||||
uint8_t bStatus;
|
|
||||||
}
|
|
||||||
MSC_BOT_CSW_TypeDef;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_CORE_Exported_Types
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
extern uint8_t MSC_BOT_Data[];
|
|
||||||
extern uint16_t MSC_BOT_DataLen;
|
|
||||||
extern uint8_t MSC_BOT_State;
|
|
||||||
extern uint8_t MSC_BOT_BurstMode;
|
|
||||||
extern MSC_BOT_CBW_TypeDef MSC_BOT_cbw;
|
|
||||||
extern MSC_BOT_CSW_TypeDef MSC_BOT_csw;
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
/** @defgroup USBD_CORE_Exported_FunctionsPrototypes
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
void MSC_BOT_Init (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
void MSC_BOT_Reset (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
void MSC_BOT_DeInit (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
void MSC_BOT_DataIn (USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
uint8_t epnum);
|
|
||||||
|
|
||||||
void MSC_BOT_DataOut (USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
uint8_t epnum);
|
|
||||||
|
|
||||||
void MSC_BOT_SendCSW (USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
uint8_t CSW_Status);
|
|
||||||
|
|
||||||
void MSC_BOT_CplClrFeature (USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
uint8_t epnum);
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#endif /* __USBD_MSC_BOT_H */
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
||||||
|
|
@ -1,72 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_msc_core.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief header for the usbd_msc_core.c file
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef _USB_MSC_CORE_H_
|
|
||||||
#define _USB_MSC_CORE_H_
|
|
||||||
|
|
||||||
#include "usbd_ioreq.h"
|
|
||||||
|
|
||||||
/** @addtogroup USBD_MSC_BOT
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_MSC
|
|
||||||
* @brief This file is the Header file for USBD_msc.c
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_BOT_Exported_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#define BOT_GET_MAX_LUN 0xFE
|
|
||||||
#define BOT_RESET 0xFF
|
|
||||||
#define USB_MSC_CONFIG_DESC_SIZ 32
|
|
||||||
|
|
||||||
#define MSC_EPIN_SIZE *(uint16_t *)(((USB_OTG_CORE_HANDLE *)pdev)->dev.pConfig_descriptor + 22)
|
|
||||||
|
|
||||||
#define MSC_EPOUT_SIZE *(uint16_t *)(((USB_OTG_CORE_HANDLE *)pdev)->dev.pConfig_descriptor + 29)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_CORE_Exported_Types
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
extern USBD_Class_cb_TypeDef USBD_MSC_cb;
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
#endif // _USB_MSC_CORE_H_
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
@ -1,98 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_msc_data.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief header for the usbd_msc_data.c file
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef _USBD_MSC_DATA_H_
|
|
||||||
#define _USBD_MSC_DATA_H_
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_conf.h"
|
|
||||||
|
|
||||||
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_INFO
|
|
||||||
* @brief general defines for the usb device library file
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_INFO_Exported_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
#define MODE_SENSE6_LEN 8
|
|
||||||
#define MODE_SENSE10_LEN 8
|
|
||||||
#define LENGTH_INQUIRY_PAGE00 7
|
|
||||||
#define LENGTH_FORMAT_CAPACITIES 20
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_INFO_Exported_TypesDefinitions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_INFO_Exported_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_INFO_Exported_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
extern const uint8_t MSC_Page00_Inquiry_Data[];
|
|
||||||
extern const uint8_t MSC_Mode_Sense6_data[];
|
|
||||||
extern const uint8_t MSC_Mode_Sense10_data[] ;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_INFO_Exported_FunctionsPrototype
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#endif /* _USBD_MSC_DATA_H_ */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
@ -1,106 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_msc_mem.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief header for the STORAGE DISK file file
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef __USBD_MEM_H
|
|
||||||
#define __USBD_MEM_H
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_def.h"
|
|
||||||
|
|
||||||
|
|
||||||
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_MEM
|
|
||||||
* @brief header file for the storage disk file
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_MEM_Exported_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
#define USBD_STD_INQUIRY_LENGTH 36
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_MEM_Exported_TypesDefinitions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef struct _USBD_STORAGE
|
|
||||||
{
|
|
||||||
int8_t (* Init) (uint8_t lun);
|
|
||||||
int8_t (* GetCapacity) (uint8_t lun, uint32_t *block_num, uint32_t *block_size);
|
|
||||||
int8_t (* IsReady) (uint8_t lun);
|
|
||||||
int8_t (* IsWriteProtected) (uint8_t lun);
|
|
||||||
int8_t (* Read) (uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);
|
|
||||||
int8_t (* Write)(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);
|
|
||||||
int8_t (* GetMaxLun)(void);
|
|
||||||
int8_t *pInquiry;
|
|
||||||
|
|
||||||
}USBD_STORAGE_cb_TypeDef;
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_MEM_Exported_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_MEM_Exported_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_MEM_Exported_FunctionsPrototype
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
extern USBD_STORAGE_cb_TypeDef *USBD_STORAGE_fops;
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#endif /* __USBD_MEM_H */
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
@ -1,189 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_msc_scsi.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief header for the usbd_msc_scsi.c file
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __USBD_MSC_SCSI_H
|
|
||||||
#define __USBD_MSC_SCSI_H
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_def.h"
|
|
||||||
|
|
||||||
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_SCSI
|
|
||||||
* @brief header file for the storage disk file
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_SCSI_Exported_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define SENSE_LIST_DEEPTH 4
|
|
||||||
|
|
||||||
/* SCSI Commands */
|
|
||||||
#define SCSI_FORMAT_UNIT 0x04
|
|
||||||
#define SCSI_INQUIRY 0x12
|
|
||||||
#define SCSI_MODE_SELECT6 0x15
|
|
||||||
#define SCSI_MODE_SELECT10 0x55
|
|
||||||
#define SCSI_MODE_SENSE6 0x1A
|
|
||||||
#define SCSI_MODE_SENSE10 0x5A
|
|
||||||
#define SCSI_ALLOW_MEDIUM_REMOVAL 0x1E
|
|
||||||
#define SCSI_READ6 0x08
|
|
||||||
#define SCSI_READ10 0x28
|
|
||||||
#define SCSI_READ12 0xA8
|
|
||||||
#define SCSI_READ16 0x88
|
|
||||||
|
|
||||||
#define SCSI_READ_CAPACITY10 0x25
|
|
||||||
#define SCSI_READ_CAPACITY16 0x9E
|
|
||||||
|
|
||||||
#define SCSI_REQUEST_SENSE 0x03
|
|
||||||
#define SCSI_START_STOP_UNIT 0x1B
|
|
||||||
#define SCSI_TEST_UNIT_READY 0x00
|
|
||||||
#define SCSI_WRITE6 0x0A
|
|
||||||
#define SCSI_WRITE10 0x2A
|
|
||||||
#define SCSI_WRITE12 0xAA
|
|
||||||
#define SCSI_WRITE16 0x8A
|
|
||||||
|
|
||||||
#define SCSI_VERIFY10 0x2F
|
|
||||||
#define SCSI_VERIFY12 0xAF
|
|
||||||
#define SCSI_VERIFY16 0x8F
|
|
||||||
|
|
||||||
#define SCSI_SEND_DIAGNOSTIC 0x1D
|
|
||||||
#define SCSI_READ_FORMAT_CAPACITIES 0x23
|
|
||||||
|
|
||||||
#define NO_SENSE 0
|
|
||||||
#define RECOVERED_ERROR 1
|
|
||||||
#define NOT_READY 2
|
|
||||||
#define MEDIUM_ERROR 3
|
|
||||||
#define HARDWARE_ERROR 4
|
|
||||||
#define ILLEGAL_REQUEST 5
|
|
||||||
#define UNIT_ATTENTION 6
|
|
||||||
#define DATA_PROTECT 7
|
|
||||||
#define BLANK_CHECK 8
|
|
||||||
#define VENDOR_SPECIFIC 9
|
|
||||||
#define COPY_ABORTED 10
|
|
||||||
#define ABORTED_COMMAND 11
|
|
||||||
#define VOLUME_OVERFLOW 13
|
|
||||||
#define MISCOMPARE 14
|
|
||||||
|
|
||||||
|
|
||||||
#define INVALID_CDB 0x20
|
|
||||||
#define INVALID_FIELED_IN_COMMAND 0x24
|
|
||||||
#define PARAMETER_LIST_LENGTH_ERROR 0x1A
|
|
||||||
#define INVALID_FIELD_IN_PARAMETER_LIST 0x26
|
|
||||||
#define ADDRESS_OUT_OF_RANGE 0x21
|
|
||||||
#define MEDIUM_NOT_PRESENT 0x3A
|
|
||||||
#define MEDIUM_HAVE_CHANGED 0x28
|
|
||||||
#define WRITE_PROTECTED 0x27
|
|
||||||
#define UNRECOVERED_READ_ERROR 0x11
|
|
||||||
#define WRITE_FAULT 0x03
|
|
||||||
|
|
||||||
#define READ_FORMAT_CAPACITY_DATA_LEN 0x0C
|
|
||||||
#define READ_CAPACITY10_DATA_LEN 0x08
|
|
||||||
#define MODE_SENSE10_DATA_LEN 0x08
|
|
||||||
#define MODE_SENSE6_DATA_LEN 0x04
|
|
||||||
#define REQUEST_SENSE_DATA_LEN 0x12
|
|
||||||
#define STANDARD_INQUIRY_DATA_LEN 0x24
|
|
||||||
#define BLKVFY 0x04
|
|
||||||
|
|
||||||
extern uint8_t Page00_Inquiry_Data[];
|
|
||||||
extern uint8_t Standard_Inquiry_Data[];
|
|
||||||
extern uint8_t Standard_Inquiry_Data2[];
|
|
||||||
extern uint8_t Mode_Sense6_data[];
|
|
||||||
extern uint8_t Mode_Sense10_data[];
|
|
||||||
extern uint8_t Scsi_Sense_Data[];
|
|
||||||
extern uint8_t ReadCapacity10_Data[];
|
|
||||||
extern uint8_t ReadFormatCapacity_Data [];
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_SCSI_Exported_TypesDefinitions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef struct _SENSE_ITEM {
|
|
||||||
char Skey;
|
|
||||||
union {
|
|
||||||
struct _ASCs {
|
|
||||||
char ASC;
|
|
||||||
char ASCQ;
|
|
||||||
}b;
|
|
||||||
unsigned int ASC;
|
|
||||||
char *pData;
|
|
||||||
} w;
|
|
||||||
} SCSI_Sense_TypeDef;
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_SCSI_Exported_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_SCSI_Exported_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
extern SCSI_Sense_TypeDef SCSI_Sense [SENSE_LIST_DEEPTH];
|
|
||||||
extern uint8_t SCSI_Sense_Head;
|
|
||||||
extern uint8_t SCSI_Sense_Tail;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
/** @defgroup USBD_SCSI_Exported_FunctionsPrototype
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
int8_t SCSI_ProcessCmd(USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
uint8_t lun,
|
|
||||||
uint8_t *cmd);
|
|
||||||
|
|
||||||
void SCSI_SenseCode(uint8_t lun,
|
|
||||||
uint8_t sKey,
|
|
||||||
uint8_t ASC);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#endif /* __USBD_MSC_SCSI_H */
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
||||||
|
|
@ -1,393 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_msc_bot.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief This file provides all the BOT protocol core functions.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_msc_bot.h"
|
|
||||||
#include "usbd_msc_scsi.h"
|
|
||||||
#include "usbd_ioreq.h"
|
|
||||||
#include "usbd_msc_mem.h"
|
|
||||||
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_BOT
|
|
||||||
* @brief BOT protocol module
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup MSC_BOT_Private_TypesDefinitions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_BOT_Private_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_BOT_Private_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_BOT_Private_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
uint16_t MSC_BOT_DataLen;
|
|
||||||
uint8_t MSC_BOT_State;
|
|
||||||
uint8_t MSC_BOT_Status;
|
|
||||||
|
|
||||||
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
|
||||||
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
|
||||||
#pragma data_alignment=4
|
|
||||||
#endif
|
|
||||||
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
|
||||||
__ALIGN_BEGIN uint8_t MSC_BOT_Data[MSC_MEDIA_PACKET] __ALIGN_END ;
|
|
||||||
|
|
||||||
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
|
||||||
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
|
||||||
#pragma data_alignment=4
|
|
||||||
#endif
|
|
||||||
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
|
||||||
__ALIGN_BEGIN MSC_BOT_CBW_TypeDef MSC_BOT_cbw __ALIGN_END ;
|
|
||||||
|
|
||||||
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
|
||||||
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
|
||||||
#pragma data_alignment=4
|
|
||||||
#endif
|
|
||||||
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
|
||||||
__ALIGN_BEGIN MSC_BOT_CSW_TypeDef MSC_BOT_csw __ALIGN_END ;
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_BOT_Private_FunctionPrototypes
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
static void MSC_BOT_CBW_Decode (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
|
|
||||||
static void MSC_BOT_SendData (USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
uint8_t* pbuf,
|
|
||||||
uint16_t len);
|
|
||||||
|
|
||||||
static void MSC_BOT_Abort(USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_BOT_Private_Functions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief MSC_BOT_Init
|
|
||||||
* Initialize the BOT Process
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void MSC_BOT_Init (USB_OTG_CORE_HANDLE *pdev)
|
|
||||||
{
|
|
||||||
MSC_BOT_State = BOT_IDLE;
|
|
||||||
MSC_BOT_Status = BOT_STATE_NORMAL;
|
|
||||||
USBD_STORAGE_fops->Init(0);
|
|
||||||
|
|
||||||
DCD_EP_Flush(pdev, MSC_OUT_EP);
|
|
||||||
DCD_EP_Flush(pdev, MSC_IN_EP);
|
|
||||||
/* Prapare EP to Receive First BOT Cmd */
|
|
||||||
DCD_EP_PrepareRx (pdev,
|
|
||||||
MSC_OUT_EP,
|
|
||||||
(uint8_t *)&MSC_BOT_cbw,
|
|
||||||
BOT_CBW_LENGTH);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief MSC_BOT_Reset
|
|
||||||
* Reset the BOT Machine
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void MSC_BOT_Reset (USB_OTG_CORE_HANDLE *pdev)
|
|
||||||
{
|
|
||||||
MSC_BOT_State = BOT_IDLE;
|
|
||||||
MSC_BOT_Status = BOT_STATE_RECOVERY;
|
|
||||||
/* Prapare EP to Receive First BOT Cmd */
|
|
||||||
DCD_EP_PrepareRx (pdev,
|
|
||||||
MSC_OUT_EP,
|
|
||||||
(uint8_t *)&MSC_BOT_cbw,
|
|
||||||
BOT_CBW_LENGTH);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief MSC_BOT_DeInit
|
|
||||||
* Uninitialize the BOT Machine
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void MSC_BOT_DeInit (USB_OTG_CORE_HANDLE *pdev)
|
|
||||||
{
|
|
||||||
MSC_BOT_State = BOT_IDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief MSC_BOT_DataIn
|
|
||||||
* Handle BOT IN data stage
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param epnum: endpoint index
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void MSC_BOT_DataIn (USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
uint8_t epnum)
|
|
||||||
{
|
|
||||||
|
|
||||||
switch (MSC_BOT_State)
|
|
||||||
{
|
|
||||||
case BOT_DATA_IN:
|
|
||||||
if(SCSI_ProcessCmd(pdev,
|
|
||||||
MSC_BOT_cbw.bLUN,
|
|
||||||
&MSC_BOT_cbw.CB[0]) < 0)
|
|
||||||
{
|
|
||||||
MSC_BOT_SendCSW (pdev, CSW_CMD_FAILED);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BOT_SEND_DATA:
|
|
||||||
case BOT_LAST_DATA_IN:
|
|
||||||
MSC_BOT_SendCSW (pdev, CSW_CMD_PASSED);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief MSC_BOT_DataOut
|
|
||||||
* Proccess MSC OUT data
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param epnum: endpoint index
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void MSC_BOT_DataOut (USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
uint8_t epnum)
|
|
||||||
{
|
|
||||||
switch (MSC_BOT_State)
|
|
||||||
{
|
|
||||||
case BOT_IDLE:
|
|
||||||
MSC_BOT_CBW_Decode(pdev);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BOT_DATA_OUT:
|
|
||||||
|
|
||||||
if(SCSI_ProcessCmd(pdev,
|
|
||||||
MSC_BOT_cbw.bLUN,
|
|
||||||
&MSC_BOT_cbw.CB[0]) < 0)
|
|
||||||
{
|
|
||||||
MSC_BOT_SendCSW (pdev, CSW_CMD_FAILED);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief MSC_BOT_CBW_Decode
|
|
||||||
* Decode the CBW command and set the BOT state machine accordingtly
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
static void MSC_BOT_CBW_Decode (USB_OTG_CORE_HANDLE *pdev)
|
|
||||||
{
|
|
||||||
|
|
||||||
MSC_BOT_csw.dTag = MSC_BOT_cbw.dTag;
|
|
||||||
MSC_BOT_csw.dDataResidue = MSC_BOT_cbw.dDataLength;
|
|
||||||
|
|
||||||
if ((USBD_GetRxCount (pdev ,MSC_OUT_EP) != BOT_CBW_LENGTH) ||
|
|
||||||
(MSC_BOT_cbw.dSignature != BOT_CBW_SIGNATURE)||
|
|
||||||
(MSC_BOT_cbw.bLUN > 1) ||
|
|
||||||
(MSC_BOT_cbw.bCBLength < 1) ||
|
|
||||||
(MSC_BOT_cbw.bCBLength > 16))
|
|
||||||
{
|
|
||||||
|
|
||||||
SCSI_SenseCode(MSC_BOT_cbw.bLUN,
|
|
||||||
ILLEGAL_REQUEST,
|
|
||||||
INVALID_CDB);
|
|
||||||
MSC_BOT_Status = BOT_STATE_ERROR;
|
|
||||||
MSC_BOT_Abort(pdev);
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if(SCSI_ProcessCmd(pdev,
|
|
||||||
MSC_BOT_cbw.bLUN,
|
|
||||||
&MSC_BOT_cbw.CB[0]) < 0)
|
|
||||||
{
|
|
||||||
MSC_BOT_Abort(pdev);
|
|
||||||
}
|
|
||||||
/*Burst xfer handled internally*/
|
|
||||||
else if ((MSC_BOT_State != BOT_DATA_IN) &&
|
|
||||||
(MSC_BOT_State != BOT_DATA_OUT) &&
|
|
||||||
(MSC_BOT_State != BOT_LAST_DATA_IN))
|
|
||||||
{
|
|
||||||
if (MSC_BOT_DataLen > 0)
|
|
||||||
{
|
|
||||||
MSC_BOT_SendData(pdev,
|
|
||||||
MSC_BOT_Data,
|
|
||||||
MSC_BOT_DataLen);
|
|
||||||
}
|
|
||||||
else if (MSC_BOT_DataLen == 0)
|
|
||||||
{
|
|
||||||
MSC_BOT_SendCSW (pdev,
|
|
||||||
CSW_CMD_PASSED);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief MSC_BOT_SendData
|
|
||||||
* Send the requested data
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param buf: pointer to data buffer
|
|
||||||
* @param len: Data Length
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
static void MSC_BOT_SendData(USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
uint8_t* buf,
|
|
||||||
uint16_t len)
|
|
||||||
{
|
|
||||||
|
|
||||||
len = MIN (MSC_BOT_cbw.dDataLength, len);
|
|
||||||
MSC_BOT_csw.dDataResidue -= len;
|
|
||||||
MSC_BOT_csw.bStatus = CSW_CMD_PASSED;
|
|
||||||
MSC_BOT_State = BOT_SEND_DATA;
|
|
||||||
|
|
||||||
DCD_EP_Tx (pdev, MSC_IN_EP, buf, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief MSC_BOT_SendCSW
|
|
||||||
* Send the Command Status Wrapper
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param status : CSW status
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void MSC_BOT_SendCSW (USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
uint8_t CSW_Status)
|
|
||||||
{
|
|
||||||
MSC_BOT_csw.dSignature = BOT_CSW_SIGNATURE;
|
|
||||||
MSC_BOT_csw.bStatus = CSW_Status;
|
|
||||||
MSC_BOT_State = BOT_IDLE;
|
|
||||||
|
|
||||||
DCD_EP_Tx (pdev,
|
|
||||||
MSC_IN_EP,
|
|
||||||
(uint8_t *)&MSC_BOT_csw,
|
|
||||||
BOT_CSW_LENGTH);
|
|
||||||
|
|
||||||
/* Prapare EP to Receive next Cmd */
|
|
||||||
DCD_EP_PrepareRx (pdev,
|
|
||||||
MSC_OUT_EP,
|
|
||||||
(uint8_t *)&MSC_BOT_cbw,
|
|
||||||
BOT_CBW_LENGTH);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief MSC_BOT_Abort
|
|
||||||
* Abort the current transfer
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
|
|
||||||
static void MSC_BOT_Abort (USB_OTG_CORE_HANDLE *pdev)
|
|
||||||
{
|
|
||||||
|
|
||||||
if ((MSC_BOT_cbw.bmFlags == 0) &&
|
|
||||||
(MSC_BOT_cbw.dDataLength != 0) &&
|
|
||||||
(MSC_BOT_Status == BOT_STATE_NORMAL) )
|
|
||||||
{
|
|
||||||
DCD_EP_Stall(pdev, MSC_OUT_EP );
|
|
||||||
}
|
|
||||||
DCD_EP_Stall(pdev, MSC_IN_EP);
|
|
||||||
|
|
||||||
if(MSC_BOT_Status == BOT_STATE_ERROR)
|
|
||||||
{
|
|
||||||
DCD_EP_PrepareRx (pdev,
|
|
||||||
MSC_OUT_EP,
|
|
||||||
(uint8_t *)&MSC_BOT_cbw,
|
|
||||||
BOT_CBW_LENGTH);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief MSC_BOT_CplClrFeature
|
|
||||||
* Complete the clear feature request
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param epnum: endpoint index
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
|
|
||||||
void MSC_BOT_CplClrFeature (USB_OTG_CORE_HANDLE *pdev, uint8_t epnum)
|
|
||||||
{
|
|
||||||
if(MSC_BOT_Status == BOT_STATE_ERROR )/* Bad CBW Signature */
|
|
||||||
{
|
|
||||||
DCD_EP_Stall(pdev, MSC_IN_EP);
|
|
||||||
MSC_BOT_Status = BOT_STATE_NORMAL;
|
|
||||||
}
|
|
||||||
else if(((epnum & 0x80) == 0x80) && ( MSC_BOT_Status != BOT_STATE_RECOVERY))
|
|
||||||
{
|
|
||||||
MSC_BOT_SendCSW (pdev, CSW_CMD_FAILED);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
@ -1,490 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_msc_core.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief This file provides all the MSC core functions.
|
|
||||||
*
|
|
||||||
* @verbatim
|
|
||||||
*
|
|
||||||
* ===================================================================
|
|
||||||
* MSC Class Description
|
|
||||||
* ===================================================================
|
|
||||||
* This module manages the MSC class V1.0 following the "Universal
|
|
||||||
* Serial Bus Mass Storage Class (MSC) Bulk-Only Transport (BOT) Version 1.0
|
|
||||||
* Sep. 31, 1999".
|
|
||||||
* This driver implements the following aspects of the specification:
|
|
||||||
* - Bulk-Only Transport protocol
|
|
||||||
* - Subclass : SCSI transparent command set (ref. SCSI Primary Commands - 3 (SPC-3))
|
|
||||||
*
|
|
||||||
* @endverbatim
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_msc_mem.h"
|
|
||||||
#include "usbd_msc_core.h"
|
|
||||||
#include "usbd_msc_bot.h"
|
|
||||||
#include "usbd_req.h"
|
|
||||||
|
|
||||||
|
|
||||||
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_CORE
|
|
||||||
* @brief Mass storage core module
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup MSC_CORE_Private_TypesDefinitions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_CORE_Private_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_CORE_Private_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_CORE_Private_FunctionPrototypes
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
uint8_t USBD_MSC_Init (void *pdev,
|
|
||||||
uint8_t cfgidx);
|
|
||||||
|
|
||||||
uint8_t USBD_MSC_DeInit (void *pdev,
|
|
||||||
uint8_t cfgidx);
|
|
||||||
|
|
||||||
uint8_t USBD_MSC_Setup (void *pdev,
|
|
||||||
USB_SETUP_REQ *req);
|
|
||||||
|
|
||||||
uint8_t USBD_MSC_DataIn (void *pdev,
|
|
||||||
uint8_t epnum);
|
|
||||||
|
|
||||||
|
|
||||||
uint8_t USBD_MSC_DataOut (void *pdev,
|
|
||||||
uint8_t epnum);
|
|
||||||
|
|
||||||
uint8_t *USBD_MSC_GetCfgDesc (uint8_t speed,
|
|
||||||
uint16_t *length);
|
|
||||||
|
|
||||||
#ifdef USB_OTG_HS_CORE
|
|
||||||
uint8_t *USBD_MSC_GetOtherCfgDesc (uint8_t speed,
|
|
||||||
uint16_t *length);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
uint8_t USBD_MSC_CfgDesc[USB_MSC_CONFIG_DESC_SIZ];
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_CORE_Private_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
USBD_Class_cb_TypeDef USBD_MSC_cb =
|
|
||||||
{
|
|
||||||
USBD_MSC_Init,
|
|
||||||
USBD_MSC_DeInit,
|
|
||||||
USBD_MSC_Setup,
|
|
||||||
NULL, /*EP0_TxSent*/
|
|
||||||
NULL, /*EP0_RxReady*/
|
|
||||||
USBD_MSC_DataIn,
|
|
||||||
USBD_MSC_DataOut,
|
|
||||||
NULL, /*SOF */
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
USBD_MSC_GetCfgDesc,
|
|
||||||
#ifdef USB_OTG_HS_CORE
|
|
||||||
USBD_MSC_GetOtherCfgDesc,
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
|
||||||
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
|
||||||
#pragma data_alignment=4
|
|
||||||
#endif
|
|
||||||
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
|
||||||
/* USB Mass storage device Configuration Descriptor */
|
|
||||||
/* All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */
|
|
||||||
__ALIGN_BEGIN uint8_t USBD_MSC_CfgDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END =
|
|
||||||
{
|
|
||||||
|
|
||||||
0x09, /* bLength: Configuation Descriptor size */
|
|
||||||
USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */
|
|
||||||
USB_MSC_CONFIG_DESC_SIZ,
|
|
||||||
|
|
||||||
0x00,
|
|
||||||
0x01, /* bNumInterfaces: 1 interface */
|
|
||||||
0x01, /* bConfigurationValue: */
|
|
||||||
0x04, /* iConfiguration: */
|
|
||||||
0xC0, /* bmAttributes: */
|
|
||||||
0x32, /* MaxPower 100 mA */
|
|
||||||
|
|
||||||
/******************** Mass Storage interface ********************/
|
|
||||||
0x09, /* bLength: Interface Descriptor size */
|
|
||||||
0x04, /* bDescriptorType: */
|
|
||||||
0x00, /* bInterfaceNumber: Number of Interface */
|
|
||||||
0x00, /* bAlternateSetting: Alternate setting */
|
|
||||||
0x02, /* bNumEndpoints*/
|
|
||||||
0x08, /* bInterfaceClass: MSC Class */
|
|
||||||
0x06, /* bInterfaceSubClass : SCSI transparent*/
|
|
||||||
0x50, /* nInterfaceProtocol */
|
|
||||||
0x05, /* iInterface: */
|
|
||||||
/******************** Mass Storage Endpoints ********************/
|
|
||||||
0x07, /*Endpoint descriptor length = 7*/
|
|
||||||
0x05, /*Endpoint descriptor type */
|
|
||||||
MSC_IN_EP, /*Endpoint address (IN, address 1) */
|
|
||||||
0x02, /*Bulk endpoint type */
|
|
||||||
LOBYTE(MSC_MAX_PACKET),
|
|
||||||
HIBYTE(MSC_MAX_PACKET),
|
|
||||||
0x00, /*Polling interval in milliseconds */
|
|
||||||
|
|
||||||
0x07, /*Endpoint descriptor length = 7 */
|
|
||||||
0x05, /*Endpoint descriptor type */
|
|
||||||
MSC_OUT_EP, /*Endpoint address (OUT, address 1) */
|
|
||||||
0x02, /*Bulk endpoint type */
|
|
||||||
LOBYTE(MSC_MAX_PACKET),
|
|
||||||
HIBYTE(MSC_MAX_PACKET),
|
|
||||||
0x00 /*Polling interval in milliseconds*/
|
|
||||||
};
|
|
||||||
#ifdef USB_OTG_HS_CORE
|
|
||||||
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
|
||||||
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
|
||||||
#pragma data_alignment=4
|
|
||||||
#endif
|
|
||||||
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
|
||||||
__ALIGN_BEGIN uint8_t USBD_MSC_OtherCfgDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END =
|
|
||||||
{
|
|
||||||
|
|
||||||
0x09, /* bLength: Configuation Descriptor size */
|
|
||||||
USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION,
|
|
||||||
USB_MSC_CONFIG_DESC_SIZ,
|
|
||||||
|
|
||||||
0x00,
|
|
||||||
0x01, /* bNumInterfaces: 1 interface */
|
|
||||||
0x01, /* bConfigurationValue: */
|
|
||||||
0x04, /* iConfiguration: */
|
|
||||||
0xC0, /* bmAttributes: */
|
|
||||||
0x32, /* MaxPower 100 mA */
|
|
||||||
|
|
||||||
/******************** Mass Storage interface ********************/
|
|
||||||
0x09, /* bLength: Interface Descriptor size */
|
|
||||||
0x04, /* bDescriptorType: */
|
|
||||||
0x00, /* bInterfaceNumber: Number of Interface */
|
|
||||||
0x00, /* bAlternateSetting: Alternate setting */
|
|
||||||
0x02, /* bNumEndpoints*/
|
|
||||||
0x08, /* bInterfaceClass: MSC Class */
|
|
||||||
0x06, /* bInterfaceSubClass : SCSI transparent command set*/
|
|
||||||
0x50, /* nInterfaceProtocol */
|
|
||||||
0x05, /* iInterface: */
|
|
||||||
/******************** Mass Storage Endpoints ********************/
|
|
||||||
0x07, /*Endpoint descriptor length = 7*/
|
|
||||||
0x05, /*Endpoint descriptor type */
|
|
||||||
MSC_IN_EP, /*Endpoint address (IN, address 1) */
|
|
||||||
0x02, /*Bulk endpoint type */
|
|
||||||
0x40,
|
|
||||||
0x00,
|
|
||||||
0x00, /*Polling interval in milliseconds */
|
|
||||||
|
|
||||||
0x07, /*Endpoint descriptor length = 7 */
|
|
||||||
0x05, /*Endpoint descriptor type */
|
|
||||||
MSC_OUT_EP, /*Endpoint address (OUT, address 1) */
|
|
||||||
0x02, /*Bulk endpoint type */
|
|
||||||
0x40,
|
|
||||||
0x00,
|
|
||||||
0x00 /*Polling interval in milliseconds*/
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
|
||||||
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
|
||||||
#pragma data_alignment=4
|
|
||||||
#endif
|
|
||||||
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
|
||||||
__ALIGN_BEGIN static uint8_t USBD_MSC_MaxLun __ALIGN_END = 0;
|
|
||||||
|
|
||||||
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
|
||||||
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
|
||||||
#pragma data_alignment=4
|
|
||||||
#endif
|
|
||||||
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
|
||||||
__ALIGN_BEGIN static uint8_t USBD_MSC_AltSet __ALIGN_END = 0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_CORE_Private_Functions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_MSC_Init
|
|
||||||
* Initialize the mass storage configuration
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param cfgidx: configuration index
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
uint8_t USBD_MSC_Init (void *pdev,
|
|
||||||
uint8_t cfgidx)
|
|
||||||
{
|
|
||||||
USBD_MSC_DeInit(pdev , cfgidx );
|
|
||||||
|
|
||||||
/* Open EP IN */
|
|
||||||
DCD_EP_Open(pdev,
|
|
||||||
MSC_IN_EP,
|
|
||||||
MSC_EPIN_SIZE,
|
|
||||||
USB_OTG_EP_BULK);
|
|
||||||
|
|
||||||
/* Open EP OUT */
|
|
||||||
DCD_EP_Open(pdev,
|
|
||||||
MSC_OUT_EP,
|
|
||||||
MSC_EPOUT_SIZE,
|
|
||||||
USB_OTG_EP_BULK);
|
|
||||||
|
|
||||||
/* Init the BOT layer */
|
|
||||||
MSC_BOT_Init(pdev);
|
|
||||||
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_MSC_DeInit
|
|
||||||
* DeInitilaize the mass storage configuration
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param cfgidx: configuration index
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
uint8_t USBD_MSC_DeInit (void *pdev,
|
|
||||||
uint8_t cfgidx)
|
|
||||||
{
|
|
||||||
/* Close MSC EPs */
|
|
||||||
DCD_EP_Close (pdev , MSC_IN_EP);
|
|
||||||
DCD_EP_Close (pdev , MSC_OUT_EP);
|
|
||||||
|
|
||||||
/* Un Init the BOT layer */
|
|
||||||
MSC_BOT_DeInit(pdev);
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief USBD_MSC_Setup
|
|
||||||
* Handle the MSC specific requests
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param req: USB request
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
uint8_t USBD_MSC_Setup (void *pdev, USB_SETUP_REQ *req)
|
|
||||||
{
|
|
||||||
|
|
||||||
switch (req->bmRequest & USB_REQ_TYPE_MASK)
|
|
||||||
{
|
|
||||||
|
|
||||||
/* Class request */
|
|
||||||
case USB_REQ_TYPE_CLASS :
|
|
||||||
switch (req->bRequest)
|
|
||||||
{
|
|
||||||
case BOT_GET_MAX_LUN :
|
|
||||||
|
|
||||||
if((req->wValue == 0) &&
|
|
||||||
(req->wLength == 1) &&
|
|
||||||
((req->bmRequest & 0x80) == 0x80))
|
|
||||||
{
|
|
||||||
USBD_MSC_MaxLun = USBD_STORAGE_fops->GetMaxLun();
|
|
||||||
if(USBD_MSC_MaxLun > 0)
|
|
||||||
{
|
|
||||||
USBD_CtlSendData (pdev,
|
|
||||||
&USBD_MSC_MaxLun,
|
|
||||||
1);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
USBD_CtlError(pdev , req);
|
|
||||||
return USBD_FAIL;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
USBD_CtlError(pdev , req);
|
|
||||||
return USBD_FAIL;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BOT_RESET :
|
|
||||||
if((req->wValue == 0) &&
|
|
||||||
(req->wLength == 0) &&
|
|
||||||
((req->bmRequest & 0x80) != 0x80))
|
|
||||||
{
|
|
||||||
MSC_BOT_Reset(pdev);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
USBD_CtlError(pdev , req);
|
|
||||||
return USBD_FAIL;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
USBD_CtlError(pdev , req);
|
|
||||||
return USBD_FAIL;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
/* Interface & Endpoint request */
|
|
||||||
case USB_REQ_TYPE_STANDARD:
|
|
||||||
switch (req->bRequest)
|
|
||||||
{
|
|
||||||
case USB_REQ_GET_INTERFACE :
|
|
||||||
USBD_CtlSendData (pdev,
|
|
||||||
&USBD_MSC_AltSet,
|
|
||||||
1);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case USB_REQ_SET_INTERFACE :
|
|
||||||
USBD_MSC_AltSet = (uint8_t)(req->wValue);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case USB_REQ_CLEAR_FEATURE:
|
|
||||||
|
|
||||||
/* Flush the FIFO and Clear the stall status */
|
|
||||||
DCD_EP_Flush(pdev, (uint8_t)req->wIndex);
|
|
||||||
|
|
||||||
/* Re-activate the EP */
|
|
||||||
DCD_EP_Close (pdev , (uint8_t)req->wIndex);
|
|
||||||
if((((uint8_t)req->wIndex) & 0x80) == 0x80)
|
|
||||||
{
|
|
||||||
DCD_EP_Open(pdev,
|
|
||||||
((uint8_t)req->wIndex),
|
|
||||||
MSC_EPIN_SIZE,
|
|
||||||
USB_OTG_EP_BULK);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DCD_EP_Open(pdev,
|
|
||||||
((uint8_t)req->wIndex),
|
|
||||||
MSC_EPOUT_SIZE,
|
|
||||||
USB_OTG_EP_BULK);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Handle BOT error */
|
|
||||||
MSC_BOT_CplClrFeature(pdev, (uint8_t)req->wIndex);
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_MSC_DataIn
|
|
||||||
* handle data IN Stage
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param epnum: endpoint index
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
uint8_t USBD_MSC_DataIn (void *pdev,
|
|
||||||
uint8_t epnum)
|
|
||||||
{
|
|
||||||
MSC_BOT_DataIn(pdev , epnum);
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_MSC_DataOut
|
|
||||||
* handle data OUT Stage
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param epnum: endpoint index
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
uint8_t USBD_MSC_DataOut (void *pdev,
|
|
||||||
uint8_t epnum)
|
|
||||||
{
|
|
||||||
MSC_BOT_DataOut(pdev , epnum);
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_MSC_GetCfgDesc
|
|
||||||
* return configuration descriptor
|
|
||||||
* @param speed : current device speed
|
|
||||||
* @param length : pointer data length
|
|
||||||
* @retval pointer to descriptor buffer
|
|
||||||
*/
|
|
||||||
uint8_t *USBD_MSC_GetCfgDesc (uint8_t speed, uint16_t *length)
|
|
||||||
{
|
|
||||||
*length = sizeof (USBD_MSC_CfgDesc);
|
|
||||||
return USBD_MSC_CfgDesc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_MSC_GetOtherCfgDesc
|
|
||||||
* return other speed configuration descriptor
|
|
||||||
* @param speed : current device speed
|
|
||||||
* @param length : pointer data length
|
|
||||||
* @retval pointer to descriptor buffer
|
|
||||||
*/
|
|
||||||
#ifdef USB_OTG_HS_CORE
|
|
||||||
uint8_t *USBD_MSC_GetOtherCfgDesc (uint8_t speed,
|
|
||||||
uint16_t *length)
|
|
||||||
{
|
|
||||||
*length = sizeof (USBD_MSC_OtherCfgDesc);
|
|
||||||
return USBD_MSC_OtherCfgDesc;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
@ -1,128 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_msc_data.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief This file provides all the vital inquiry pages and sense data.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_msc_data.h"
|
|
||||||
|
|
||||||
|
|
||||||
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_DATA
|
|
||||||
* @brief Mass storage info/data module
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup MSC_DATA_Private_TypesDefinitions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_DATA_Private_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_DATA_Private_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_DATA_Private_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/* USB Mass storage Page 0 Inquiry Data */
|
|
||||||
const uint8_t MSC_Page00_Inquiry_Data[] = {//7
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
(LENGTH_INQUIRY_PAGE00 - 4),
|
|
||||||
0x00,
|
|
||||||
0x80,
|
|
||||||
0x83
|
|
||||||
};
|
|
||||||
/* USB Mass storage sense 6 Data */
|
|
||||||
const uint8_t MSC_Mode_Sense6_data[] = {
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00
|
|
||||||
};
|
|
||||||
/* USB Mass storage sense 10 Data */
|
|
||||||
const uint8_t MSC_Mode_Sense10_data[] = {
|
|
||||||
0x00,
|
|
||||||
0x06,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_DATA_Private_FunctionPrototypes
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_DATA_Private_Functions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
@ -1,722 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_msc_scsi.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief This file provides all the USBD SCSI layer functions.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_msc_bot.h"
|
|
||||||
#include "usbd_msc_scsi.h"
|
|
||||||
#include "usbd_msc_mem.h"
|
|
||||||
#include "usbd_msc_data.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_SCSI
|
|
||||||
* @brief Mass storage SCSI layer module
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup MSC_SCSI_Private_TypesDefinitions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_SCSI_Private_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_SCSI_Private_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_SCSI_Private_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
SCSI_Sense_TypeDef SCSI_Sense [SENSE_LIST_DEEPTH];
|
|
||||||
uint8_t SCSI_Sense_Head;
|
|
||||||
uint8_t SCSI_Sense_Tail;
|
|
||||||
|
|
||||||
uint32_t SCSI_blk_size;
|
|
||||||
uint32_t SCSI_blk_nbr;
|
|
||||||
|
|
||||||
uint32_t SCSI_blk_addr;
|
|
||||||
uint32_t SCSI_blk_len;
|
|
||||||
|
|
||||||
USB_OTG_CORE_HANDLE *cdev;
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_SCSI_Private_FunctionPrototypes
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
static int8_t SCSI_TestUnitReady(uint8_t lun, uint8_t *params);
|
|
||||||
static int8_t SCSI_Inquiry(uint8_t lun, uint8_t *params);
|
|
||||||
static int8_t SCSI_ReadFormatCapacity(uint8_t lun, uint8_t *params);
|
|
||||||
static int8_t SCSI_ReadCapacity10(uint8_t lun, uint8_t *params);
|
|
||||||
static int8_t SCSI_RequestSense (uint8_t lun, uint8_t *params);
|
|
||||||
static int8_t SCSI_StartStopUnit(uint8_t lun, uint8_t *params);
|
|
||||||
static int8_t SCSI_ModeSense6 (uint8_t lun, uint8_t *params);
|
|
||||||
static int8_t SCSI_ModeSense10 (uint8_t lun, uint8_t *params);
|
|
||||||
static int8_t SCSI_Write10(uint8_t lun , uint8_t *params);
|
|
||||||
static int8_t SCSI_Read10(uint8_t lun , uint8_t *params);
|
|
||||||
static int8_t SCSI_Verify10(uint8_t lun, uint8_t *params);
|
|
||||||
static int8_t SCSI_CheckAddressRange (uint8_t lun ,
|
|
||||||
uint32_t blk_offset ,
|
|
||||||
uint16_t blk_nbr);
|
|
||||||
static int8_t SCSI_ProcessRead (uint8_t lun);
|
|
||||||
|
|
||||||
static int8_t SCSI_ProcessWrite (uint8_t lun);
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_SCSI_Private_Functions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief SCSI_ProcessCmd
|
|
||||||
* Process SCSI commands
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param lun: Logical unit number
|
|
||||||
* @param params: Command parameters
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
int8_t SCSI_ProcessCmd(USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
uint8_t lun,
|
|
||||||
uint8_t *params)
|
|
||||||
{
|
|
||||||
cdev = pdev;
|
|
||||||
|
|
||||||
switch (params[0])
|
|
||||||
{
|
|
||||||
case SCSI_TEST_UNIT_READY:
|
|
||||||
return SCSI_TestUnitReady(lun, params);
|
|
||||||
|
|
||||||
case SCSI_REQUEST_SENSE:
|
|
||||||
return SCSI_RequestSense (lun, params);
|
|
||||||
case SCSI_INQUIRY:
|
|
||||||
return SCSI_Inquiry(lun, params);
|
|
||||||
|
|
||||||
case SCSI_START_STOP_UNIT:
|
|
||||||
return SCSI_StartStopUnit(lun, params);
|
|
||||||
|
|
||||||
case SCSI_ALLOW_MEDIUM_REMOVAL:
|
|
||||||
return SCSI_StartStopUnit(lun, params);
|
|
||||||
|
|
||||||
case SCSI_MODE_SENSE6:
|
|
||||||
return SCSI_ModeSense6 (lun, params);
|
|
||||||
|
|
||||||
case SCSI_MODE_SENSE10:
|
|
||||||
return SCSI_ModeSense10 (lun, params);
|
|
||||||
|
|
||||||
case SCSI_READ_FORMAT_CAPACITIES:
|
|
||||||
return SCSI_ReadFormatCapacity(lun, params);
|
|
||||||
|
|
||||||
case SCSI_READ_CAPACITY10:
|
|
||||||
return SCSI_ReadCapacity10(lun, params);
|
|
||||||
|
|
||||||
case SCSI_READ10:
|
|
||||||
return SCSI_Read10(lun, params);
|
|
||||||
|
|
||||||
case SCSI_WRITE10:
|
|
||||||
return SCSI_Write10(lun, params);
|
|
||||||
|
|
||||||
case SCSI_VERIFY10:
|
|
||||||
return SCSI_Verify10(lun, params);
|
|
||||||
|
|
||||||
default:
|
|
||||||
SCSI_SenseCode(lun,
|
|
||||||
ILLEGAL_REQUEST,
|
|
||||||
INVALID_CDB);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief SCSI_TestUnitReady
|
|
||||||
* Process SCSI Test Unit Ready Command
|
|
||||||
* @param lun: Logical unit number
|
|
||||||
* @param params: Command parameters
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static int8_t SCSI_TestUnitReady(uint8_t lun, uint8_t *params)
|
|
||||||
{
|
|
||||||
|
|
||||||
/* case 9 : Hi > D0 */
|
|
||||||
if (MSC_BOT_cbw.dDataLength != 0)
|
|
||||||
{
|
|
||||||
SCSI_SenseCode(MSC_BOT_cbw.bLUN,
|
|
||||||
ILLEGAL_REQUEST,
|
|
||||||
INVALID_CDB);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(USBD_STORAGE_fops->IsReady(lun) !=0 )
|
|
||||||
{
|
|
||||||
SCSI_SenseCode(lun,
|
|
||||||
NOT_READY,
|
|
||||||
MEDIUM_NOT_PRESENT);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
MSC_BOT_DataLen = 0;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief SCSI_Inquiry
|
|
||||||
* Process Inquiry command
|
|
||||||
* @param lun: Logical unit number
|
|
||||||
* @param params: Command parameters
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static int8_t SCSI_Inquiry(uint8_t lun, uint8_t *params)
|
|
||||||
{
|
|
||||||
uint8_t* pPage;
|
|
||||||
uint16_t len;
|
|
||||||
|
|
||||||
if (params[1] & 0x01)/*Evpd is set*/
|
|
||||||
{
|
|
||||||
pPage = (uint8_t *)MSC_Page00_Inquiry_Data;
|
|
||||||
len = LENGTH_INQUIRY_PAGE00;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
|
|
||||||
pPage = (uint8_t *)&USBD_STORAGE_fops->pInquiry[lun * USBD_STD_INQUIRY_LENGTH];
|
|
||||||
len = pPage[4] + 5;
|
|
||||||
|
|
||||||
if (params[4] <= len)
|
|
||||||
{
|
|
||||||
len = params[4];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
MSC_BOT_DataLen = len;
|
|
||||||
|
|
||||||
while (len)
|
|
||||||
{
|
|
||||||
len--;
|
|
||||||
MSC_BOT_Data[len] = pPage[len];
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief SCSI_ReadCapacity10
|
|
||||||
* Process Read Capacity 10 command
|
|
||||||
* @param lun: Logical unit number
|
|
||||||
* @param params: Command parameters
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static int8_t SCSI_ReadCapacity10(uint8_t lun, uint8_t *params)
|
|
||||||
{
|
|
||||||
|
|
||||||
if(USBD_STORAGE_fops->GetCapacity(lun, &SCSI_blk_nbr, &SCSI_blk_size) != 0)
|
|
||||||
{
|
|
||||||
SCSI_SenseCode(lun,
|
|
||||||
NOT_READY,
|
|
||||||
MEDIUM_NOT_PRESENT);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
|
|
||||||
MSC_BOT_Data[0] = (uint8_t)(SCSI_blk_nbr - 1 >> 24);
|
|
||||||
MSC_BOT_Data[1] = (uint8_t)(SCSI_blk_nbr - 1 >> 16);
|
|
||||||
MSC_BOT_Data[2] = (uint8_t)(SCSI_blk_nbr - 1 >> 8);
|
|
||||||
MSC_BOT_Data[3] = (uint8_t)(SCSI_blk_nbr - 1);
|
|
||||||
|
|
||||||
MSC_BOT_Data[4] = (uint8_t)(SCSI_blk_size >> 24);
|
|
||||||
MSC_BOT_Data[5] = (uint8_t)(SCSI_blk_size >> 16);
|
|
||||||
MSC_BOT_Data[6] = (uint8_t)(SCSI_blk_size >> 8);
|
|
||||||
MSC_BOT_Data[7] = (uint8_t)(SCSI_blk_size);
|
|
||||||
|
|
||||||
MSC_BOT_DataLen = 8;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief SCSI_ReadFormatCapacity
|
|
||||||
* Process Read Format Capacity command
|
|
||||||
* @param lun: Logical unit number
|
|
||||||
* @param params: Command parameters
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static int8_t SCSI_ReadFormatCapacity(uint8_t lun, uint8_t *params)
|
|
||||||
{
|
|
||||||
|
|
||||||
uint32_t blk_size;
|
|
||||||
uint32_t blk_nbr;
|
|
||||||
uint16_t i;
|
|
||||||
|
|
||||||
for(i=0 ; i < 12 ; i++)
|
|
||||||
{
|
|
||||||
MSC_BOT_Data[i] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(USBD_STORAGE_fops->GetCapacity(lun, &blk_nbr, &blk_size) != 0)
|
|
||||||
{
|
|
||||||
SCSI_SenseCode(lun,
|
|
||||||
NOT_READY,
|
|
||||||
MEDIUM_NOT_PRESENT);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
MSC_BOT_Data[3] = 0x08;
|
|
||||||
MSC_BOT_Data[4] = (uint8_t)(blk_nbr - 1 >> 24);
|
|
||||||
MSC_BOT_Data[5] = (uint8_t)(blk_nbr - 1 >> 16);
|
|
||||||
MSC_BOT_Data[6] = (uint8_t)(blk_nbr - 1 >> 8);
|
|
||||||
MSC_BOT_Data[7] = (uint8_t)(blk_nbr - 1);
|
|
||||||
|
|
||||||
MSC_BOT_Data[8] = 0x02;
|
|
||||||
MSC_BOT_Data[9] = (uint8_t)(blk_size >> 16);
|
|
||||||
MSC_BOT_Data[10] = (uint8_t)(blk_size >> 8);
|
|
||||||
MSC_BOT_Data[11] = (uint8_t)(blk_size);
|
|
||||||
|
|
||||||
MSC_BOT_DataLen = 12;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief SCSI_ModeSense6
|
|
||||||
* Process Mode Sense6 command
|
|
||||||
* @param lun: Logical unit number
|
|
||||||
* @param params: Command parameters
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static int8_t SCSI_ModeSense6 (uint8_t lun, uint8_t *params)
|
|
||||||
{
|
|
||||||
|
|
||||||
uint16_t len = 8 ;
|
|
||||||
MSC_BOT_DataLen = len;
|
|
||||||
|
|
||||||
while (len)
|
|
||||||
{
|
|
||||||
len--;
|
|
||||||
MSC_BOT_Data[len] = MSC_Mode_Sense6_data[len];
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief SCSI_ModeSense10
|
|
||||||
* Process Mode Sense10 command
|
|
||||||
* @param lun: Logical unit number
|
|
||||||
* @param params: Command parameters
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static int8_t SCSI_ModeSense10 (uint8_t lun, uint8_t *params)
|
|
||||||
{
|
|
||||||
uint16_t len = 8;
|
|
||||||
|
|
||||||
MSC_BOT_DataLen = len;
|
|
||||||
|
|
||||||
while (len)
|
|
||||||
{
|
|
||||||
len--;
|
|
||||||
MSC_BOT_Data[len] = MSC_Mode_Sense10_data[len];
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief SCSI_RequestSense
|
|
||||||
* Process Request Sense command
|
|
||||||
* @param lun: Logical unit number
|
|
||||||
* @param params: Command parameters
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
|
|
||||||
static int8_t SCSI_RequestSense (uint8_t lun, uint8_t *params)
|
|
||||||
{
|
|
||||||
uint8_t i;
|
|
||||||
|
|
||||||
for(i=0 ; i < REQUEST_SENSE_DATA_LEN ; i++)
|
|
||||||
{
|
|
||||||
MSC_BOT_Data[i] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
MSC_BOT_Data[0] = 0x70;
|
|
||||||
MSC_BOT_Data[7] = REQUEST_SENSE_DATA_LEN - 6;
|
|
||||||
|
|
||||||
if((SCSI_Sense_Head != SCSI_Sense_Tail)) {
|
|
||||||
|
|
||||||
MSC_BOT_Data[2] = SCSI_Sense[SCSI_Sense_Head].Skey;
|
|
||||||
MSC_BOT_Data[12] = SCSI_Sense[SCSI_Sense_Head].w.b.ASCQ;
|
|
||||||
MSC_BOT_Data[13] = SCSI_Sense[SCSI_Sense_Head].w.b.ASC;
|
|
||||||
SCSI_Sense_Head++;
|
|
||||||
|
|
||||||
if (SCSI_Sense_Head == SENSE_LIST_DEEPTH)
|
|
||||||
{
|
|
||||||
SCSI_Sense_Head = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
MSC_BOT_DataLen = REQUEST_SENSE_DATA_LEN;
|
|
||||||
|
|
||||||
if (params[4] <= REQUEST_SENSE_DATA_LEN)
|
|
||||||
{
|
|
||||||
MSC_BOT_DataLen = params[4];
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief SCSI_SenseCode
|
|
||||||
* Load the last error code in the error list
|
|
||||||
* @param lun: Logical unit number
|
|
||||||
* @param sKey: Sense Key
|
|
||||||
* @param ASC: Additional Sense Key
|
|
||||||
* @retval none
|
|
||||||
|
|
||||||
*/
|
|
||||||
void SCSI_SenseCode(uint8_t lun, uint8_t sKey, uint8_t ASC)
|
|
||||||
{
|
|
||||||
SCSI_Sense[SCSI_Sense_Tail].Skey = sKey;
|
|
||||||
SCSI_Sense[SCSI_Sense_Tail].w.ASC = ASC << 8;
|
|
||||||
SCSI_Sense_Tail++;
|
|
||||||
if (SCSI_Sense_Tail == SENSE_LIST_DEEPTH)
|
|
||||||
{
|
|
||||||
SCSI_Sense_Tail = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief SCSI_StartStopUnit
|
|
||||||
* Process Start Stop Unit command
|
|
||||||
* @param lun: Logical unit number
|
|
||||||
* @param params: Command parameters
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static int8_t SCSI_StartStopUnit(uint8_t lun, uint8_t *params)
|
|
||||||
{
|
|
||||||
MSC_BOT_DataLen = 0;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief SCSI_Read10
|
|
||||||
* Process Read10 command
|
|
||||||
* @param lun: Logical unit number
|
|
||||||
* @param params: Command parameters
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static int8_t SCSI_Read10(uint8_t lun , uint8_t *params)
|
|
||||||
{
|
|
||||||
if(MSC_BOT_State == BOT_IDLE) /* Idle */
|
|
||||||
{
|
|
||||||
|
|
||||||
/* case 10 : Ho <> Di */
|
|
||||||
|
|
||||||
if ((MSC_BOT_cbw.bmFlags & 0x80) != 0x80)
|
|
||||||
{
|
|
||||||
SCSI_SenseCode(MSC_BOT_cbw.bLUN,
|
|
||||||
ILLEGAL_REQUEST,
|
|
||||||
INVALID_CDB);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(USBD_STORAGE_fops->IsReady(lun) !=0 )
|
|
||||||
{
|
|
||||||
SCSI_SenseCode(lun,
|
|
||||||
NOT_READY,
|
|
||||||
MEDIUM_NOT_PRESENT);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
SCSI_blk_addr = (params[2] << 24) | \
|
|
||||||
(params[3] << 16) | \
|
|
||||||
(params[4] << 8) | \
|
|
||||||
params[5];
|
|
||||||
|
|
||||||
SCSI_blk_len = (params[7] << 8) | \
|
|
||||||
params[8];
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if( SCSI_CheckAddressRange(lun, SCSI_blk_addr, SCSI_blk_len) < 0)
|
|
||||||
{
|
|
||||||
return -1; /* error */
|
|
||||||
}
|
|
||||||
|
|
||||||
MSC_BOT_State = BOT_DATA_IN;
|
|
||||||
SCSI_blk_addr *= SCSI_blk_size;
|
|
||||||
SCSI_blk_len *= SCSI_blk_size;
|
|
||||||
|
|
||||||
/* cases 4,5 : Hi <> Dn */
|
|
||||||
if (MSC_BOT_cbw.dDataLength != SCSI_blk_len)
|
|
||||||
{
|
|
||||||
SCSI_SenseCode(MSC_BOT_cbw.bLUN,
|
|
||||||
ILLEGAL_REQUEST,
|
|
||||||
INVALID_CDB);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
MSC_BOT_DataLen = MSC_MEDIA_PACKET;
|
|
||||||
|
|
||||||
return SCSI_ProcessRead(lun);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief SCSI_Write10
|
|
||||||
* Process Write10 command
|
|
||||||
* @param lun: Logical unit number
|
|
||||||
* @param params: Command parameters
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
|
|
||||||
static int8_t SCSI_Write10 (uint8_t lun , uint8_t *params)
|
|
||||||
{
|
|
||||||
if (MSC_BOT_State == BOT_IDLE) /* Idle */
|
|
||||||
{
|
|
||||||
|
|
||||||
/* case 8 : Hi <> Do */
|
|
||||||
|
|
||||||
if ((MSC_BOT_cbw.bmFlags & 0x80) == 0x80)
|
|
||||||
{
|
|
||||||
SCSI_SenseCode(MSC_BOT_cbw.bLUN,
|
|
||||||
ILLEGAL_REQUEST,
|
|
||||||
INVALID_CDB);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check whether Media is ready */
|
|
||||||
if(USBD_STORAGE_fops->IsReady(lun) !=0 )
|
|
||||||
{
|
|
||||||
SCSI_SenseCode(lun,
|
|
||||||
NOT_READY,
|
|
||||||
MEDIUM_NOT_PRESENT);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check If media is write-protected */
|
|
||||||
if(USBD_STORAGE_fops->IsWriteProtected(lun) !=0 )
|
|
||||||
{
|
|
||||||
SCSI_SenseCode(lun,
|
|
||||||
NOT_READY,
|
|
||||||
WRITE_PROTECTED);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
SCSI_blk_addr = (params[2] << 24) | \
|
|
||||||
(params[3] << 16) | \
|
|
||||||
(params[4] << 8) | \
|
|
||||||
params[5];
|
|
||||||
SCSI_blk_len = (params[7] << 8) | \
|
|
||||||
params[8];
|
|
||||||
|
|
||||||
/* check if LBA address is in the right range */
|
|
||||||
if(SCSI_CheckAddressRange(lun, SCSI_blk_addr, SCSI_blk_len) < 0)
|
|
||||||
{
|
|
||||||
return -1; /* error */
|
|
||||||
}
|
|
||||||
|
|
||||||
SCSI_blk_addr *= SCSI_blk_size;
|
|
||||||
SCSI_blk_len *= SCSI_blk_size;
|
|
||||||
|
|
||||||
/* cases 3,11,13 : Hn,Ho <> D0 */
|
|
||||||
if (MSC_BOT_cbw.dDataLength != SCSI_blk_len)
|
|
||||||
{
|
|
||||||
SCSI_SenseCode(MSC_BOT_cbw.bLUN,
|
|
||||||
ILLEGAL_REQUEST,
|
|
||||||
INVALID_CDB);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Prepare EP to receive first data packet */
|
|
||||||
MSC_BOT_State = BOT_DATA_OUT;
|
|
||||||
DCD_EP_PrepareRx (cdev,
|
|
||||||
MSC_OUT_EP,
|
|
||||||
MSC_BOT_Data,
|
|
||||||
MIN (SCSI_blk_len, MSC_MEDIA_PACKET));
|
|
||||||
}
|
|
||||||
else /* Write Process ongoing */
|
|
||||||
{
|
|
||||||
return SCSI_ProcessWrite(lun);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief SCSI_Verify10
|
|
||||||
* Process Verify10 command
|
|
||||||
* @param lun: Logical unit number
|
|
||||||
* @param params: Command parameters
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
|
|
||||||
static int8_t SCSI_Verify10(uint8_t lun , uint8_t *params){
|
|
||||||
if ((params[1]& 0x02) == 0x02)
|
|
||||||
{
|
|
||||||
SCSI_SenseCode (lun, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND);
|
|
||||||
return -1; /* Error, Verify Mode Not supported*/
|
|
||||||
}
|
|
||||||
|
|
||||||
if(SCSI_CheckAddressRange(lun, SCSI_blk_addr, SCSI_blk_len) < 0)
|
|
||||||
{
|
|
||||||
return -1; /* error */
|
|
||||||
}
|
|
||||||
MSC_BOT_DataLen = 0;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief SCSI_CheckAddressRange
|
|
||||||
* Check address range
|
|
||||||
* @param lun: Logical unit number
|
|
||||||
* @param blk_offset: first block address
|
|
||||||
* @param blk_nbr: number of block to be processed
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static int8_t SCSI_CheckAddressRange (uint8_t lun , uint32_t blk_offset , uint16_t blk_nbr)
|
|
||||||
{
|
|
||||||
|
|
||||||
if ((blk_offset + blk_nbr) > SCSI_blk_nbr )
|
|
||||||
{
|
|
||||||
SCSI_SenseCode(lun, ILLEGAL_REQUEST, ADDRESS_OUT_OF_RANGE);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief SCSI_ProcessRead
|
|
||||||
* Handle Read Process
|
|
||||||
* @param lun: Logical unit number
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static int8_t SCSI_ProcessRead (uint8_t lun)
|
|
||||||
{
|
|
||||||
uint32_t len;
|
|
||||||
|
|
||||||
len = MIN(SCSI_blk_len , MSC_MEDIA_PACKET);
|
|
||||||
|
|
||||||
if( USBD_STORAGE_fops->Read(lun ,
|
|
||||||
MSC_BOT_Data,
|
|
||||||
SCSI_blk_addr / SCSI_blk_size,
|
|
||||||
len / SCSI_blk_size) < 0)
|
|
||||||
{
|
|
||||||
|
|
||||||
SCSI_SenseCode(lun, HARDWARE_ERROR, UNRECOVERED_READ_ERROR);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
DCD_EP_Tx (cdev,
|
|
||||||
MSC_IN_EP,
|
|
||||||
MSC_BOT_Data,
|
|
||||||
len);
|
|
||||||
|
|
||||||
|
|
||||||
SCSI_blk_addr += len;
|
|
||||||
SCSI_blk_len -= len;
|
|
||||||
|
|
||||||
/* case 6 : Hi = Di */
|
|
||||||
MSC_BOT_csw.dDataResidue -= len;
|
|
||||||
|
|
||||||
if (SCSI_blk_len == 0)
|
|
||||||
{
|
|
||||||
MSC_BOT_State = BOT_LAST_DATA_IN;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief SCSI_ProcessWrite
|
|
||||||
* Handle Write Process
|
|
||||||
* @param lun: Logical unit number
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
|
|
||||||
static int8_t SCSI_ProcessWrite (uint8_t lun)
|
|
||||||
{
|
|
||||||
uint32_t len;
|
|
||||||
|
|
||||||
len = MIN(SCSI_blk_len , MSC_MEDIA_PACKET);
|
|
||||||
|
|
||||||
if(USBD_STORAGE_fops->Write(lun ,
|
|
||||||
MSC_BOT_Data,
|
|
||||||
SCSI_blk_addr / SCSI_blk_size,
|
|
||||||
len / SCSI_blk_size) < 0)
|
|
||||||
{
|
|
||||||
SCSI_SenseCode(lun, HARDWARE_ERROR, WRITE_FAULT);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
SCSI_blk_addr += len;
|
|
||||||
SCSI_blk_len -= len;
|
|
||||||
|
|
||||||
/* case 12 : Ho = Do */
|
|
||||||
MSC_BOT_csw.dDataResidue -= len;
|
|
||||||
|
|
||||||
if (SCSI_blk_len == 0)
|
|
||||||
{
|
|
||||||
MSC_BOT_SendCSW (cdev, CSW_CMD_PASSED);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Prapare EP to Receive next packet */
|
|
||||||
DCD_EP_PrepareRx (cdev,
|
|
||||||
MSC_OUT_EP,
|
|
||||||
MSC_BOT_Data,
|
|
||||||
MIN (SCSI_blk_len, MSC_MEDIA_PACKET));
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
@ -1,179 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_storage_template.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief Memory management layer
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_msc_mem.h"
|
|
||||||
|
|
||||||
/* Private typedef -----------------------------------------------------------*/
|
|
||||||
/* Private define ------------------------------------------------------------*/
|
|
||||||
/* Private macro -------------------------------------------------------------*/
|
|
||||||
/* Private variables ---------------------------------------------------------*/
|
|
||||||
/* Private function prototypes -----------------------------------------------*/
|
|
||||||
/* Extern function prototypes ------------------------------------------------*/
|
|
||||||
/* Private functions ---------------------------------------------------------*/
|
|
||||||
|
|
||||||
#define STORAGE_LUN_NBR 1
|
|
||||||
|
|
||||||
int8_t STORAGE_Init (uint8_t lun);
|
|
||||||
|
|
||||||
int8_t STORAGE_GetCapacity (uint8_t lun,
|
|
||||||
uint32_t *block_num,
|
|
||||||
uint16_t *block_size);
|
|
||||||
|
|
||||||
int8_t STORAGE_IsReady (uint8_t lun);
|
|
||||||
|
|
||||||
int8_t STORAGE_IsWriteProtected (uint8_t lun);
|
|
||||||
|
|
||||||
int8_t STORAGE_Read (uint8_t lun,
|
|
||||||
uint8_t *buf,
|
|
||||||
uint32_t blk_addr,
|
|
||||||
uint16_t blk_len);
|
|
||||||
|
|
||||||
int8_t STORAGE_Write (uint8_t lun,
|
|
||||||
uint8_t *buf,
|
|
||||||
uint32_t blk_addr,
|
|
||||||
uint16_t blk_len);
|
|
||||||
|
|
||||||
int8_t STORAGE_GetMaxLun (void);
|
|
||||||
|
|
||||||
/* USB Mass storage Standard Inquiry Data */
|
|
||||||
const int8_t STORAGE_Inquirydata[] = {//36
|
|
||||||
|
|
||||||
/* LUN 0 */
|
|
||||||
0x00,
|
|
||||||
0x80,
|
|
||||||
0x02,
|
|
||||||
0x02,
|
|
||||||
(USBD_STD_INQUIRY_LENGTH - 5),
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
'S', 'T', 'M', ' ', ' ', ' ', ' ', ' ', /* Manufacturer : 8 bytes */
|
|
||||||
'P', 'r', 'o', 'd', 'u', 't', ' ', ' ', /* Product : 16 Bytes */
|
|
||||||
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
|
|
||||||
'0', '.', '0' ,'1', /* Version : 4 Bytes */
|
|
||||||
};
|
|
||||||
|
|
||||||
USBD_STORAGE_cb_TypeDef USBD_MICRO_SDIO_fops =
|
|
||||||
{
|
|
||||||
STORAGE_Init,
|
|
||||||
STORAGE_GetCapacity,
|
|
||||||
STORAGE_IsReady,
|
|
||||||
STORAGE_IsWriteProtected,
|
|
||||||
STORAGE_Read,
|
|
||||||
STORAGE_Write,
|
|
||||||
STORAGE_GetMaxLun,
|
|
||||||
STORAGE_Inquirydata,
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
USBD_STORAGE_cb_TypeDef *USBD_STORAGE_fops = &USBD_MICRO_SDIO_fops;
|
|
||||||
/*******************************************************************************
|
|
||||||
* Function Name : Read_Memory
|
|
||||||
* Description : Handle the Read operation from the microSD card.
|
|
||||||
* Input : None.
|
|
||||||
* Output : None.
|
|
||||||
* Return : None.
|
|
||||||
*******************************************************************************/
|
|
||||||
int8_t STORAGE_Init (uint8_t lun)
|
|
||||||
{
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Function Name : Read_Memory
|
|
||||||
* Description : Handle the Read operation from the STORAGE card.
|
|
||||||
* Input : None.
|
|
||||||
* Output : None.
|
|
||||||
* Return : None.
|
|
||||||
*******************************************************************************/
|
|
||||||
int8_t STORAGE_GetCapacity (uint8_t lun, uint32_t *block_num, uint16_t *block_size)
|
|
||||||
{
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Function Name : Read_Memory
|
|
||||||
* Description : Handle the Read operation from the STORAGE card.
|
|
||||||
* Input : None.
|
|
||||||
* Output : None.
|
|
||||||
* Return : None.
|
|
||||||
*******************************************************************************/
|
|
||||||
int8_t STORAGE_IsReady (uint8_t lun)
|
|
||||||
{
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Function Name : Read_Memory
|
|
||||||
* Description : Handle the Read operation from the STORAGE card.
|
|
||||||
* Input : None.
|
|
||||||
* Output : None.
|
|
||||||
* Return : None.
|
|
||||||
*******************************************************************************/
|
|
||||||
int8_t STORAGE_IsWriteProtected (uint8_t lun)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Function Name : Read_Memory
|
|
||||||
* Description : Handle the Read operation from the STORAGE card.
|
|
||||||
* Input : None.
|
|
||||||
* Output : None.
|
|
||||||
* Return : None.
|
|
||||||
*******************************************************************************/
|
|
||||||
int8_t STORAGE_Read (uint8_t lun,
|
|
||||||
uint8_t *buf,
|
|
||||||
uint32_t blk_addr,
|
|
||||||
uint16_t blk_len)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/*******************************************************************************
|
|
||||||
* Function Name : Write_Memory
|
|
||||||
* Description : Handle the Write operation to the STORAGE card.
|
|
||||||
* Input : None.
|
|
||||||
* Output : None.
|
|
||||||
* Return : None.
|
|
||||||
*******************************************************************************/
|
|
||||||
int8_t STORAGE_Write (uint8_t lun,
|
|
||||||
uint8_t *buf,
|
|
||||||
uint32_t blk_addr,
|
|
||||||
uint16_t blk_len)
|
|
||||||
{
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
/*******************************************************************************
|
|
||||||
* Function Name : Write_Memory
|
|
||||||
* Description : Handle the Write operation to the STORAGE card.
|
|
||||||
* Input : None.
|
|
||||||
* Output : None.
|
|
||||||
* Return : None.
|
|
||||||
*******************************************************************************/
|
|
||||||
int8_t STORAGE_GetMaxLun (void)
|
|
||||||
{
|
|
||||||
return (STORAGE_LUN_NBR - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
||||||
|
|
@ -1,2 +0,0 @@
|
|||||||
SUB_FOLDER += firmware/arch/stm32f4xx/lib/STM32_USB_Device_Library/Core/src
|
|
||||||
INCLUDES += firmware/arch/stm32f4xx/lib/STM32_USB_Device_Library/Core/inc
|
|
@ -1,78 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_conf_template.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief usb device configuration template file
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __USBD_CONF__H__
|
|
||||||
#define __USBD_CONF__H__
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "stm32f2xx.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_CONF_Exported_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
#define USE_USB_OTG_HS
|
|
||||||
|
|
||||||
#define USBD_CFG_MAX_NUM 1
|
|
||||||
#define USB_MAX_STR_DESC_SIZ 64
|
|
||||||
#define USBD_EP0_MAX_PACKET_SIZE 64
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_CONF_Exported_Types
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_CONF_Exported_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_CONF_Exported_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_CONF_Exported_FunctionsPrototype
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#endif //__USBD_CONF__H__
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
||||||
|
|
@ -1,114 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_core.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief Header file for usbd_core.c
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __USBD_CORE_H
|
|
||||||
#define __USBD_CORE_H
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usb_dcd.h"
|
|
||||||
#include "usbd_def.h"
|
|
||||||
#include "usbd_conf.h"
|
|
||||||
|
|
||||||
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_CORE
|
|
||||||
* @brief This file is the Header file for usbd_core.c file
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_CORE_Exported_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
USBD_OK = 0,
|
|
||||||
USBD_BUSY,
|
|
||||||
USBD_FAIL,
|
|
||||||
}USBD_Status;
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_CORE_Exported_TypesDefinitions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_CORE_Exported_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_CORE_Exported_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_CORE_Exported_FunctionsPrototype
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
void USBD_Init(USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
USB_OTG_CORE_ID_TypeDef coreID,
|
|
||||||
USBD_DEVICE *pDevice,
|
|
||||||
USBD_Class_cb_TypeDef *class_cb,
|
|
||||||
USBD_Usr_cb_TypeDef *usr_cb);
|
|
||||||
|
|
||||||
USBD_Status USBD_DeInit(USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
|
|
||||||
USBD_Status USBD_ClrCfg(USB_OTG_CORE_HANDLE *pdev, uint8_t cfgidx);
|
|
||||||
|
|
||||||
USBD_Status USBD_SetCfg(USB_OTG_CORE_HANDLE *pdev, uint8_t cfgidx);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#endif /* __USBD_CORE_H */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,149 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_def.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief general defines for the usb device library
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef __USBD_DEF_H
|
|
||||||
#define __USBD_DEF_H
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_conf.h"
|
|
||||||
|
|
||||||
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_DEF
|
|
||||||
* @brief general defines for the usb device library file
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_DEF_Exported_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef NULL
|
|
||||||
#define NULL 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define USB_LEN_DEV_QUALIFIER_DESC 0x0A
|
|
||||||
#define USB_LEN_DEV_DESC 0x12
|
|
||||||
#define USB_LEN_CFG_DESC 0x09
|
|
||||||
#define USB_LEN_IF_DESC 0x09
|
|
||||||
#define USB_LEN_EP_DESC 0x07
|
|
||||||
#define USB_LEN_OTG_DESC 0x03
|
|
||||||
|
|
||||||
#define USBD_IDX_LANGID_STR 0x00
|
|
||||||
#define USBD_IDX_MFC_STR 0x01
|
|
||||||
#define USBD_IDX_PRODUCT_STR 0x02
|
|
||||||
#define USBD_IDX_SERIAL_STR 0x03
|
|
||||||
#define USBD_IDX_CONFIG_STR 0x04
|
|
||||||
#define USBD_IDX_INTERFACE_STR 0x05
|
|
||||||
|
|
||||||
#define USB_REQ_TYPE_STANDARD 0x00
|
|
||||||
#define USB_REQ_TYPE_CLASS 0x20
|
|
||||||
#define USB_REQ_TYPE_VENDOR 0x40
|
|
||||||
#define USB_REQ_TYPE_MASK 0x60
|
|
||||||
|
|
||||||
#define USB_REQ_RECIPIENT_DEVICE 0x00
|
|
||||||
#define USB_REQ_RECIPIENT_INTERFACE 0x01
|
|
||||||
#define USB_REQ_RECIPIENT_ENDPOINT 0x02
|
|
||||||
#define USB_REQ_RECIPIENT_MASK 0x03
|
|
||||||
|
|
||||||
#define USB_REQ_GET_STATUS 0x00
|
|
||||||
#define USB_REQ_CLEAR_FEATURE 0x01
|
|
||||||
#define USB_REQ_SET_FEATURE 0x03
|
|
||||||
#define USB_REQ_SET_ADDRESS 0x05
|
|
||||||
#define USB_REQ_GET_DESCRIPTOR 0x06
|
|
||||||
#define USB_REQ_SET_DESCRIPTOR 0x07
|
|
||||||
#define USB_REQ_GET_CONFIGURATION 0x08
|
|
||||||
#define USB_REQ_SET_CONFIGURATION 0x09
|
|
||||||
#define USB_REQ_GET_INTERFACE 0x0A
|
|
||||||
#define USB_REQ_SET_INTERFACE 0x0B
|
|
||||||
#define USB_REQ_SYNCH_FRAME 0x0C
|
|
||||||
|
|
||||||
#define USB_DESC_TYPE_DEVICE 1
|
|
||||||
#define USB_DESC_TYPE_CONFIGURATION 2
|
|
||||||
#define USB_DESC_TYPE_STRING 3
|
|
||||||
#define USB_DESC_TYPE_INTERFACE 4
|
|
||||||
#define USB_DESC_TYPE_ENDPOINT 5
|
|
||||||
#define USB_DESC_TYPE_DEVICE_QUALIFIER 6
|
|
||||||
#define USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION 7
|
|
||||||
|
|
||||||
|
|
||||||
#define USB_CONFIG_REMOTE_WAKEUP 2
|
|
||||||
#define USB_CONFIG_SELF_POWERED 1
|
|
||||||
|
|
||||||
#define USB_FEATURE_EP_HALT 0
|
|
||||||
#define USB_FEATURE_REMOTE_WAKEUP 1
|
|
||||||
#define USB_FEATURE_TEST_MODE 2
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_DEF_Exported_TypesDefinitions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_DEF_Exported_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
#define SWAPBYTE(addr) (((uint16_t)(*((uint8_t *)(addr)))) + \
|
|
||||||
(((uint16_t)(*(((uint8_t *)(addr)) + 1))) << 8))
|
|
||||||
|
|
||||||
#define LOBYTE(x) ((uint8_t)(x & 0x00FF))
|
|
||||||
#define HIBYTE(x) ((uint8_t)((x & 0xFF00) >>8))
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_DEF_Exported_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_DEF_Exported_FunctionsPrototype
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#endif /* __USBD_DEF_H */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
@ -1,115 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_ioreq.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief header file for the usbd_ioreq.c file
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef __USBD_IOREQ_H_
|
|
||||||
#define __USBD_IOREQ_H_
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_def.h"
|
|
||||||
#include "usbd_core.h"
|
|
||||||
|
|
||||||
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_IOREQ
|
|
||||||
* @brief header file for the usbd_ioreq.c file
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_IOREQ_Exported_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_IOREQ_Exported_Types
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_IOREQ_Exported_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_IOREQ_Exported_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_IOREQ_Exported_FunctionsPrototype
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
USBD_Status USBD_CtlSendData (USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
uint8_t *buf,
|
|
||||||
uint16_t len);
|
|
||||||
|
|
||||||
USBD_Status USBD_CtlContinueSendData (USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
uint8_t *pbuf,
|
|
||||||
uint16_t len);
|
|
||||||
|
|
||||||
USBD_Status USBD_CtlPrepareRx (USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
uint8_t *pbuf,
|
|
||||||
uint16_t len);
|
|
||||||
|
|
||||||
USBD_Status USBD_CtlContinueRx (USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
uint8_t *pbuf,
|
|
||||||
uint16_t len);
|
|
||||||
|
|
||||||
USBD_Status USBD_CtlSendStatus (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
|
|
||||||
USBD_Status USBD_CtlReceiveStatus (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
|
|
||||||
uint16_t USBD_GetRxCount (USB_OTG_CORE_HANDLE *pdev ,
|
|
||||||
uint8_t epnum);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#endif /* __USBD_IOREQ_H_ */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
@ -1,102 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_req.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief header file for the usbd_req.c file
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef __USB_REQUEST_H_
|
|
||||||
#define __USB_REQUEST_H_
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_def.h"
|
|
||||||
#include "usbd_core.h"
|
|
||||||
#include "usbd_conf.h"
|
|
||||||
|
|
||||||
|
|
||||||
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_REQ
|
|
||||||
* @brief header file for the usbd_ioreq.c file
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_REQ_Exported_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_REQ_Exported_Types
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_REQ_Exported_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_REQ_Exported_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_REQ_Exported_FunctionsPrototype
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
USBD_Status USBD_StdDevReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req);
|
|
||||||
USBD_Status USBD_StdItfReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req);
|
|
||||||
USBD_Status USBD_StdEPReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req);
|
|
||||||
void USBD_ParseSetupRequest( USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
USB_SETUP_REQ *req);
|
|
||||||
|
|
||||||
void USBD_CtlError( USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
USB_SETUP_REQ *req);
|
|
||||||
|
|
||||||
void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len);
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#endif /* __USB_REQUEST_H_ */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
@ -1,135 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_usr.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief Header file for usbd_usr.c
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __USBD_USR_H__
|
|
||||||
#define __USBD_USR_H__
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_core.h"
|
|
||||||
|
|
||||||
|
|
||||||
/** @addtogroup USBD_USER
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @addtogroup USBD_MSC_DEMO_USER_CALLBACKS
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_USR
|
|
||||||
* @brief This file is the Header file for usbd_usr.c
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_USR_Exported_Types
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
extern USBD_Usr_cb_TypeDef USR_cb;
|
|
||||||
extern USBD_Usr_cb_TypeDef USR_FS_cb;
|
|
||||||
extern USBD_Usr_cb_TypeDef USR_HS_cb;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_USR_Exported_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_USR_Exported_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_USR_Exported_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
void USBD_USR_Init(void);
|
|
||||||
void USBD_USR_DeviceReset (uint8_t speed);
|
|
||||||
void USBD_USR_DeviceConfigured (void);
|
|
||||||
void USBD_USR_DeviceSuspended(void);
|
|
||||||
void USBD_USR_DeviceResumed(void);
|
|
||||||
|
|
||||||
void USBD_USR_DeviceConnected(void);
|
|
||||||
void USBD_USR_DeviceDisconnected(void);
|
|
||||||
|
|
||||||
void USBD_USR_FS_Init(void);
|
|
||||||
void USBD_USR_FS_DeviceReset (uint8_t speed);
|
|
||||||
void USBD_USR_FS_DeviceConfigured (void);
|
|
||||||
void USBD_USR_FS_DeviceSuspended(void);
|
|
||||||
void USBD_USR_FS_DeviceResumed(void);
|
|
||||||
|
|
||||||
void USBD_USR_FS_DeviceConnected(void);
|
|
||||||
void USBD_USR_FS_DeviceDisconnected(void);
|
|
||||||
|
|
||||||
void USBD_USR_HS_Init(void);
|
|
||||||
void USBD_USR_HS_DeviceReset (uint8_t speed);
|
|
||||||
void USBD_USR_HS_DeviceConfigured (void);
|
|
||||||
void USBD_USR_HS_DeviceSuspended(void);
|
|
||||||
void USBD_USR_HS_DeviceResumed(void);
|
|
||||||
|
|
||||||
void USBD_USR_HS_DeviceConnected(void);
|
|
||||||
void USBD_USR_HS_DeviceDisconnected(void);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_USR_Exported_FunctionsPrototype
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#endif /*__USBD_USR_H__*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,476 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_core.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief This file provides all the USBD core functions.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_core.h"
|
|
||||||
#include "usbd_req.h"
|
|
||||||
#include "usbd_ioreq.h"
|
|
||||||
#include "usb_dcd_int.h"
|
|
||||||
#include "usb_bsp.h"
|
|
||||||
|
|
||||||
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_CORE
|
|
||||||
* @brief usbd core module
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_CORE_Private_TypesDefinitions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_CORE_Private_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_CORE_Private_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_CORE_Private_FunctionPrototypes
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
static uint8_t USBD_SetupStage(USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
static uint8_t USBD_DataOutStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum);
|
|
||||||
static uint8_t USBD_DataInStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum);
|
|
||||||
static uint8_t USBD_SOF(USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
static uint8_t USBD_Reset(USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
static uint8_t USBD_Suspend(USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
static uint8_t USBD_Resume(USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
#ifdef VBUS_SENSING_ENABLED
|
|
||||||
static uint8_t USBD_DevConnected(USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
static uint8_t USBD_DevDisconnected(USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
#endif
|
|
||||||
static uint8_t USBD_IsoINIncomplete(USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
static uint8_t USBD_IsoOUTIncomplete(USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_CORE_Private_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
USBD_DCD_INT_cb_TypeDef USBD_DCD_INT_cb =
|
|
||||||
{
|
|
||||||
USBD_DataOutStage,
|
|
||||||
USBD_DataInStage,
|
|
||||||
USBD_SetupStage,
|
|
||||||
USBD_SOF,
|
|
||||||
USBD_Reset,
|
|
||||||
USBD_Suspend,
|
|
||||||
USBD_Resume,
|
|
||||||
USBD_IsoINIncomplete,
|
|
||||||
USBD_IsoOUTIncomplete,
|
|
||||||
#ifdef VBUS_SENSING_ENABLED
|
|
||||||
USBD_DevConnected,
|
|
||||||
USBD_DevDisconnected,
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
USBD_DCD_INT_cb_TypeDef *USBD_DCD_INT_fops = &USBD_DCD_INT_cb;
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_CORE_Private_Functions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_Init
|
|
||||||
* Initailizes the device stack and load the class driver
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param core_address: USB OTG core ID
|
|
||||||
* @param class_cb: Class callback structure address
|
|
||||||
* @param usr_cb: User callback structure address
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void USBD_Init(USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
USB_OTG_CORE_ID_TypeDef coreID,
|
|
||||||
USBD_DEVICE *pDevice,
|
|
||||||
USBD_Class_cb_TypeDef *class_cb,
|
|
||||||
USBD_Usr_cb_TypeDef *usr_cb)
|
|
||||||
{
|
|
||||||
/* Hardware Init */
|
|
||||||
USB_OTG_BSP_Init(pdev);
|
|
||||||
|
|
||||||
USBD_DeInit(pdev);
|
|
||||||
|
|
||||||
/*Register class and user callbacks */
|
|
||||||
pdev->dev.class_cb = class_cb;
|
|
||||||
pdev->dev.usr_cb = usr_cb;
|
|
||||||
pdev->dev.usr_device = pDevice;
|
|
||||||
|
|
||||||
/* set USB OTG core params */
|
|
||||||
DCD_Init(pdev , coreID);
|
|
||||||
|
|
||||||
/* Upon Init call usr callback */
|
|
||||||
pdev->dev.usr_cb->Init();
|
|
||||||
|
|
||||||
/* Enable Interrupts */
|
|
||||||
USB_OTG_BSP_EnableInterrupt(pdev);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_DeInit
|
|
||||||
* Re-Initialize th deviuce library
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @retval status: status
|
|
||||||
*/
|
|
||||||
USBD_Status USBD_DeInit(USB_OTG_CORE_HANDLE *pdev)
|
|
||||||
{
|
|
||||||
/* Software Init */
|
|
||||||
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_SetupStage
|
|
||||||
* Handle the setup stage
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint8_t USBD_SetupStage(USB_OTG_CORE_HANDLE *pdev)
|
|
||||||
{
|
|
||||||
USB_SETUP_REQ req;
|
|
||||||
|
|
||||||
USBD_ParseSetupRequest(pdev , &req);
|
|
||||||
|
|
||||||
switch (req.bmRequest & 0x1F)
|
|
||||||
{
|
|
||||||
case USB_REQ_RECIPIENT_DEVICE:
|
|
||||||
USBD_StdDevReq (pdev, &req);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case USB_REQ_RECIPIENT_INTERFACE:
|
|
||||||
USBD_StdItfReq(pdev, &req);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case USB_REQ_RECIPIENT_ENDPOINT:
|
|
||||||
USBD_StdEPReq(pdev, &req);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
DCD_EP_Stall(pdev , req.bmRequest & 0x80);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_DataOutStage
|
|
||||||
* Handle data out stage
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param epnum: endpoint index
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint8_t USBD_DataOutStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum)
|
|
||||||
{
|
|
||||||
USB_OTG_EP *ep;
|
|
||||||
|
|
||||||
if(epnum == 0)
|
|
||||||
{
|
|
||||||
ep = &pdev->dev.out_ep[0];
|
|
||||||
if ( pdev->dev.device_state == USB_OTG_EP0_DATA_OUT)
|
|
||||||
{
|
|
||||||
if(ep->rem_data_len > ep->maxpacket)
|
|
||||||
{
|
|
||||||
ep->rem_data_len -= ep->maxpacket;
|
|
||||||
|
|
||||||
if(pdev->cfg.dma_enable == 1)
|
|
||||||
{
|
|
||||||
/* in slave mode this, is handled by the RxSTSQLvl ISR */
|
|
||||||
ep->xfer_buff += ep->maxpacket;
|
|
||||||
}
|
|
||||||
USBD_CtlContinueRx (pdev,
|
|
||||||
ep->xfer_buff,
|
|
||||||
MIN(ep->rem_data_len ,ep->maxpacket));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if((pdev->dev.class_cb->EP0_RxReady != NULL)&&
|
|
||||||
(pdev->dev.device_status == USB_OTG_CONFIGURED))
|
|
||||||
{
|
|
||||||
pdev->dev.class_cb->EP0_RxReady(pdev);
|
|
||||||
}
|
|
||||||
USBD_CtlSendStatus(pdev);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if((pdev->dev.class_cb->DataOut != NULL)&&
|
|
||||||
(pdev->dev.device_status == USB_OTG_CONFIGURED))
|
|
||||||
{
|
|
||||||
pdev->dev.class_cb->DataOut(pdev, epnum);
|
|
||||||
}
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_DataInStage
|
|
||||||
* Handle data in stage
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param epnum: endpoint index
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint8_t USBD_DataInStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum)
|
|
||||||
{
|
|
||||||
USB_OTG_EP *ep;
|
|
||||||
|
|
||||||
if(epnum == 0)
|
|
||||||
{
|
|
||||||
ep = &pdev->dev.in_ep[0];
|
|
||||||
if ( pdev->dev.device_state == USB_OTG_EP0_DATA_IN)
|
|
||||||
{
|
|
||||||
if(ep->rem_data_len > ep->maxpacket)
|
|
||||||
{
|
|
||||||
ep->rem_data_len -= ep->maxpacket;
|
|
||||||
if(pdev->cfg.dma_enable == 1)
|
|
||||||
{
|
|
||||||
/* in slave mode this, is handled by the TxFifoEmpty ISR */
|
|
||||||
ep->xfer_buff += ep->maxpacket;
|
|
||||||
}
|
|
||||||
USBD_CtlContinueSendData (pdev,
|
|
||||||
ep->xfer_buff,
|
|
||||||
ep->rem_data_len);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{ /* last packet is MPS multiple, so send ZLP packet */
|
|
||||||
if((ep->total_data_len % ep->maxpacket == 0) &&
|
|
||||||
(ep->total_data_len >= ep->maxpacket) &&
|
|
||||||
(ep->total_data_len < ep->ctl_data_len ))
|
|
||||||
{
|
|
||||||
|
|
||||||
USBD_CtlContinueSendData(pdev , NULL, 0);
|
|
||||||
ep->ctl_data_len = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if((pdev->dev.class_cb->EP0_TxSent != NULL)&&
|
|
||||||
(pdev->dev.device_status == USB_OTG_CONFIGURED))
|
|
||||||
{
|
|
||||||
pdev->dev.class_cb->EP0_TxSent(pdev);
|
|
||||||
}
|
|
||||||
USBD_CtlReceiveStatus(pdev);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if((pdev->dev.class_cb->DataIn != NULL)&&
|
|
||||||
(pdev->dev.device_status == USB_OTG_CONFIGURED))
|
|
||||||
{
|
|
||||||
pdev->dev.class_cb->DataIn(pdev, epnum);
|
|
||||||
}
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_Reset
|
|
||||||
* Handle Reset event
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
|
|
||||||
static uint8_t USBD_Reset(USB_OTG_CORE_HANDLE *pdev)
|
|
||||||
{
|
|
||||||
/* Open EP0 OUT */
|
|
||||||
DCD_EP_Open(pdev,
|
|
||||||
0x00,
|
|
||||||
USB_OTG_MAX_EP0_SIZE,
|
|
||||||
EP_TYPE_CTRL);
|
|
||||||
|
|
||||||
/* Open EP0 IN */
|
|
||||||
DCD_EP_Open(pdev,
|
|
||||||
0x80,
|
|
||||||
USB_OTG_MAX_EP0_SIZE,
|
|
||||||
EP_TYPE_CTRL);
|
|
||||||
|
|
||||||
/* Upon Reset call usr call back */
|
|
||||||
pdev->dev.device_status = USB_OTG_DEFAULT;
|
|
||||||
pdev->dev.usr_cb->DeviceReset(pdev->cfg.speed);
|
|
||||||
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_Resume
|
|
||||||
* Handle Resume event
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
|
|
||||||
static uint8_t USBD_Resume(USB_OTG_CORE_HANDLE *pdev)
|
|
||||||
{
|
|
||||||
/* Upon Resume call usr call back */
|
|
||||||
pdev->dev.usr_cb->DeviceResumed();
|
|
||||||
pdev->dev.device_status = USB_OTG_CONFIGURED;
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_Suspend
|
|
||||||
* Handle Suspend event
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
|
|
||||||
static uint8_t USBD_Suspend(USB_OTG_CORE_HANDLE *pdev)
|
|
||||||
{
|
|
||||||
|
|
||||||
pdev->dev.device_status = USB_OTG_SUSPENDED;
|
|
||||||
/* Upon Resume call usr call back */
|
|
||||||
pdev->dev.usr_cb->DeviceSuspended();
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_SOF
|
|
||||||
* Handle SOF event
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
|
|
||||||
static uint8_t USBD_SOF(USB_OTG_CORE_HANDLE *pdev)
|
|
||||||
{
|
|
||||||
if(pdev->dev.class_cb->SOF)
|
|
||||||
{
|
|
||||||
pdev->dev.class_cb->SOF(pdev);
|
|
||||||
}
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief USBD_SetCfg
|
|
||||||
* Configure device and start the interface
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param cfgidx: configuration index
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
|
|
||||||
USBD_Status USBD_SetCfg(USB_OTG_CORE_HANDLE *pdev, uint8_t cfgidx)
|
|
||||||
{
|
|
||||||
pdev->dev.class_cb->Init(pdev, cfgidx);
|
|
||||||
|
|
||||||
/* Upon set config call usr call back */
|
|
||||||
pdev->dev.usr_cb->DeviceConfigured();
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_ClrCfg
|
|
||||||
* Clear current configuration
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param cfgidx: configuration index
|
|
||||||
* @retval status: USBD_Status
|
|
||||||
*/
|
|
||||||
USBD_Status USBD_ClrCfg(USB_OTG_CORE_HANDLE *pdev, uint8_t cfgidx)
|
|
||||||
{
|
|
||||||
pdev->dev.class_cb->DeInit(pdev, cfgidx);
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_IsoINIncomplete
|
|
||||||
* Handle iso in incomplete event
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint8_t USBD_IsoINIncomplete(USB_OTG_CORE_HANDLE *pdev)
|
|
||||||
{
|
|
||||||
pdev->dev.class_cb->IsoINIncomplete(pdev);
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_IsoOUTIncomplete
|
|
||||||
* Handle iso out incomplete event
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint8_t USBD_IsoOUTIncomplete(USB_OTG_CORE_HANDLE *pdev)
|
|
||||||
{
|
|
||||||
pdev->dev.class_cb->IsoOUTIncomplete(pdev);
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef VBUS_SENSING_ENABLED
|
|
||||||
/**
|
|
||||||
* @brief USBD_DevConnected
|
|
||||||
* Handle device connection event
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint8_t USBD_DevConnected(USB_OTG_CORE_HANDLE *pdev)
|
|
||||||
{
|
|
||||||
pdev->dev.usr_cb->DeviceConnected();
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_DevDisconnected
|
|
||||||
* Handle device disconnection event
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint8_t USBD_DevDisconnected(USB_OTG_CORE_HANDLE *pdev)
|
|
||||||
{
|
|
||||||
pdev->dev.usr_cb->DeviceDisconnected();
|
|
||||||
pdev->dev.class_cb->DeInit(pdev, 0);
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
||||||
|
|
@ -1,237 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_ioreq.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief This file provides the IO requests APIs for control endpoints.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_ioreq.h"
|
|
||||||
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_IOREQ
|
|
||||||
* @brief control I/O requests module
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_IOREQ_Private_TypesDefinitions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_IOREQ_Private_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_IOREQ_Private_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_IOREQ_Private_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_IOREQ_Private_FunctionPrototypes
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_IOREQ_Private_Functions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_CtlSendData
|
|
||||||
* send data on the ctl pipe
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param buff: pointer to data buffer
|
|
||||||
* @param len: length of data to be sent
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
USBD_Status USBD_CtlSendData (USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
uint8_t *pbuf,
|
|
||||||
uint16_t len)
|
|
||||||
{
|
|
||||||
USBD_Status ret = USBD_OK;
|
|
||||||
|
|
||||||
pdev->dev.in_ep[0].total_data_len = len;
|
|
||||||
pdev->dev.in_ep[0].rem_data_len = len;
|
|
||||||
pdev->dev.device_state = USB_OTG_EP0_DATA_IN;
|
|
||||||
|
|
||||||
DCD_EP_Tx (pdev, 0, pbuf, len);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_CtlContinueSendData
|
|
||||||
* continue sending data on the ctl pipe
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param buff: pointer to data buffer
|
|
||||||
* @param len: length of data to be sent
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
USBD_Status USBD_CtlContinueSendData (USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
uint8_t *pbuf,
|
|
||||||
uint16_t len)
|
|
||||||
{
|
|
||||||
USBD_Status ret = USBD_OK;
|
|
||||||
|
|
||||||
DCD_EP_Tx (pdev, 0, pbuf, len);
|
|
||||||
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_CtlPrepareRx
|
|
||||||
* receive data on the ctl pipe
|
|
||||||
* @param pdev: USB OTG device instance
|
|
||||||
* @param buff: pointer to data buffer
|
|
||||||
* @param len: length of data to be received
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
USBD_Status USBD_CtlPrepareRx (USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
uint8_t *pbuf,
|
|
||||||
uint16_t len)
|
|
||||||
{
|
|
||||||
USBD_Status ret = USBD_OK;
|
|
||||||
|
|
||||||
pdev->dev.out_ep[0].total_data_len = len;
|
|
||||||
pdev->dev.out_ep[0].rem_data_len = len;
|
|
||||||
pdev->dev.device_state = USB_OTG_EP0_DATA_OUT;
|
|
||||||
|
|
||||||
DCD_EP_PrepareRx (pdev,
|
|
||||||
0,
|
|
||||||
pbuf,
|
|
||||||
len);
|
|
||||||
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_CtlContinueRx
|
|
||||||
* continue receive data on the ctl pipe
|
|
||||||
* @param pdev: USB OTG device instance
|
|
||||||
* @param buff: pointer to data buffer
|
|
||||||
* @param len: length of data to be received
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
USBD_Status USBD_CtlContinueRx (USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
uint8_t *pbuf,
|
|
||||||
uint16_t len)
|
|
||||||
{
|
|
||||||
USBD_Status ret = USBD_OK;
|
|
||||||
|
|
||||||
DCD_EP_PrepareRx (pdev,
|
|
||||||
0,
|
|
||||||
pbuf,
|
|
||||||
len);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief USBD_CtlSendStatus
|
|
||||||
* send zero lzngth packet on the ctl pipe
|
|
||||||
* @param pdev: USB OTG device instance
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
USBD_Status USBD_CtlSendStatus (USB_OTG_CORE_HANDLE *pdev)
|
|
||||||
{
|
|
||||||
USBD_Status ret = USBD_OK;
|
|
||||||
pdev->dev.device_state = USB_OTG_EP0_STATUS_IN;
|
|
||||||
DCD_EP_Tx (pdev,
|
|
||||||
0,
|
|
||||||
NULL,
|
|
||||||
0);
|
|
||||||
|
|
||||||
USB_OTG_EP0_OutStart(pdev);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_CtlReceiveStatus
|
|
||||||
* receive zero lzngth packet on the ctl pipe
|
|
||||||
* @param pdev: USB OTG device instance
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
USBD_Status USBD_CtlReceiveStatus (USB_OTG_CORE_HANDLE *pdev)
|
|
||||||
{
|
|
||||||
USBD_Status ret = USBD_OK;
|
|
||||||
pdev->dev.device_state = USB_OTG_EP0_STATUS_OUT;
|
|
||||||
DCD_EP_PrepareRx ( pdev,
|
|
||||||
0,
|
|
||||||
NULL,
|
|
||||||
0);
|
|
||||||
|
|
||||||
USB_OTG_EP0_OutStart(pdev);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_GetRxCount
|
|
||||||
* returns the received data length
|
|
||||||
* @param pdev: USB OTG device instance
|
|
||||||
* epnum: endpoint index
|
|
||||||
* @retval Rx Data blength
|
|
||||||
*/
|
|
||||||
uint16_t USBD_GetRxCount (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum)
|
|
||||||
{
|
|
||||||
return pdev->dev.out_ep[epnum].xfer_count;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
@ -1,868 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_req.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief This file provides the standard USB requests following chapter 9.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_req.h"
|
|
||||||
#include "usbd_ioreq.h"
|
|
||||||
#include "usbd_desc.h"
|
|
||||||
|
|
||||||
|
|
||||||
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_REQ
|
|
||||||
* @brief USB standard requests module
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_REQ_Private_TypesDefinitions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_REQ_Private_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_REQ_Private_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_REQ_Private_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
|
||||||
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
|
||||||
#pragma data_alignment=4
|
|
||||||
#endif
|
|
||||||
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
|
||||||
__ALIGN_BEGIN uint32_t USBD_ep_status __ALIGN_END = 0;
|
|
||||||
|
|
||||||
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
|
||||||
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
|
||||||
#pragma data_alignment=4
|
|
||||||
#endif
|
|
||||||
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
|
||||||
__ALIGN_BEGIN uint32_t USBD_default_cfg __ALIGN_END = 0;
|
|
||||||
|
|
||||||
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
|
||||||
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
|
||||||
#pragma data_alignment=4
|
|
||||||
#endif
|
|
||||||
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
|
||||||
__ALIGN_BEGIN uint32_t USBD_cfg_status __ALIGN_END = 0;
|
|
||||||
|
|
||||||
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
|
||||||
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
|
||||||
#pragma data_alignment=4
|
|
||||||
#endif
|
|
||||||
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
|
||||||
__ALIGN_BEGIN uint8_t USBD_StrDesc[USB_MAX_STR_DESC_SIZ] __ALIGN_END ;
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_REQ_Private_FunctionPrototypes
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
static void USBD_GetDescriptor(USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
USB_SETUP_REQ *req);
|
|
||||||
|
|
||||||
static void USBD_SetAddress(USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
USB_SETUP_REQ *req);
|
|
||||||
|
|
||||||
static void USBD_SetConfig(USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
USB_SETUP_REQ *req);
|
|
||||||
|
|
||||||
static void USBD_GetConfig(USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
USB_SETUP_REQ *req);
|
|
||||||
|
|
||||||
static void USBD_GetStatus(USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
USB_SETUP_REQ *req);
|
|
||||||
|
|
||||||
static void USBD_SetFeature(USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
USB_SETUP_REQ *req);
|
|
||||||
|
|
||||||
static void USBD_ClrFeature(USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
USB_SETUP_REQ *req);
|
|
||||||
|
|
||||||
static uint8_t USBD_GetLen(uint8_t *buf);
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_REQ_Private_Functions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_StdDevReq
|
|
||||||
* Handle standard usb device requests
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param req: usb request
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
USBD_Status USBD_StdDevReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req)
|
|
||||||
{
|
|
||||||
USBD_Status ret = USBD_OK;
|
|
||||||
|
|
||||||
switch (req->bRequest)
|
|
||||||
{
|
|
||||||
case USB_REQ_GET_DESCRIPTOR:
|
|
||||||
|
|
||||||
USBD_GetDescriptor (pdev, req) ;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case USB_REQ_SET_ADDRESS:
|
|
||||||
USBD_SetAddress(pdev, req);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case USB_REQ_SET_CONFIGURATION:
|
|
||||||
USBD_SetConfig (pdev , req);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case USB_REQ_GET_CONFIGURATION:
|
|
||||||
USBD_GetConfig (pdev , req);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case USB_REQ_GET_STATUS:
|
|
||||||
USBD_GetStatus (pdev , req);
|
|
||||||
break;
|
|
||||||
|
|
||||||
|
|
||||||
case USB_REQ_SET_FEATURE:
|
|
||||||
USBD_SetFeature (pdev , req);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case USB_REQ_CLEAR_FEATURE:
|
|
||||||
USBD_ClrFeature (pdev , req);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
USBD_CtlError(pdev , req);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_StdItfReq
|
|
||||||
* Handle standard usb interface requests
|
|
||||||
* @param pdev: USB OTG device instance
|
|
||||||
* @param req: usb request
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
USBD_Status USBD_StdItfReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req)
|
|
||||||
{
|
|
||||||
USBD_Status ret = USBD_OK;
|
|
||||||
|
|
||||||
switch (pdev->dev.device_status)
|
|
||||||
{
|
|
||||||
case USB_OTG_CONFIGURED:
|
|
||||||
|
|
||||||
if (LOBYTE(req->wIndex) <= USBD_ITF_MAX_NUM)
|
|
||||||
{
|
|
||||||
pdev->dev.class_cb->Setup (pdev, req);
|
|
||||||
|
|
||||||
if((req->wLength == 0)&& (ret == USBD_OK))
|
|
||||||
{
|
|
||||||
USBD_CtlSendStatus(pdev);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
USBD_CtlError(pdev , req);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
USBD_CtlError(pdev , req);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_StdEPReq
|
|
||||||
* Handle standard usb endpoint requests
|
|
||||||
* @param pdev: USB OTG device instance
|
|
||||||
* @param req: usb request
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
USBD_Status USBD_StdEPReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req)
|
|
||||||
{
|
|
||||||
|
|
||||||
uint8_t ep_addr;
|
|
||||||
USBD_Status ret = USBD_OK;
|
|
||||||
|
|
||||||
ep_addr = LOBYTE(req->wIndex);
|
|
||||||
|
|
||||||
switch (req->bRequest)
|
|
||||||
{
|
|
||||||
|
|
||||||
case USB_REQ_SET_FEATURE :
|
|
||||||
|
|
||||||
switch (pdev->dev.device_status)
|
|
||||||
{
|
|
||||||
case USB_OTG_ADDRESSED:
|
|
||||||
if ((ep_addr != 0x00) && (ep_addr != 0x80))
|
|
||||||
{
|
|
||||||
DCD_EP_Stall(pdev , ep_addr);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case USB_OTG_CONFIGURED:
|
|
||||||
if (req->wValue == USB_FEATURE_EP_HALT)
|
|
||||||
{
|
|
||||||
if ((ep_addr != 0x00) && (ep_addr != 0x80))
|
|
||||||
{
|
|
||||||
DCD_EP_Stall(pdev , ep_addr);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pdev->dev.class_cb->Setup (pdev, req);
|
|
||||||
USBD_CtlSendStatus(pdev);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
USBD_CtlError(pdev , req);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case USB_REQ_CLEAR_FEATURE :
|
|
||||||
|
|
||||||
switch (pdev->dev.device_status)
|
|
||||||
{
|
|
||||||
case USB_OTG_ADDRESSED:
|
|
||||||
if ((ep_addr != 0x00) && (ep_addr != 0x80))
|
|
||||||
{
|
|
||||||
DCD_EP_Stall(pdev , ep_addr);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case USB_OTG_CONFIGURED:
|
|
||||||
if (req->wValue == USB_FEATURE_EP_HALT)
|
|
||||||
{
|
|
||||||
if ((ep_addr != 0x00) && (ep_addr != 0x80))
|
|
||||||
{
|
|
||||||
DCD_EP_ClrStall(pdev , ep_addr);
|
|
||||||
pdev->dev.class_cb->Setup (pdev, req);
|
|
||||||
}
|
|
||||||
USBD_CtlSendStatus(pdev);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
USBD_CtlError(pdev , req);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case USB_REQ_GET_STATUS:
|
|
||||||
switch (pdev->dev.device_status)
|
|
||||||
{
|
|
||||||
case USB_OTG_ADDRESSED:
|
|
||||||
if ((ep_addr != 0x00) && (ep_addr != 0x80))
|
|
||||||
{
|
|
||||||
DCD_EP_Stall(pdev , ep_addr);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case USB_OTG_CONFIGURED:
|
|
||||||
|
|
||||||
|
|
||||||
if ((ep_addr & 0x80)== 0x80)
|
|
||||||
{
|
|
||||||
if(pdev->dev.in_ep[ep_addr & 0x7F].is_stall)
|
|
||||||
{
|
|
||||||
USBD_ep_status = 0x0001;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
USBD_ep_status = 0x0000;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if ((ep_addr & 0x80)== 0x00)
|
|
||||||
{
|
|
||||||
if(pdev->dev.out_ep[ep_addr].is_stall)
|
|
||||||
{
|
|
||||||
USBD_ep_status = 0x0001;
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
USBD_ep_status = 0x0000;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
USBD_CtlSendData (pdev,
|
|
||||||
(uint8_t *)&USBD_ep_status,
|
|
||||||
2);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
USBD_CtlError(pdev , req);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief USBD_GetDescriptor
|
|
||||||
* Handle Get Descriptor requests
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param req: usb request
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static void USBD_GetDescriptor(USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
USB_SETUP_REQ *req)
|
|
||||||
{
|
|
||||||
uint16_t len;
|
|
||||||
uint8_t *pbuf;
|
|
||||||
|
|
||||||
switch (req->wValue >> 8)
|
|
||||||
{
|
|
||||||
case USB_DESC_TYPE_DEVICE:
|
|
||||||
pbuf = pdev->dev.usr_device->GetDeviceDescriptor(pdev->cfg.speed, &len);
|
|
||||||
if ((req->wLength == 64) ||( pdev->dev.device_status == USB_OTG_DEFAULT))
|
|
||||||
{
|
|
||||||
len = 8;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case USB_DESC_TYPE_CONFIGURATION:
|
|
||||||
pbuf = (uint8_t *)pdev->dev.class_cb->GetConfigDescriptor(pdev->cfg.speed, &len);
|
|
||||||
#ifdef USB_OTG_HS_CORE
|
|
||||||
if((pdev->cfg.speed == USB_OTG_SPEED_FULL )&&
|
|
||||||
(pdev->cfg.phy_itface == USB_OTG_ULPI_PHY))
|
|
||||||
{
|
|
||||||
pbuf = (uint8_t *)pdev->dev.class_cb->GetOtherConfigDescriptor(pdev->cfg.speed, &len);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
pbuf[1] = USB_DESC_TYPE_CONFIGURATION;
|
|
||||||
pdev->dev.pConfig_descriptor = pbuf;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case USB_DESC_TYPE_STRING:
|
|
||||||
switch ((uint8_t)(req->wValue))
|
|
||||||
{
|
|
||||||
case USBD_IDX_LANGID_STR:
|
|
||||||
pbuf = pdev->dev.usr_device->GetLangIDStrDescriptor(pdev->cfg.speed, &len);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case USBD_IDX_MFC_STR:
|
|
||||||
pbuf = pdev->dev.usr_device->GetManufacturerStrDescriptor(pdev->cfg.speed, &len);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case USBD_IDX_PRODUCT_STR:
|
|
||||||
pbuf = pdev->dev.usr_device->GetProductStrDescriptor(pdev->cfg.speed, &len);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case USBD_IDX_SERIAL_STR:
|
|
||||||
pbuf = pdev->dev.usr_device->GetSerialStrDescriptor(pdev->cfg.speed, &len);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case USBD_IDX_CONFIG_STR:
|
|
||||||
pbuf = pdev->dev.usr_device->GetConfigurationStrDescriptor(pdev->cfg.speed, &len);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case USBD_IDX_INTERFACE_STR:
|
|
||||||
pbuf = pdev->dev.usr_device->GetInterfaceStrDescriptor(pdev->cfg.speed, &len);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
#ifdef USB_SUPPORT_USER_STRING_DESC
|
|
||||||
pbuf = pdev->dev.class_cb->GetUsrStrDescriptor(pdev->cfg.speed, (req->wValue) , &len);
|
|
||||||
break;
|
|
||||||
#else
|
|
||||||
USBD_CtlError(pdev , req);
|
|
||||||
return;
|
|
||||||
#endif /* USBD_CtlError(pdev , req); */
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case USB_DESC_TYPE_DEVICE_QUALIFIER:
|
|
||||||
#ifdef USB_OTG_HS_CORE
|
|
||||||
if(pdev->cfg.speed == USB_OTG_SPEED_HIGH )
|
|
||||||
{
|
|
||||||
|
|
||||||
pbuf = (uint8_t *)pdev->dev.class_cb->GetConfigDescriptor(pdev->cfg.speed, &len);
|
|
||||||
|
|
||||||
USBD_DeviceQualifierDesc[4]= pbuf[14];
|
|
||||||
USBD_DeviceQualifierDesc[5]= pbuf[15];
|
|
||||||
USBD_DeviceQualifierDesc[6]= pbuf[16];
|
|
||||||
|
|
||||||
pbuf = USBD_DeviceQualifierDesc;
|
|
||||||
len = USB_LEN_DEV_QUALIFIER_DESC;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
USBD_CtlError(pdev , req);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
USBD_CtlError(pdev , req);
|
|
||||||
return;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
case USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION:
|
|
||||||
#ifdef USB_OTG_HS_CORE
|
|
||||||
|
|
||||||
if(pdev->cfg.speed == USB_OTG_SPEED_HIGH )
|
|
||||||
{
|
|
||||||
pbuf = (uint8_t *)pdev->dev.class_cb->GetOtherConfigDescriptor(pdev->cfg.speed, &len);
|
|
||||||
pbuf[1] = USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
USBD_CtlError(pdev , req);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
USBD_CtlError(pdev , req);
|
|
||||||
return;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
default:
|
|
||||||
USBD_CtlError(pdev , req);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if((len != 0)&& (req->wLength != 0))
|
|
||||||
{
|
|
||||||
|
|
||||||
len = MIN(len , req->wLength);
|
|
||||||
|
|
||||||
USBD_CtlSendData (pdev,
|
|
||||||
pbuf,
|
|
||||||
len);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_SetAddress
|
|
||||||
* Set device address
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param req: usb request
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static void USBD_SetAddress(USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
USB_SETUP_REQ *req)
|
|
||||||
{
|
|
||||||
uint8_t dev_addr;
|
|
||||||
|
|
||||||
if ((req->wIndex == 0) && (req->wLength == 0))
|
|
||||||
{
|
|
||||||
dev_addr = (uint8_t)(req->wValue) & 0x7F;
|
|
||||||
|
|
||||||
if (pdev->dev.device_status == USB_OTG_CONFIGURED)
|
|
||||||
{
|
|
||||||
USBD_CtlError(pdev , req);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pdev->dev.device_address = dev_addr;
|
|
||||||
DCD_EP_SetAddress(pdev, dev_addr);
|
|
||||||
USBD_CtlSendStatus(pdev);
|
|
||||||
|
|
||||||
if (dev_addr != 0)
|
|
||||||
{
|
|
||||||
pdev->dev.device_status = USB_OTG_ADDRESSED;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pdev->dev.device_status = USB_OTG_DEFAULT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
USBD_CtlError(pdev , req);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_SetConfig
|
|
||||||
* Handle Set device configuration request
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param req: usb request
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static void USBD_SetConfig(USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
USB_SETUP_REQ *req)
|
|
||||||
{
|
|
||||||
|
|
||||||
static uint8_t cfgidx;
|
|
||||||
|
|
||||||
cfgidx = (uint8_t)(req->wValue);
|
|
||||||
|
|
||||||
if (cfgidx > USBD_CFG_MAX_NUM )
|
|
||||||
{
|
|
||||||
USBD_CtlError(pdev , req);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
switch (pdev->dev.device_status)
|
|
||||||
{
|
|
||||||
case USB_OTG_ADDRESSED:
|
|
||||||
if (cfgidx)
|
|
||||||
{
|
|
||||||
pdev->dev.device_config = cfgidx;
|
|
||||||
pdev->dev.device_status = USB_OTG_CONFIGURED;
|
|
||||||
USBD_SetCfg(pdev , cfgidx);
|
|
||||||
USBD_CtlSendStatus(pdev);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
USBD_CtlSendStatus(pdev);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case USB_OTG_CONFIGURED:
|
|
||||||
if (cfgidx == 0)
|
|
||||||
{
|
|
||||||
pdev->dev.device_status = USB_OTG_ADDRESSED;
|
|
||||||
pdev->dev.device_config = cfgidx;
|
|
||||||
USBD_ClrCfg(pdev , cfgidx);
|
|
||||||
USBD_CtlSendStatus(pdev);
|
|
||||||
|
|
||||||
}
|
|
||||||
else if (cfgidx != pdev->dev.device_config)
|
|
||||||
{
|
|
||||||
/* Clear old configuration */
|
|
||||||
USBD_ClrCfg(pdev , pdev->dev.device_config);
|
|
||||||
|
|
||||||
/* set new configuration */
|
|
||||||
pdev->dev.device_config = cfgidx;
|
|
||||||
USBD_SetCfg(pdev , cfgidx);
|
|
||||||
USBD_CtlSendStatus(pdev);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
USBD_CtlSendStatus(pdev);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
USBD_CtlError(pdev , req);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_GetConfig
|
|
||||||
* Handle Get device configuration request
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param req: usb request
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static void USBD_GetConfig(USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
USB_SETUP_REQ *req)
|
|
||||||
{
|
|
||||||
|
|
||||||
if (req->wLength != 1)
|
|
||||||
{
|
|
||||||
USBD_CtlError(pdev , req);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
switch (pdev->dev.device_status )
|
|
||||||
{
|
|
||||||
case USB_OTG_ADDRESSED:
|
|
||||||
|
|
||||||
USBD_CtlSendData (pdev,
|
|
||||||
(uint8_t *)&USBD_default_cfg,
|
|
||||||
1);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case USB_OTG_CONFIGURED:
|
|
||||||
|
|
||||||
USBD_CtlSendData (pdev,
|
|
||||||
&pdev->dev.device_config,
|
|
||||||
1);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
USBD_CtlError(pdev , req);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_GetStatus
|
|
||||||
* Handle Get Status request
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param req: usb request
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static void USBD_GetStatus(USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
USB_SETUP_REQ *req)
|
|
||||||
{
|
|
||||||
|
|
||||||
switch (pdev->dev.device_status)
|
|
||||||
{
|
|
||||||
case USB_OTG_ADDRESSED:
|
|
||||||
case USB_OTG_CONFIGURED:
|
|
||||||
|
|
||||||
if (pdev->dev.DevRemoteWakeup)
|
|
||||||
{
|
|
||||||
USBD_cfg_status = USB_CONFIG_SELF_POWERED | USB_CONFIG_REMOTE_WAKEUP;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
USBD_cfg_status = USB_CONFIG_SELF_POWERED;
|
|
||||||
}
|
|
||||||
|
|
||||||
USBD_CtlSendData (pdev,
|
|
||||||
(uint8_t *)&USBD_cfg_status,
|
|
||||||
1);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default :
|
|
||||||
USBD_CtlError(pdev , req);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_SetFeature
|
|
||||||
* Handle Set device feature request
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param req: usb request
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static void USBD_SetFeature(USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
USB_SETUP_REQ *req)
|
|
||||||
{
|
|
||||||
|
|
||||||
USB_OTG_DCTL_TypeDef dctl;
|
|
||||||
uint8_t test_mode = 0;
|
|
||||||
|
|
||||||
if (req->wValue == USB_FEATURE_REMOTE_WAKEUP)
|
|
||||||
{
|
|
||||||
pdev->dev.DevRemoteWakeup = 1;
|
|
||||||
pdev->dev.class_cb->Setup (pdev, req);
|
|
||||||
USBD_CtlSendStatus(pdev);
|
|
||||||
}
|
|
||||||
|
|
||||||
else if ((req->wValue == USB_FEATURE_TEST_MODE) &&
|
|
||||||
((req->wIndex & 0xFF) == 0))
|
|
||||||
{
|
|
||||||
dctl.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DCTL);
|
|
||||||
|
|
||||||
test_mode = req->wIndex >> 8;
|
|
||||||
switch (test_mode)
|
|
||||||
{
|
|
||||||
case 1: // TEST_J
|
|
||||||
dctl.b.tstctl = 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 2: // TEST_K
|
|
||||||
dctl.b.tstctl = 2;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 3: // TEST_SE0_NAK
|
|
||||||
dctl.b.tstctl = 3;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 4: // TEST_PACKET
|
|
||||||
dctl.b.tstctl = 4;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 5: // TEST_FORCE_ENABLE
|
|
||||||
dctl.b.tstctl = 5;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DCTL, dctl.d32);
|
|
||||||
USBD_CtlSendStatus(pdev);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_ClrFeature
|
|
||||||
* Handle clear device feature request
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param req: usb request
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static void USBD_ClrFeature(USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
USB_SETUP_REQ *req)
|
|
||||||
{
|
|
||||||
switch (pdev->dev.device_status)
|
|
||||||
{
|
|
||||||
case USB_OTG_ADDRESSED:
|
|
||||||
case USB_OTG_CONFIGURED:
|
|
||||||
if (req->wValue == USB_FEATURE_REMOTE_WAKEUP)
|
|
||||||
{
|
|
||||||
pdev->dev.DevRemoteWakeup = 0;
|
|
||||||
pdev->dev.class_cb->Setup (pdev, req);
|
|
||||||
USBD_CtlSendStatus(pdev);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default :
|
|
||||||
USBD_CtlError(pdev , req);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_ParseSetupRequest
|
|
||||||
* Copy buffer into setup structure
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param req: usb request
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
|
|
||||||
void USBD_ParseSetupRequest( USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
USB_SETUP_REQ *req)
|
|
||||||
{
|
|
||||||
req->bmRequest = *(uint8_t *) (pdev->dev.setup_packet);
|
|
||||||
req->bRequest = *(uint8_t *) (pdev->dev.setup_packet + 1);
|
|
||||||
req->wValue = SWAPBYTE (pdev->dev.setup_packet + 2);
|
|
||||||
req->wIndex = SWAPBYTE (pdev->dev.setup_packet + 4);
|
|
||||||
req->wLength = SWAPBYTE (pdev->dev.setup_packet + 6);
|
|
||||||
|
|
||||||
pdev->dev.in_ep[0].ctl_data_len = req->wLength ;
|
|
||||||
pdev->dev.device_state = USB_OTG_EP0_SETUP;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_CtlError
|
|
||||||
* Handle USB low level Error
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param req: usb request
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
|
|
||||||
void USBD_CtlError( USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
USB_SETUP_REQ *req)
|
|
||||||
{
|
|
||||||
if((req->bmRequest & 0x80) == 0x80)
|
|
||||||
{
|
|
||||||
DCD_EP_Stall(pdev , 0x80);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if(req->wLength == 0)
|
|
||||||
{
|
|
||||||
DCD_EP_Stall(pdev , 0x80);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DCD_EP_Stall(pdev , 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
USB_OTG_EP0_OutStart(pdev);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_GetString
|
|
||||||
* Convert Ascii string into unicode one
|
|
||||||
* @param desc : descriptor buffer
|
|
||||||
* @param unicode : Formatted string buffer (unicode)
|
|
||||||
* @param len : descriptor length
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len)
|
|
||||||
{
|
|
||||||
uint8_t idx = 0;
|
|
||||||
|
|
||||||
if (desc != NULL)
|
|
||||||
{
|
|
||||||
*len = USBD_GetLen(desc) * 2 + 2;
|
|
||||||
unicode[idx++] = *len;
|
|
||||||
unicode[idx++] = USB_DESC_TYPE_STRING;
|
|
||||||
|
|
||||||
while (*desc != NULL)
|
|
||||||
{
|
|
||||||
unicode[idx++] = *desc++;
|
|
||||||
unicode[idx++] = 0x00;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_GetLen
|
|
||||||
* return the string length
|
|
||||||
* @param buf : pointer to the ascii string buffer
|
|
||||||
* @retval string length
|
|
||||||
*/
|
|
||||||
static uint8_t USBD_GetLen(uint8_t *buf)
|
|
||||||
{
|
|
||||||
uint8_t len = 0;
|
|
||||||
|
|
||||||
while (*buf != NULL)
|
|
||||||
{
|
|
||||||
len++;
|
|
||||||
buf++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
@ -1,5 +0,0 @@
|
|||||||
#SUB_FOLDER += firmware/arch/stm32f4xx/lib
|
|
||||||
#INCLUDES += firmware/arch/stm32f4xx/lib
|
|
||||||
|
|
||||||
include firmware/arch/stm32f4xx/lib/STM32_USB_Device_Library/Class/class.mk
|
|
||||||
include firmware/arch/stm32f4xx/lib/STM32_USB_Device_Library/Core/core.mk
|
|
@ -1,96 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usb_bsp.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V2.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief Specific api's relative to the used hardware platform
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __USB_BSP__H__
|
|
||||||
#define __USB_BSP__H__
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usb_core.h"
|
|
||||||
|
|
||||||
/** @addtogroup USB_OTG_DRIVER
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_BSP
|
|
||||||
* @brief This file is the
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_BSP_Exported_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_BSP_Exported_Types
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_BSP_Exported_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_BSP_Exported_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_BSP_Exported_FunctionsPrototype
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
void BSP_Init(void);
|
|
||||||
|
|
||||||
void USB_OTG_BSP_Init (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
void USB_OTG_BSP_uDelay (const uint32_t usec);
|
|
||||||
void USB_OTG_BSP_mDelay (const uint32_t msec);
|
|
||||||
void USB_OTG_BSP_EnableInterrupt (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
#ifdef USE_HOST_MODE
|
|
||||||
void USB_OTG_BSP_ConfigVBUS(USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
void USB_OTG_BSP_DriveVBUS(USB_OTG_CORE_HANDLE *pdev,uint8_t state);
|
|
||||||
#endif
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#endif //__USB_BSP__H__
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
||||||
|
|
@ -1,408 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usb_core.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V2.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief Header of the Core Layer
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __USB_CORE_H__
|
|
||||||
#define __USB_CORE_H__
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usb_conf.h"
|
|
||||||
#include "usb_regs.h"
|
|
||||||
#include "usb_defines.h"
|
|
||||||
|
|
||||||
|
|
||||||
/** @addtogroup USB_OTG_DRIVER
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_CORE
|
|
||||||
* @brief usb otg driver core layer
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_CORE_Exported_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define USB_OTG_EP0_IDLE 0
|
|
||||||
#define USB_OTG_EP0_SETUP 1
|
|
||||||
#define USB_OTG_EP0_DATA_IN 2
|
|
||||||
#define USB_OTG_EP0_DATA_OUT 3
|
|
||||||
#define USB_OTG_EP0_STATUS_IN 4
|
|
||||||
#define USB_OTG_EP0_STATUS_OUT 5
|
|
||||||
#define USB_OTG_EP0_STALL 6
|
|
||||||
|
|
||||||
#define USB_OTG_EP_TX_DIS 0x0000
|
|
||||||
#define USB_OTG_EP_TX_STALL 0x0010
|
|
||||||
#define USB_OTG_EP_TX_NAK 0x0020
|
|
||||||
#define USB_OTG_EP_TX_VALID 0x0030
|
|
||||||
|
|
||||||
#define USB_OTG_EP_RX_DIS 0x0000
|
|
||||||
#define USB_OTG_EP_RX_STALL 0x1000
|
|
||||||
#define USB_OTG_EP_RX_NAK 0x2000
|
|
||||||
#define USB_OTG_EP_RX_VALID 0x3000
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
#define MAX_DATA_LENGTH 0xFF
|
|
||||||
|
|
||||||
/** @defgroup USB_CORE_Exported_Types
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
USB_OTG_OK = 0,
|
|
||||||
USB_OTG_FAIL
|
|
||||||
}USB_OTG_STS;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
HC_IDLE = 0,
|
|
||||||
HC_XFRC,
|
|
||||||
HC_HALTED,
|
|
||||||
HC_NAK,
|
|
||||||
HC_NYET,
|
|
||||||
HC_STALL,
|
|
||||||
HC_XACTERR,
|
|
||||||
HC_BBLERR,
|
|
||||||
HC_DATATGLERR,
|
|
||||||
}HC_STATUS;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
URB_IDLE = 0,
|
|
||||||
URB_DONE,
|
|
||||||
URB_NOTREADY,
|
|
||||||
URB_ERROR,
|
|
||||||
URB_STALL
|
|
||||||
}URB_STATE;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
CTRL_START = 0,
|
|
||||||
CTRL_XFRC,
|
|
||||||
CTRL_HALTED,
|
|
||||||
CTRL_NAK,
|
|
||||||
CTRL_STALL,
|
|
||||||
CTRL_XACTERR,
|
|
||||||
CTRL_BBLERR,
|
|
||||||
CTRL_DATATGLERR,
|
|
||||||
CTRL_FAIL
|
|
||||||
}CTRL_STATUS;
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct USB_OTG_hc
|
|
||||||
{
|
|
||||||
uint8_t dev_addr ;
|
|
||||||
uint8_t ep_num;
|
|
||||||
uint8_t ep_is_in;
|
|
||||||
uint8_t speed;
|
|
||||||
uint8_t do_ping;
|
|
||||||
uint8_t ep_type;
|
|
||||||
uint16_t max_packet;
|
|
||||||
uint8_t data_pid;
|
|
||||||
uint8_t *xfer_buff;
|
|
||||||
uint32_t xfer_len;
|
|
||||||
uint32_t xfer_count;
|
|
||||||
uint8_t toggle_in;
|
|
||||||
uint8_t toggle_out;
|
|
||||||
uint32_t dma_addr;
|
|
||||||
}
|
|
||||||
USB_OTG_HC , *PUSB_OTG_HC;
|
|
||||||
|
|
||||||
typedef struct USB_OTG_ep
|
|
||||||
{
|
|
||||||
uint8_t num;
|
|
||||||
uint8_t is_in;
|
|
||||||
uint8_t is_stall;
|
|
||||||
uint8_t type;
|
|
||||||
uint8_t data_pid_start;
|
|
||||||
uint8_t even_odd_frame;
|
|
||||||
uint16_t tx_fifo_num;
|
|
||||||
uint32_t maxpacket;
|
|
||||||
/* transaction level variables*/
|
|
||||||
uint8_t *xfer_buff;
|
|
||||||
uint32_t dma_addr;
|
|
||||||
uint32_t xfer_len;
|
|
||||||
uint32_t xfer_count;
|
|
||||||
/* Transfer level variables*/
|
|
||||||
uint32_t rem_data_len;
|
|
||||||
uint32_t total_data_len;
|
|
||||||
uint32_t ctl_data_len;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
USB_OTG_EP , *PUSB_OTG_EP;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct USB_OTG_core_cfg
|
|
||||||
{
|
|
||||||
uint8_t host_channels;
|
|
||||||
uint8_t dev_endpoints;
|
|
||||||
uint8_t speed;
|
|
||||||
uint8_t dma_enable;
|
|
||||||
uint16_t mps;
|
|
||||||
uint16_t TotalFifoSize;
|
|
||||||
uint8_t phy_itface;
|
|
||||||
uint8_t Sof_output;
|
|
||||||
uint8_t low_power;
|
|
||||||
uint8_t coreID;
|
|
||||||
|
|
||||||
}
|
|
||||||
USB_OTG_CORE_CFGS, *PUSB_OTG_CORE_CFGS;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct usb_setup_req {
|
|
||||||
|
|
||||||
uint8_t bmRequest;
|
|
||||||
uint8_t bRequest;
|
|
||||||
uint16_t wValue;
|
|
||||||
uint16_t wIndex;
|
|
||||||
uint16_t wLength;
|
|
||||||
} USB_SETUP_REQ;
|
|
||||||
|
|
||||||
typedef struct _Device_TypeDef
|
|
||||||
{
|
|
||||||
uint8_t *(*GetDeviceDescriptor)( uint8_t speed , uint16_t *length);
|
|
||||||
uint8_t *(*GetLangIDStrDescriptor)( uint8_t speed , uint16_t *length);
|
|
||||||
uint8_t *(*GetManufacturerStrDescriptor)( uint8_t speed , uint16_t *length);
|
|
||||||
uint8_t *(*GetProductStrDescriptor)( uint8_t speed , uint16_t *length);
|
|
||||||
uint8_t *(*GetSerialStrDescriptor)( uint8_t speed , uint16_t *length);
|
|
||||||
uint8_t *(*GetConfigurationStrDescriptor)( uint8_t speed , uint16_t *length);
|
|
||||||
uint8_t *(*GetInterfaceStrDescriptor)( uint8_t speed , uint16_t *length);
|
|
||||||
} USBD_DEVICE, *pUSBD_DEVICE;
|
|
||||||
|
|
||||||
typedef struct USB_OTG_hPort
|
|
||||||
{
|
|
||||||
void (*Disconnect) (void *phost);
|
|
||||||
void (*Connect) (void *phost);
|
|
||||||
uint8_t ConnStatus;
|
|
||||||
uint8_t DisconnStatus;
|
|
||||||
uint8_t ConnHandled;
|
|
||||||
uint8_t DisconnHandled;
|
|
||||||
} USB_OTG_hPort_TypeDef;
|
|
||||||
|
|
||||||
typedef struct _Device_cb
|
|
||||||
{
|
|
||||||
uint8_t (*Init) (void *pdev , uint8_t cfgidx);
|
|
||||||
uint8_t (*DeInit) (void *pdev , uint8_t cfgidx);
|
|
||||||
/* Control Endpoints*/
|
|
||||||
uint8_t (*Setup) (void *pdev , USB_SETUP_REQ *req);
|
|
||||||
uint8_t (*EP0_TxSent) (void *pdev );
|
|
||||||
uint8_t (*EP0_RxReady) (void *pdev );
|
|
||||||
/* Class Specific Endpoints*/
|
|
||||||
uint8_t (*DataIn) (void *pdev , uint8_t epnum);
|
|
||||||
uint8_t (*DataOut) (void *pdev , uint8_t epnum);
|
|
||||||
uint8_t (*SOF) (void *pdev);
|
|
||||||
uint8_t (*IsoINIncomplete) (void *pdev);
|
|
||||||
uint8_t (*IsoOUTIncomplete) (void *pdev);
|
|
||||||
|
|
||||||
uint8_t *(*GetConfigDescriptor)( uint8_t speed , uint16_t *length);
|
|
||||||
#ifdef USB_OTG_HS_CORE
|
|
||||||
uint8_t *(*GetOtherConfigDescriptor)( uint8_t speed , uint16_t *length);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef USB_SUPPORT_USER_STRING_DESC
|
|
||||||
uint8_t *(*GetUsrStrDescriptor)( uint8_t speed ,uint8_t index, uint16_t *length);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
} USBD_Class_cb_TypeDef;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct _USBD_USR_PROP
|
|
||||||
{
|
|
||||||
void (*Init)(void);
|
|
||||||
void (*DeviceReset)(uint8_t speed);
|
|
||||||
void (*DeviceConfigured)(void);
|
|
||||||
void (*DeviceSuspended)(void);
|
|
||||||
void (*DeviceResumed)(void);
|
|
||||||
|
|
||||||
void (*DeviceConnected)(void);
|
|
||||||
void (*DeviceDisconnected)(void);
|
|
||||||
|
|
||||||
}
|
|
||||||
USBD_Usr_cb_TypeDef;
|
|
||||||
|
|
||||||
typedef struct _DCD
|
|
||||||
{
|
|
||||||
uint8_t device_config;
|
|
||||||
uint8_t device_state;
|
|
||||||
uint8_t device_status;
|
|
||||||
uint8_t device_address;
|
|
||||||
uint32_t DevRemoteWakeup;
|
|
||||||
USB_OTG_EP in_ep [USB_OTG_MAX_TX_FIFOS];
|
|
||||||
USB_OTG_EP out_ep [USB_OTG_MAX_TX_FIFOS];
|
|
||||||
uint8_t setup_packet [8*3];
|
|
||||||
USBD_Class_cb_TypeDef *class_cb;
|
|
||||||
USBD_Usr_cb_TypeDef *usr_cb;
|
|
||||||
USBD_DEVICE *usr_device;
|
|
||||||
uint8_t *pConfig_descriptor;
|
|
||||||
}
|
|
||||||
DCD_DEV , *DCD_PDEV;
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct _HCD
|
|
||||||
{
|
|
||||||
uint8_t Rx_Buffer [MAX_DATA_LENGTH];
|
|
||||||
__IO uint32_t ConnSts;
|
|
||||||
__IO uint32_t ErrCnt[USB_OTG_MAX_TX_FIFOS];
|
|
||||||
__IO uint32_t XferCnt[USB_OTG_MAX_TX_FIFOS];
|
|
||||||
__IO HC_STATUS HC_Status[USB_OTG_MAX_TX_FIFOS];
|
|
||||||
__IO URB_STATE URB_State[USB_OTG_MAX_TX_FIFOS];
|
|
||||||
USB_OTG_HC hc [USB_OTG_MAX_TX_FIFOS];
|
|
||||||
uint16_t channel [USB_OTG_MAX_TX_FIFOS];
|
|
||||||
USB_OTG_hPort_TypeDef *port_cb;
|
|
||||||
}
|
|
||||||
HCD_DEV , *USB_OTG_USBH_PDEV;
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct _OTG
|
|
||||||
{
|
|
||||||
uint8_t OTG_State;
|
|
||||||
uint8_t OTG_PrevState;
|
|
||||||
uint8_t OTG_Mode;
|
|
||||||
}
|
|
||||||
OTG_DEV , *USB_OTG_USBO_PDEV;
|
|
||||||
|
|
||||||
typedef struct USB_OTG_handle
|
|
||||||
{
|
|
||||||
USB_OTG_CORE_CFGS cfg;
|
|
||||||
USB_OTG_CORE_REGS regs;
|
|
||||||
#ifdef USE_DEVICE_MODE
|
|
||||||
DCD_DEV dev;
|
|
||||||
#endif
|
|
||||||
#ifdef USE_HOST_MODE
|
|
||||||
HCD_DEV host;
|
|
||||||
#endif
|
|
||||||
#ifdef USE_OTG_MODE
|
|
||||||
OTG_DEV otg;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
USB_OTG_CORE_HANDLE , *PUSB_OTG_CORE_HANDLE;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_CORE_Exported_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_CORE_Exported_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_CORE_Exported_FunctionsPrototype
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
USB_OTG_STS USB_OTG_CoreInit (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
USB_OTG_STS USB_OTG_SelectCore (USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
USB_OTG_CORE_ID_TypeDef coreID);
|
|
||||||
USB_OTG_STS USB_OTG_EnableGlobalInt (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
USB_OTG_STS USB_OTG_DisableGlobalInt(USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
void* USB_OTG_ReadPacket (USB_OTG_CORE_HANDLE *pdev ,
|
|
||||||
uint8_t *dest,
|
|
||||||
uint16_t len);
|
|
||||||
USB_OTG_STS USB_OTG_WritePacket (USB_OTG_CORE_HANDLE *pdev ,
|
|
||||||
uint8_t *src,
|
|
||||||
uint8_t ch_ep_num,
|
|
||||||
uint16_t len);
|
|
||||||
USB_OTG_STS USB_OTG_FlushTxFifo (USB_OTG_CORE_HANDLE *pdev , uint32_t num);
|
|
||||||
USB_OTG_STS USB_OTG_FlushRxFifo (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
|
|
||||||
uint32_t USB_OTG_ReadCoreItr (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
uint32_t USB_OTG_ReadOtgItr (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
uint8_t USB_OTG_IsHostMode (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
uint8_t USB_OTG_IsDeviceMode (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
uint32_t USB_OTG_GetMode (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
USB_OTG_STS USB_OTG_PhyInit (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
USB_OTG_STS USB_OTG_SetCurrentMode (USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
uint8_t mode);
|
|
||||||
|
|
||||||
/*********************** HOST APIs ********************************************/
|
|
||||||
#ifdef USE_HOST_MODE
|
|
||||||
USB_OTG_STS USB_OTG_CoreInitHost (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
USB_OTG_STS USB_OTG_EnableHostInt (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
USB_OTG_STS USB_OTG_HC_Init (USB_OTG_CORE_HANDLE *pdev, uint8_t hc_num);
|
|
||||||
USB_OTG_STS USB_OTG_HC_Halt (USB_OTG_CORE_HANDLE *pdev, uint8_t hc_num);
|
|
||||||
USB_OTG_STS USB_OTG_HC_StartXfer (USB_OTG_CORE_HANDLE *pdev, uint8_t hc_num);
|
|
||||||
USB_OTG_STS USB_OTG_HC_DoPing (USB_OTG_CORE_HANDLE *pdev , uint8_t hc_num);
|
|
||||||
uint32_t USB_OTG_ReadHostAllChannels_intr (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
uint32_t USB_OTG_ResetPort (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
uint32_t USB_OTG_ReadHPRT0 (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
void USB_OTG_DriveVbus (USB_OTG_CORE_HANDLE *pdev, uint8_t state);
|
|
||||||
void USB_OTG_InitFSLSPClkSel (USB_OTG_CORE_HANDLE *pdev ,uint8_t freq);
|
|
||||||
uint8_t USB_OTG_IsEvenFrame (USB_OTG_CORE_HANDLE *pdev) ;
|
|
||||||
void USB_OTG_StopHost (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
#endif
|
|
||||||
/********************* DEVICE APIs ********************************************/
|
|
||||||
#ifdef USE_DEVICE_MODE
|
|
||||||
USB_OTG_STS USB_OTG_CoreInitDev (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
USB_OTG_STS USB_OTG_EnableDevInt (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
uint32_t USB_OTG_ReadDevAllInEPItr (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
enum USB_OTG_SPEED USB_OTG_GetDeviceSpeed (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
USB_OTG_STS USB_OTG_EP0Activate (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
USB_OTG_STS USB_OTG_EPActivate (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep);
|
|
||||||
USB_OTG_STS USB_OTG_EPDeactivate(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep);
|
|
||||||
USB_OTG_STS USB_OTG_EPStartXfer (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep);
|
|
||||||
USB_OTG_STS USB_OTG_EP0StartXfer(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep);
|
|
||||||
USB_OTG_STS USB_OTG_EPSetStall (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep);
|
|
||||||
USB_OTG_STS USB_OTG_EPClearStall (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep);
|
|
||||||
uint32_t USB_OTG_ReadDevAllOutEp_itr (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
uint32_t USB_OTG_ReadDevOutEP_itr (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum);
|
|
||||||
uint32_t USB_OTG_ReadDevAllInEPItr (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
void USB_OTG_InitDevSpeed (USB_OTG_CORE_HANDLE *pdev , uint8_t speed);
|
|
||||||
uint8_t USBH_IsEvenFrame (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
void USB_OTG_EP0_OutStart(USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
void USB_OTG_ActiveRemoteWakeup(USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
void USB_OTG_UngateClock(USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
void USB_OTG_StopDevice(USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
void USB_OTG_SetEPStatus (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep , uint32_t Status);
|
|
||||||
uint32_t USB_OTG_GetEPStatus(USB_OTG_CORE_HANDLE *pdev ,USB_OTG_EP *ep);
|
|
||||||
#endif
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#endif /* __USB_CORE_H__ */
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
||||||
|
|
@ -1,158 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usb_dcd.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V2.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief Peripheral Driver Header file
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __DCD_H__
|
|
||||||
#define __DCD_H__
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usb_core.h"
|
|
||||||
|
|
||||||
|
|
||||||
/** @addtogroup USB_OTG_DRIVER
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_DCD
|
|
||||||
* @brief This file is the
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_DCD_Exported_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
#define USB_OTG_EP_CONTROL 0
|
|
||||||
#define USB_OTG_EP_ISOC 1
|
|
||||||
#define USB_OTG_EP_BULK 2
|
|
||||||
#define USB_OTG_EP_INT 3
|
|
||||||
#define USB_OTG_EP_MASK 3
|
|
||||||
|
|
||||||
/* Device Status */
|
|
||||||
#define USB_OTG_DEFAULT 1
|
|
||||||
#define USB_OTG_ADDRESSED 2
|
|
||||||
#define USB_OTG_CONFIGURED 3
|
|
||||||
#define USB_OTG_SUSPENDED 4
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_DCD_Exported_Types
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/********************************************************************************
|
|
||||||
Data structure type
|
|
||||||
********************************************************************************/
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
uint8_t bLength;
|
|
||||||
uint8_t bDescriptorType;
|
|
||||||
uint8_t bEndpointAddress;
|
|
||||||
uint8_t bmAttributes;
|
|
||||||
uint16_t wMaxPacketSize;
|
|
||||||
uint8_t bInterval;
|
|
||||||
}
|
|
||||||
EP_DESCRIPTOR , *PEP_DESCRIPTOR;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_DCD_Exported_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_DCD_Exported_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_DCD_Exported_FunctionsPrototype
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/********************************************************************************
|
|
||||||
EXPORTED FUNCTION FROM THE USB-OTG LAYER
|
|
||||||
********************************************************************************/
|
|
||||||
void DCD_Init(USB_OTG_CORE_HANDLE *pdev ,
|
|
||||||
USB_OTG_CORE_ID_TypeDef coreID);
|
|
||||||
|
|
||||||
void DCD_DevConnect (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
void DCD_DevDisconnect (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
void DCD_EP_SetAddress (USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
uint8_t address);
|
|
||||||
uint32_t DCD_EP_Open(USB_OTG_CORE_HANDLE *pdev ,
|
|
||||||
uint8_t ep_addr,
|
|
||||||
uint16_t ep_mps,
|
|
||||||
uint8_t ep_type);
|
|
||||||
|
|
||||||
uint32_t DCD_EP_Close (USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
uint8_t ep_addr);
|
|
||||||
|
|
||||||
|
|
||||||
uint32_t DCD_EP_PrepareRx ( USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
uint8_t ep_addr,
|
|
||||||
uint8_t *pbuf,
|
|
||||||
uint16_t buf_len);
|
|
||||||
|
|
||||||
uint32_t DCD_EP_Tx (USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
uint8_t ep_addr,
|
|
||||||
uint8_t *pbuf,
|
|
||||||
uint32_t buf_len);
|
|
||||||
uint32_t DCD_EP_Stall (USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
uint8_t epnum);
|
|
||||||
uint32_t DCD_EP_ClrStall (USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
uint8_t epnum);
|
|
||||||
uint32_t DCD_EP_Flush (USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
uint8_t epnum);
|
|
||||||
uint32_t DCD_Handle_ISR(USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
|
|
||||||
uint32_t DCD_GetEPStatus(USB_OTG_CORE_HANDLE *pdev ,
|
|
||||||
uint8_t epnum);
|
|
||||||
|
|
||||||
void DCD_SetEPStatus (USB_OTG_CORE_HANDLE *pdev ,
|
|
||||||
uint8_t epnum ,
|
|
||||||
uint32_t Status);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#endif //__DCD_H__
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
||||||
|
|
@ -1,121 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usb_dcd_int.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V2.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief Peripheral Device Interface Layer
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef USB_DCD_INT_H__
|
|
||||||
#define USB_DCD_INT_H__
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usb_dcd.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @addtogroup USB_OTG_DRIVER
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_DCD_INT
|
|
||||||
* @brief This file is the
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_DCD_INT_Exported_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef struct _USBD_DCD_INT
|
|
||||||
{
|
|
||||||
uint8_t (* DataOutStage) (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum);
|
|
||||||
uint8_t (* DataInStage) (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum);
|
|
||||||
uint8_t (* SetupStage) (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
uint8_t (* SOF) (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
uint8_t (* Reset) (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
uint8_t (* Suspend) (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
uint8_t (* Resume) (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
uint8_t (* IsoINIncomplete) (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
uint8_t (* IsoOUTIncomplete) (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
|
|
||||||
uint8_t (* DevConnected) (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
uint8_t (* DevDisconnected) (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
|
|
||||||
}USBD_DCD_INT_cb_TypeDef;
|
|
||||||
|
|
||||||
extern USBD_DCD_INT_cb_TypeDef *USBD_DCD_INT_fops;
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_DCD_INT_Exported_Types
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_DCD_INT_Exported_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define CLEAR_IN_EP_INTR(epnum,intr) \
|
|
||||||
diepint.d32=0; \
|
|
||||||
diepint.b.intr = 1; \
|
|
||||||
USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[epnum]->DIEPINT,diepint.d32);
|
|
||||||
|
|
||||||
#define CLEAR_OUT_EP_INTR(epnum,intr) \
|
|
||||||
doepint.d32=0; \
|
|
||||||
doepint.b.intr = 1; \
|
|
||||||
USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[epnum]->DOEPINT,doepint.d32);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_DCD_INT_Exported_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_DCD_INT_Exported_FunctionsPrototype
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
uint32_t USBD_OTG_ISR_Handler (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#endif // USB_DCD_INT_H__
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
||||||
|
|
@ -1,244 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usb_defines.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V2.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief Header of the Core Layer
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __USB_DEF_H__
|
|
||||||
#define __USB_DEF_H__
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usb_conf.h"
|
|
||||||
|
|
||||||
/** @addtogroup USB_OTG_DRIVER
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_DEFINES
|
|
||||||
* @brief This file is the
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_DEFINES_Exported_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup _CORE_DEFINES_
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define USB_OTG_SPEED_PARAM_HIGH 0
|
|
||||||
#define USB_OTG_SPEED_PARAM_HIGH_IN_FULL 1
|
|
||||||
#define USB_OTG_SPEED_PARAM_FULL 3
|
|
||||||
|
|
||||||
#define USB_OTG_SPEED_HIGH 0
|
|
||||||
#define USB_OTG_SPEED_FULL 1
|
|
||||||
|
|
||||||
#define USB_OTG_ULPI_PHY 1
|
|
||||||
#define USB_OTG_EMBEDDED_PHY 2
|
|
||||||
#define USB_OTG_I2C_PHY 3
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup _GLOBAL_DEFINES_
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
#define GAHBCFG_TXFEMPTYLVL_EMPTY 1
|
|
||||||
#define GAHBCFG_TXFEMPTYLVL_HALFEMPTY 0
|
|
||||||
#define GAHBCFG_GLBINT_ENABLE 1
|
|
||||||
#define GAHBCFG_INT_DMA_BURST_SINGLE 0
|
|
||||||
#define GAHBCFG_INT_DMA_BURST_INCR 1
|
|
||||||
#define GAHBCFG_INT_DMA_BURST_INCR4 3
|
|
||||||
#define GAHBCFG_INT_DMA_BURST_INCR8 5
|
|
||||||
#define GAHBCFG_INT_DMA_BURST_INCR16 7
|
|
||||||
#define GAHBCFG_DMAENABLE 1
|
|
||||||
#define GAHBCFG_TXFEMPTYLVL_EMPTY 1
|
|
||||||
#define GAHBCFG_TXFEMPTYLVL_HALFEMPTY 0
|
|
||||||
#define GRXSTS_PKTSTS_IN 2
|
|
||||||
#define GRXSTS_PKTSTS_IN_XFER_COMP 3
|
|
||||||
#define GRXSTS_PKTSTS_DATA_TOGGLE_ERR 5
|
|
||||||
#define GRXSTS_PKTSTS_CH_HALTED 7
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup _OnTheGo_DEFINES_
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
#define MODE_HNP_SRP_CAPABLE 0
|
|
||||||
#define MODE_SRP_ONLY_CAPABLE 1
|
|
||||||
#define MODE_NO_HNP_SRP_CAPABLE 2
|
|
||||||
#define MODE_SRP_CAPABLE_DEVICE 3
|
|
||||||
#define MODE_NO_SRP_CAPABLE_DEVICE 4
|
|
||||||
#define MODE_SRP_CAPABLE_HOST 5
|
|
||||||
#define MODE_NO_SRP_CAPABLE_HOST 6
|
|
||||||
#define A_HOST 1
|
|
||||||
#define A_SUSPEND 2
|
|
||||||
#define A_PERIPHERAL 3
|
|
||||||
#define B_PERIPHERAL 4
|
|
||||||
#define B_HOST 5
|
|
||||||
#define DEVICE_MODE 0
|
|
||||||
#define HOST_MODE 1
|
|
||||||
#define OTG_MODE 2
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup __DEVICE_DEFINES_
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
#define DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ 0
|
|
||||||
#define DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ 1
|
|
||||||
#define DSTS_ENUMSPD_LS_PHY_6MHZ 2
|
|
||||||
#define DSTS_ENUMSPD_FS_PHY_48MHZ 3
|
|
||||||
|
|
||||||
#define DCFG_FRAME_INTERVAL_80 0
|
|
||||||
#define DCFG_FRAME_INTERVAL_85 1
|
|
||||||
#define DCFG_FRAME_INTERVAL_90 2
|
|
||||||
#define DCFG_FRAME_INTERVAL_95 3
|
|
||||||
|
|
||||||
#define DEP0CTL_MPS_64 0
|
|
||||||
#define DEP0CTL_MPS_32 1
|
|
||||||
#define DEP0CTL_MPS_16 2
|
|
||||||
#define DEP0CTL_MPS_8 3
|
|
||||||
|
|
||||||
#define EP_SPEED_LOW 0
|
|
||||||
#define EP_SPEED_FULL 1
|
|
||||||
#define EP_SPEED_HIGH 2
|
|
||||||
|
|
||||||
#define EP_TYPE_CTRL 0
|
|
||||||
#define EP_TYPE_ISOC 1
|
|
||||||
#define EP_TYPE_BULK 2
|
|
||||||
#define EP_TYPE_INTR 3
|
|
||||||
#define EP_TYPE_MSK 3
|
|
||||||
|
|
||||||
#define STS_GOUT_NAK 1
|
|
||||||
#define STS_DATA_UPDT 2
|
|
||||||
#define STS_XFER_COMP 3
|
|
||||||
#define STS_SETUP_COMP 4
|
|
||||||
#define STS_SETUP_UPDT 6
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup __HOST_DEFINES_
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
#define HC_PID_DATA0 0
|
|
||||||
#define HC_PID_DATA2 1
|
|
||||||
#define HC_PID_DATA1 2
|
|
||||||
#define HC_PID_SETUP 3
|
|
||||||
|
|
||||||
#define HPRT0_PRTSPD_HIGH_SPEED 0
|
|
||||||
#define HPRT0_PRTSPD_FULL_SPEED 1
|
|
||||||
#define HPRT0_PRTSPD_LOW_SPEED 2
|
|
||||||
|
|
||||||
#define HCFG_30_60_MHZ 0
|
|
||||||
#define HCFG_48_MHZ 1
|
|
||||||
#define HCFG_6_MHZ 2
|
|
||||||
|
|
||||||
#define HCCHAR_CTRL 0
|
|
||||||
#define HCCHAR_ISOC 1
|
|
||||||
#define HCCHAR_BULK 2
|
|
||||||
#define HCCHAR_INTR 3
|
|
||||||
|
|
||||||
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_DEFINES_Exported_Types
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
USB_OTG_HS_CORE_ID = 0,
|
|
||||||
USB_OTG_FS_CORE_ID = 1
|
|
||||||
}USB_OTG_CORE_ID_TypeDef;
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_DEFINES_Exported_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_DEFINES_Exported_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_DEFINES_Exported_FunctionsPrototype
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup Internal_Macro's
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
#define USB_OTG_READ_REG32(reg) (*(__IO uint32_t *)reg)
|
|
||||||
#define USB_OTG_WRITE_REG32(reg,value) (*(__IO uint32_t *)reg = value)
|
|
||||||
#define USB_OTG_MODIFY_REG32(reg,clear_mask,set_mask) \
|
|
||||||
USB_OTG_WRITE_REG32(reg, (((USB_OTG_READ_REG32(reg)) & ~clear_mask) | set_mask ) )
|
|
||||||
|
|
||||||
/********************************************************************************
|
|
||||||
ENUMERATION TYPE
|
|
||||||
********************************************************************************/
|
|
||||||
enum USB_OTG_SPEED {
|
|
||||||
USB_SPEED_UNKNOWN = 0,
|
|
||||||
USB_SPEED_LOW,
|
|
||||||
USB_SPEED_FULL,
|
|
||||||
USB_SPEED_HIGH
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif //__USB_DEFINES__H__
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
||||||
|
|
@ -1,102 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usb_hcd.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V2.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief Host layer Header file
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __USB_HCD_H__
|
|
||||||
#define __USB_HCD_H__
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usb_regs.h"
|
|
||||||
#include "usb_core.h"
|
|
||||||
|
|
||||||
|
|
||||||
/** @addtogroup USB_OTG_DRIVER
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_HCD
|
|
||||||
* @brief This file is the
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_HCD_Exported_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_HCD_Exported_Types
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_HCD_Exported_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_HCD_Exported_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_HCD_Exported_FunctionsPrototype
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
uint32_t HCD_Init (USB_OTG_CORE_HANDLE *pdev ,
|
|
||||||
USB_OTG_CORE_ID_TypeDef coreID);
|
|
||||||
uint32_t HCD_HC_Init (USB_OTG_CORE_HANDLE *pdev ,
|
|
||||||
uint8_t hc_num);
|
|
||||||
uint32_t HCD_SubmitRequest (USB_OTG_CORE_HANDLE *pdev ,
|
|
||||||
uint8_t hc_num) ;
|
|
||||||
uint32_t HCD_GetCurrentSpeed (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
uint32_t HCD_ResetPort (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
uint32_t HCD_IsDeviceConnected (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
uint32_t HCD_GetCurrentFrame (USB_OTG_CORE_HANDLE *pdev) ;
|
|
||||||
URB_STATE HCD_GetURB_State (USB_OTG_CORE_HANDLE *pdev, uint8_t ch_num);
|
|
||||||
uint32_t HCD_GetXferCnt (USB_OTG_CORE_HANDLE *pdev, uint8_t ch_num);
|
|
||||||
HC_STATUS HCD_GetHCState (USB_OTG_CORE_HANDLE *pdev, uint8_t ch_num) ;
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#endif //__USB_HCD_H__
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
||||||
|
|
@ -1,126 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usb_hcd_int.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V2.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief Peripheral Device Interface Layer
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __HCD_INT_H__
|
|
||||||
#define __HCD_INT_H__
|
|
||||||
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usb_hcd.h"
|
|
||||||
|
|
||||||
|
|
||||||
/** @addtogroup USB_OTG_DRIVER
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_HCD_INT
|
|
||||||
* @brief This file is the
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_HCD_INT_Exported_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_HCD_INT_Exported_Types
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_HCD_INT_Exported_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define CLEAR_HC_INT(HC_REGS, intr) \
|
|
||||||
{\
|
|
||||||
USB_OTG_HCINTn_TypeDef hcint_clear; \
|
|
||||||
hcint_clear.d32 = 0; \
|
|
||||||
hcint_clear.b.intr = 1; \
|
|
||||||
USB_OTG_WRITE_REG32(&((HC_REGS)->HCINT), hcint_clear.d32);\
|
|
||||||
}\
|
|
||||||
|
|
||||||
#define MASK_HOST_INT_CHH(hc_num) { USB_OTG_HCGINTMSK_TypeDef GINTMSK; \
|
|
||||||
GINTMSK.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[hc_num]->HCGINTMSK); \
|
|
||||||
GINTMSK.b.chhltd = 0; \
|
|
||||||
USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCGINTMSK, GINTMSK.d32);}
|
|
||||||
|
|
||||||
#define UNMASK_HOST_INT_CHH(hc_num) { USB_OTG_HCGINTMSK_TypeDef GINTMSK; \
|
|
||||||
GINTMSK.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[hc_num]->HCGINTMSK); \
|
|
||||||
GINTMSK.b.chhltd = 1; \
|
|
||||||
USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCGINTMSK, GINTMSK.d32);}
|
|
||||||
|
|
||||||
#define MASK_HOST_INT_ACK(hc_num) { USB_OTG_HCGINTMSK_TypeDef GINTMSK; \
|
|
||||||
GINTMSK.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[hc_num]->HCGINTMSK); \
|
|
||||||
GINTMSK.b.ack = 0; \
|
|
||||||
USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCGINTMSK, GINTMSK.d32);}
|
|
||||||
|
|
||||||
#define UNMASK_HOST_INT_ACK(hc_num) { USB_OTG_HCGINTMSK_TypeDef GINTMSK; \
|
|
||||||
GINTMSK.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[hc_num]->HCGINTMSK); \
|
|
||||||
GINTMSK.b.ack = 1; \
|
|
||||||
USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCGINTMSK, GINTMSK.d32);}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_HCD_INT_Exported_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_HCD_INT_Exported_FunctionsPrototype
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/* Callbacks handler */
|
|
||||||
void ConnectCallback_Handler(USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
void Disconnect_Callback_Handler(USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
void Overcurrent_Callback_Handler(USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
uint32_t USBH_OTG_ISR_Handler (USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif //__HCD_INT_H__
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
||||||
|
|
@ -1,93 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usb_otg.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V2.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief OTG Core Header
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __USB_OTG__
|
|
||||||
#define __USB_OTG__
|
|
||||||
|
|
||||||
|
|
||||||
/** @addtogroup USB_OTG_DRIVER
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_OTG
|
|
||||||
* @brief This file is the
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_OTG_Exported_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
void USB_OTG_InitiateSRP(void);
|
|
||||||
void USB_OTG_InitiateHNP(uint8_t state , uint8_t mode);
|
|
||||||
void USB_OTG_Switchback (USB_OTG_CORE_DEVICE *pdev);
|
|
||||||
uint32_t USB_OTG_GetCurrentState (USB_OTG_CORE_DEVICE *pdev);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_OTG_Exported_Types
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_OTG_Exported_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_OTG_Exported_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_OTG_Exported_FunctionsPrototype
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#endif //__USB_OTG__
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
@ -1,2 +0,0 @@
|
|||||||
SUB_FOLDER += firmware/arch/stm32f4xx/lib/STM32_USB_OTG_Driver/src
|
|
||||||
INCLUDES += firmware/arch/stm32f4xx/lib/STM32_USB_OTG_Driver/inc
|
|
File diff suppressed because it is too large
Load Diff
@ -1,472 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usb_dcd.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V2.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief Peripheral Device Interface Layer
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usb_dcd.h"
|
|
||||||
#include "usb_bsp.h"
|
|
||||||
|
|
||||||
|
|
||||||
/** @addtogroup USB_OTG_DRIVER
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_DCD
|
|
||||||
* @brief This file is the interface between EFSL ans Host mass-storage class
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_DCD_Private_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_DCD_Private_TypesDefinitions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_DCD_Private_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_DCD_Private_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_DCD_Private_FunctionPrototypes
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_DCD_Private_Functions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void DCD_Init(USB_OTG_CORE_HANDLE *pdev ,
|
|
||||||
USB_OTG_CORE_ID_TypeDef coreID)
|
|
||||||
{
|
|
||||||
uint32_t i;
|
|
||||||
USB_OTG_EP *ep;
|
|
||||||
|
|
||||||
USB_OTG_SelectCore (pdev , coreID);
|
|
||||||
|
|
||||||
pdev->dev.device_status = USB_OTG_DEFAULT;
|
|
||||||
pdev->dev.device_address = 0;
|
|
||||||
|
|
||||||
/* Init ep structure */
|
|
||||||
for (i = 0; i < pdev->cfg.dev_endpoints ; i++)
|
|
||||||
{
|
|
||||||
ep = &pdev->dev.in_ep[i];
|
|
||||||
/* Init ep structure */
|
|
||||||
ep->is_in = 1;
|
|
||||||
ep->num = i;
|
|
||||||
ep->tx_fifo_num = i;
|
|
||||||
/* Control until ep is actvated */
|
|
||||||
ep->type = EP_TYPE_CTRL;
|
|
||||||
ep->maxpacket = USB_OTG_MAX_EP0_SIZE;
|
|
||||||
ep->xfer_buff = 0;
|
|
||||||
ep->xfer_len = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < pdev->cfg.dev_endpoints; i++)
|
|
||||||
{
|
|
||||||
ep = &pdev->dev.out_ep[i];
|
|
||||||
/* Init ep structure */
|
|
||||||
ep->is_in = 0;
|
|
||||||
ep->num = i;
|
|
||||||
ep->tx_fifo_num = i;
|
|
||||||
/* Control until ep is activated */
|
|
||||||
ep->type = EP_TYPE_CTRL;
|
|
||||||
ep->maxpacket = USB_OTG_MAX_EP0_SIZE;
|
|
||||||
ep->xfer_buff = 0;
|
|
||||||
ep->xfer_len = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
USB_OTG_DisableGlobalInt(pdev);
|
|
||||||
|
|
||||||
/*Init the Core (common init.) */
|
|
||||||
USB_OTG_CoreInit(pdev);
|
|
||||||
|
|
||||||
|
|
||||||
/* Force Device Mode*/
|
|
||||||
USB_OTG_SetCurrentMode(pdev, DEVICE_MODE);
|
|
||||||
|
|
||||||
/* Init Device */
|
|
||||||
USB_OTG_CoreInitDev(pdev);
|
|
||||||
|
|
||||||
|
|
||||||
/* Enable USB Global interrupt */
|
|
||||||
USB_OTG_EnableGlobalInt(pdev);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Configure an EP
|
|
||||||
* @param pdev : Device instance
|
|
||||||
* @param epdesc : Endpoint Descriptor
|
|
||||||
* @retval : status
|
|
||||||
*/
|
|
||||||
uint32_t DCD_EP_Open(USB_OTG_CORE_HANDLE *pdev ,
|
|
||||||
uint8_t ep_addr,
|
|
||||||
uint16_t ep_mps,
|
|
||||||
uint8_t ep_type)
|
|
||||||
{
|
|
||||||
USB_OTG_EP *ep;
|
|
||||||
|
|
||||||
if ((ep_addr & 0x80) == 0x80)
|
|
||||||
{
|
|
||||||
ep = &pdev->dev.in_ep[ep_addr & 0x7F];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ep = &pdev->dev.out_ep[ep_addr & 0x7F];
|
|
||||||
}
|
|
||||||
ep->num = ep_addr & 0x7F;
|
|
||||||
|
|
||||||
ep->is_in = (0x80 & ep_addr) != 0;
|
|
||||||
ep->maxpacket = ep_mps;
|
|
||||||
ep->type = ep_type;
|
|
||||||
if (ep->is_in)
|
|
||||||
{
|
|
||||||
/* Assign a Tx FIFO */
|
|
||||||
ep->tx_fifo_num = ep->num;
|
|
||||||
}
|
|
||||||
/* Set initial data PID. */
|
|
||||||
if (ep_type == USB_OTG_EP_BULK )
|
|
||||||
{
|
|
||||||
ep->data_pid_start = 0;
|
|
||||||
}
|
|
||||||
USB_OTG_EPActivate(pdev , ep );
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief called when an EP is disabled
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param ep_addr: endpoint address
|
|
||||||
* @retval : status
|
|
||||||
*/
|
|
||||||
uint32_t DCD_EP_Close(USB_OTG_CORE_HANDLE *pdev , uint8_t ep_addr)
|
|
||||||
{
|
|
||||||
USB_OTG_EP *ep;
|
|
||||||
|
|
||||||
if ((ep_addr&0x80) == 0x80)
|
|
||||||
{
|
|
||||||
ep = &pdev->dev.in_ep[ep_addr & 0x7F];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ep = &pdev->dev.out_ep[ep_addr & 0x7F];
|
|
||||||
}
|
|
||||||
ep->num = ep_addr & 0x7F;
|
|
||||||
ep->is_in = (0x80 & ep_addr) != 0;
|
|
||||||
USB_OTG_EPDeactivate(pdev , ep );
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief DCD_EP_PrepareRx
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param ep_addr: endpoint address
|
|
||||||
* @param pbuf: pointer to Rx buffer
|
|
||||||
* @param buf_len: data length
|
|
||||||
* @retval : status
|
|
||||||
*/
|
|
||||||
uint32_t DCD_EP_PrepareRx( USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
uint8_t ep_addr,
|
|
||||||
uint8_t *pbuf,
|
|
||||||
uint16_t buf_len)
|
|
||||||
{
|
|
||||||
USB_OTG_EP *ep;
|
|
||||||
|
|
||||||
ep = &pdev->dev.out_ep[ep_addr & 0x7F];
|
|
||||||
|
|
||||||
/*setup and start the Xfer */
|
|
||||||
ep->xfer_buff = pbuf;
|
|
||||||
ep->xfer_len = buf_len;
|
|
||||||
ep->xfer_count = 0;
|
|
||||||
ep->is_in = 0;
|
|
||||||
ep->num = ep_addr & 0x7F;
|
|
||||||
|
|
||||||
if (pdev->cfg.dma_enable == 1)
|
|
||||||
{
|
|
||||||
ep->dma_addr = (uint32_t)pbuf;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ep->num == 0 )
|
|
||||||
{
|
|
||||||
USB_OTG_EP0StartXfer(pdev , ep);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
USB_OTG_EPStartXfer(pdev, ep );
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Transmit data over USB
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param ep_addr: endpoint address
|
|
||||||
* @param pbuf: pointer to Tx buffer
|
|
||||||
* @param buf_len: data length
|
|
||||||
* @retval : status
|
|
||||||
*/
|
|
||||||
uint32_t DCD_EP_Tx ( USB_OTG_CORE_HANDLE *pdev,
|
|
||||||
uint8_t ep_addr,
|
|
||||||
uint8_t *pbuf,
|
|
||||||
uint32_t buf_len)
|
|
||||||
{
|
|
||||||
USB_OTG_EP *ep;
|
|
||||||
|
|
||||||
ep = &pdev->dev.in_ep[ep_addr & 0x7F];
|
|
||||||
|
|
||||||
/* Setup and start the Transfer */
|
|
||||||
ep->is_in = 1;
|
|
||||||
ep->num = ep_addr & 0x7F;
|
|
||||||
ep->xfer_buff = pbuf;
|
|
||||||
ep->dma_addr = (uint32_t)pbuf;
|
|
||||||
ep->xfer_count = 0;
|
|
||||||
ep->xfer_len = buf_len;
|
|
||||||
|
|
||||||
if ( ep->num == 0 )
|
|
||||||
{
|
|
||||||
USB_OTG_EP0StartXfer(pdev , ep);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
USB_OTG_EPStartXfer(pdev, ep );
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Stall an endpoint.
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param epnum: endpoint address
|
|
||||||
* @retval : status
|
|
||||||
*/
|
|
||||||
uint32_t DCD_EP_Stall (USB_OTG_CORE_HANDLE *pdev, uint8_t epnum)
|
|
||||||
{
|
|
||||||
USB_OTG_EP *ep;
|
|
||||||
if ((0x80 & epnum) == 0x80)
|
|
||||||
{
|
|
||||||
ep = &pdev->dev.in_ep[epnum & 0x7F];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ep = &pdev->dev.out_ep[epnum];
|
|
||||||
}
|
|
||||||
|
|
||||||
ep->is_stall = 1;
|
|
||||||
ep->num = epnum & 0x7F;
|
|
||||||
ep->is_in = ((epnum & 0x80) == 0x80);
|
|
||||||
|
|
||||||
USB_OTG_EPSetStall(pdev , ep);
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Clear stall condition on endpoints.
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param epnum: endpoint address
|
|
||||||
* @retval : status
|
|
||||||
*/
|
|
||||||
uint32_t DCD_EP_ClrStall (USB_OTG_CORE_HANDLE *pdev, uint8_t epnum)
|
|
||||||
{
|
|
||||||
USB_OTG_EP *ep;
|
|
||||||
if ((0x80 & epnum) == 0x80)
|
|
||||||
{
|
|
||||||
ep = &pdev->dev.in_ep[epnum & 0x7F];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ep = &pdev->dev.out_ep[epnum];
|
|
||||||
}
|
|
||||||
|
|
||||||
ep->is_stall = 0;
|
|
||||||
ep->num = epnum & 0x7F;
|
|
||||||
ep->is_in = ((epnum & 0x80) == 0x80);
|
|
||||||
|
|
||||||
USB_OTG_EPClearStall(pdev , ep);
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief This Function flushes the FIFOs.
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param epnum: endpoint address
|
|
||||||
* @retval : status
|
|
||||||
*/
|
|
||||||
uint32_t DCD_EP_Flush (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum)
|
|
||||||
{
|
|
||||||
|
|
||||||
if ((epnum & 0x80) == 0x80)
|
|
||||||
{
|
|
||||||
USB_OTG_FlushTxFifo(pdev, epnum & 0x7F);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
USB_OTG_FlushRxFifo(pdev);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief This Function set USB device address
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param address: new device address
|
|
||||||
* @retval : status
|
|
||||||
*/
|
|
||||||
void DCD_EP_SetAddress (USB_OTG_CORE_HANDLE *pdev, uint8_t address)
|
|
||||||
{
|
|
||||||
USB_OTG_DCFG_TypeDef dcfg;
|
|
||||||
dcfg.d32 = 0;
|
|
||||||
dcfg.b.devaddr = address;
|
|
||||||
USB_OTG_MODIFY_REG32( &pdev->regs.DREGS->DCFG, 0, dcfg.d32);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Connect device (enable internal pull-up)
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @retval : None
|
|
||||||
*/
|
|
||||||
void DCD_DevConnect (USB_OTG_CORE_HANDLE *pdev)
|
|
||||||
{
|
|
||||||
#ifndef USE_OTG_MODE
|
|
||||||
USB_OTG_DCTL_TypeDef dctl;
|
|
||||||
dctl.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DCTL);
|
|
||||||
/* Connect device */
|
|
||||||
dctl.b.sftdiscon = 0;
|
|
||||||
USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DCTL, dctl.d32);
|
|
||||||
USB_OTG_BSP_mDelay(3);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Disconnect device (disable internal pull-up)
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @retval : None
|
|
||||||
*/
|
|
||||||
void DCD_DevDisconnect (USB_OTG_CORE_HANDLE *pdev)
|
|
||||||
{
|
|
||||||
#ifndef USE_OTG_MODE
|
|
||||||
USB_OTG_DCTL_TypeDef dctl;
|
|
||||||
dctl.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DCTL);
|
|
||||||
/* Disconnect device for 3ms */
|
|
||||||
dctl.b.sftdiscon = 1;
|
|
||||||
USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DCTL, dctl.d32);
|
|
||||||
USB_OTG_BSP_mDelay(3);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief returns the EP Status
|
|
||||||
* @param pdev : Selected device
|
|
||||||
* epnum : endpoint address
|
|
||||||
* @retval : EP status
|
|
||||||
*/
|
|
||||||
|
|
||||||
uint32_t DCD_GetEPStatus(USB_OTG_CORE_HANDLE *pdev ,uint8_t epnum)
|
|
||||||
{
|
|
||||||
USB_OTG_EP *ep;
|
|
||||||
uint32_t Status = 0;
|
|
||||||
|
|
||||||
if ((0x80 & epnum) == 0x80)
|
|
||||||
{
|
|
||||||
ep = &pdev->dev.in_ep[epnum & 0x7F];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ep = &pdev->dev.out_ep[epnum];
|
|
||||||
}
|
|
||||||
|
|
||||||
Status = USB_OTG_GetEPStatus(pdev ,ep);
|
|
||||||
|
|
||||||
/* Return the current status */
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Set the EP Status
|
|
||||||
* @param pdev : Selected device
|
|
||||||
* Status : new Status
|
|
||||||
* epnum : EP address
|
|
||||||
* @retval : None
|
|
||||||
*/
|
|
||||||
void DCD_SetEPStatus (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum , uint32_t Status)
|
|
||||||
{
|
|
||||||
USB_OTG_EP *ep;
|
|
||||||
|
|
||||||
if ((0x80 & epnum) == 0x80)
|
|
||||||
{
|
|
||||||
ep = &pdev->dev.in_ep[epnum & 0x7F];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ep = &pdev->dev.out_ep[epnum];
|
|
||||||
}
|
|
||||||
|
|
||||||
USB_OTG_SetEPStatus(pdev ,ep , Status);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
@ -1,912 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usb_dcd_int.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V2.0.0
|
|
||||||
* @date 22-July-2011
|
|
||||||
* @brief Peripheral Device interrupt subroutines
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usb_dcd_int.h"
|
|
||||||
/** @addtogroup USB_OTG_DRIVER
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_DCD_INT
|
|
||||||
* @brief This file contains the interrupt subroutines for the Device mode.
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_DCD_INT_Private_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_DCD_INT_Private_TypesDefinitions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_DCD_INT_Private_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_DCD_INT_Private_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_DCD_INT_Private_FunctionPrototypes
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/* static functions */
|
|
||||||
static uint32_t DCD_ReadDevInEP (USB_OTG_CORE_HANDLE *pdev, uint8_t epnum);
|
|
||||||
|
|
||||||
/* Interrupt Handlers */
|
|
||||||
static uint32_t DCD_HandleInEP_ISR(USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
static uint32_t DCD_HandleOutEP_ISR(USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
static uint32_t DCD_HandleSof_ISR(USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
|
|
||||||
static uint32_t DCD_HandleRxStatusQueueLevel_ISR(USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
static uint32_t DCD_WriteEmptyTxFifo(USB_OTG_CORE_HANDLE *pdev , uint32_t epnum);
|
|
||||||
|
|
||||||
static uint32_t DCD_HandleUsbReset_ISR(USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
static uint32_t DCD_HandleEnumDone_ISR(USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
static uint32_t DCD_HandleResume_ISR(USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
static uint32_t DCD_HandleUSBSuspend_ISR(USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
|
|
||||||
static uint32_t DCD_IsoINIncomplete_ISR(USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
static uint32_t DCD_IsoOUTIncomplete_ISR(USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
#ifdef VBUS_SENSING_ENABLED
|
|
||||||
static uint32_t DCD_SessionRequest_ISR(USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
static uint32_t DCD_OTG_ISR(USB_OTG_CORE_HANDLE *pdev);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USB_DCD_INT_Private_Functions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
uint8_t run = 1;
|
|
||||||
|
|
||||||
#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED
|
|
||||||
/**
|
|
||||||
* @brief USBD_OTG_EP1OUT_ISR_Handler
|
|
||||||
* handles all USB Interrupts
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
uint32_t USBD_OTG_EP1OUT_ISR_Handler (USB_OTG_CORE_HANDLE *pdev)
|
|
||||||
{
|
|
||||||
|
|
||||||
USB_OTG_DOEPINTn_TypeDef doepint;
|
|
||||||
USB_OTG_DEPXFRSIZ_TypeDef deptsiz;
|
|
||||||
|
|
||||||
doepint.d32 = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[1]->DOEPINT);
|
|
||||||
doepint.d32&= USB_OTG_READ_REG32(&pdev->regs.DREGS->DOUTEP1MSK);
|
|
||||||
|
|
||||||
/* Transfer complete */
|
|
||||||
if ( doepint.b.xfercompl )
|
|
||||||
{
|
|
||||||
/* Clear the bit in DOEPINTn for this interrupt */
|
|
||||||
CLEAR_OUT_EP_INTR(1, xfercompl);
|
|
||||||
if (pdev->cfg.dma_enable == 1)
|
|
||||||
{
|
|
||||||
deptsiz.d32 = USB_OTG_READ_REG32(&(pdev->regs.OUTEP_REGS[1]->DOEPTSIZ));
|
|
||||||
/*ToDo : handle more than one single MPS size packet */
|
|
||||||
pdev->dev.out_ep[1].xfer_count = pdev->dev.out_ep[1].maxpacket - \
|
|
||||||
deptsiz.b.xfersize;
|
|
||||||
}
|
|
||||||
/* Inform upper layer: data ready */
|
|
||||||
/* RX COMPLETE */
|
|
||||||
USBD_DCD_INT_fops->DataOutStage(pdev , 1);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Endpoint disable */
|
|
||||||
if ( doepint.b.epdisabled )
|
|
||||||
{
|
|
||||||
/* Clear the bit in DOEPINTn for this interrupt */
|
|
||||||
CLEAR_OUT_EP_INTR(1, epdisabled);
|
|
||||||
}
|
|
||||||
/* AHB Error */
|
|
||||||
if ( doepint.b.ahberr )
|
|
||||||
{
|
|
||||||
CLEAR_OUT_EP_INTR(1, ahberr);
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_OTG_EP1IN_ISR_Handler
|
|
||||||
* handles all USB Interrupts
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
uint32_t USBD_OTG_EP1IN_ISR_Handler (USB_OTG_CORE_HANDLE *pdev)
|
|
||||||
{
|
|
||||||
|
|
||||||
USB_OTG_DIEPINTn_TypeDef diepint;
|
|
||||||
uint32_t fifoemptymsk, msk, emp;
|
|
||||||
|
|
||||||
msk = USB_OTG_READ_REG32(&pdev->regs.DREGS->DINEP1MSK);
|
|
||||||
emp = USB_OTG_READ_REG32(&pdev->regs.DREGS->DIEPEMPMSK);
|
|
||||||
msk |= ((emp >> 1 ) & 0x1) << 7;
|
|
||||||
diepint.d32 = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[1]->DIEPINT) & msk;
|
|
||||||
|
|
||||||
if ( diepint.b.xfercompl )
|
|
||||||
{
|
|
||||||
fifoemptymsk = 0x1 << 1;
|
|
||||||
USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, fifoemptymsk, 0);
|
|
||||||
CLEAR_IN_EP_INTR(1, xfercompl);
|
|
||||||
/* TX COMPLETE */
|
|
||||||
USBD_DCD_INT_fops->DataInStage(pdev , 1);
|
|
||||||
}
|
|
||||||
if ( diepint.b.ahberr )
|
|
||||||
{
|
|
||||||
CLEAR_IN_EP_INTR(1, ahberr);
|
|
||||||
}
|
|
||||||
if ( diepint.b.epdisabled )
|
|
||||||
{
|
|
||||||
CLEAR_IN_EP_INTR(1, epdisabled);
|
|
||||||
}
|
|
||||||
if ( diepint.b.timeout )
|
|
||||||
{
|
|
||||||
CLEAR_IN_EP_INTR(1, timeout);
|
|
||||||
}
|
|
||||||
if (diepint.b.intktxfemp)
|
|
||||||
{
|
|
||||||
CLEAR_IN_EP_INTR(1, intktxfemp);
|
|
||||||
}
|
|
||||||
if (diepint.b.intknepmis)
|
|
||||||
{
|
|
||||||
CLEAR_IN_EP_INTR(1, intknepmis);
|
|
||||||
}
|
|
||||||
if (diepint.b.inepnakeff)
|
|
||||||
{
|
|
||||||
CLEAR_IN_EP_INTR(1, inepnakeff);
|
|
||||||
}
|
|
||||||
if (diepint.b.emptyintr)
|
|
||||||
{
|
|
||||||
DCD_WriteEmptyTxFifo(pdev , 1);
|
|
||||||
CLEAR_IN_EP_INTR(1, emptyintr);
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief STM32_USBF_OTG_ISR_Handler
|
|
||||||
* handles all USB Interrupts
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
uint32_t USBD_OTG_ISR_Handler (USB_OTG_CORE_HANDLE *pdev)
|
|
||||||
{
|
|
||||||
USB_OTG_GINTSTS_TypeDef gintr_status;
|
|
||||||
uint32_t retval = 0;
|
|
||||||
|
|
||||||
if (USB_OTG_IsDeviceMode(pdev)) /* ensure that we are in device mode */
|
|
||||||
{
|
|
||||||
gintr_status.d32 = USB_OTG_ReadCoreItr(pdev);
|
|
||||||
if (!gintr_status.d32) /* avoid spurious interrupt */
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gintr_status.b.outepintr)
|
|
||||||
{
|
|
||||||
retval |= DCD_HandleOutEP_ISR(pdev);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gintr_status.b.inepint)
|
|
||||||
{
|
|
||||||
retval |= DCD_HandleInEP_ISR(pdev);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gintr_status.b.modemismatch)
|
|
||||||
{
|
|
||||||
USB_OTG_GINTSTS_TypeDef gintsts;
|
|
||||||
|
|
||||||
/* Clear interrupt */
|
|
||||||
gintsts.d32 = 0;
|
|
||||||
gintsts.b.modemismatch = 1;
|
|
||||||
USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, gintsts.d32);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gintr_status.b.wkupintr)
|
|
||||||
{
|
|
||||||
retval |= DCD_HandleResume_ISR(pdev);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gintr_status.b.usbsuspend)
|
|
||||||
{
|
|
||||||
retval |= DCD_HandleUSBSuspend_ISR(pdev);
|
|
||||||
}
|
|
||||||
if (gintr_status.b.sofintr)
|
|
||||||
{
|
|
||||||
retval |= DCD_HandleSof_ISR(pdev);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gintr_status.b.rxstsqlvl)
|
|
||||||
{
|
|
||||||
retval |= DCD_HandleRxStatusQueueLevel_ISR(pdev);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gintr_status.b.usbreset)
|
|
||||||
{
|
|
||||||
retval |= DCD_HandleUsbReset_ISR(pdev);
|
|
||||||
|
|
||||||
}
|
|
||||||
if (gintr_status.b.enumdone)
|
|
||||||
{
|
|
||||||
retval |= DCD_HandleEnumDone_ISR(pdev);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gintr_status.b.incomplisoin)
|
|
||||||
{
|
|
||||||
retval |= DCD_IsoINIncomplete_ISR(pdev);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gintr_status.b.incomplisoout)
|
|
||||||
{
|
|
||||||
retval |= DCD_IsoOUTIncomplete_ISR(pdev);
|
|
||||||
}
|
|
||||||
#ifdef VBUS_SENSING_ENABLED
|
|
||||||
if (gintr_status.b.sessreqintr)
|
|
||||||
{
|
|
||||||
retval |= DCD_SessionRequest_ISR(pdev);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gintr_status.b.otgintr)
|
|
||||||
{
|
|
||||||
retval |= DCD_OTG_ISR(pdev);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef VBUS_SENSING_ENABLED
|
|
||||||
/**
|
|
||||||
* @brief DCD_SessionRequest_ISR
|
|
||||||
* Indicates that the USB_OTG controller has detected a connection
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint32_t DCD_SessionRequest_ISR(USB_OTG_CORE_HANDLE *pdev)
|
|
||||||
{
|
|
||||||
USB_OTG_GINTSTS_TypeDef gintsts;
|
|
||||||
USBD_DCD_INT_fops->DevConnected (pdev);
|
|
||||||
|
|
||||||
/* Clear interrupt */
|
|
||||||
gintsts.d32 = 0;
|
|
||||||
gintsts.b.sessreqintr = 1;
|
|
||||||
USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GINTSTS, gintsts.d32);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief DCD_OTG_ISR
|
|
||||||
* Indicates that the USB_OTG controller has detected an OTG event:
|
|
||||||
* used to detect the end of session i.e. disconnection
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint32_t DCD_OTG_ISR(USB_OTG_CORE_HANDLE *pdev)
|
|
||||||
{
|
|
||||||
|
|
||||||
USB_OTG_GOTGINT_TypeDef gotgint;
|
|
||||||
|
|
||||||
gotgint.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GOTGINT);
|
|
||||||
|
|
||||||
if (gotgint.b.sesenddet)
|
|
||||||
{
|
|
||||||
USBD_DCD_INT_fops->DevDisconnected (pdev);
|
|
||||||
}
|
|
||||||
/* Clear OTG interrupt */
|
|
||||||
USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GOTGINT, gotgint.d32);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
/**
|
|
||||||
* @brief DCD_HandleResume_ISR
|
|
||||||
* Indicates that the USB_OTG controller has detected a resume or
|
|
||||||
* remote Wake-up sequence
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint32_t DCD_HandleResume_ISR(USB_OTG_CORE_HANDLE *pdev)
|
|
||||||
{
|
|
||||||
USB_OTG_GINTSTS_TypeDef gintsts;
|
|
||||||
USB_OTG_DCTL_TypeDef devctl;
|
|
||||||
USB_OTG_PCGCCTL_TypeDef power;
|
|
||||||
|
|
||||||
if(pdev->cfg.low_power)
|
|
||||||
{
|
|
||||||
/* un-gate USB Core clock */
|
|
||||||
power.d32 = USB_OTG_READ_REG32(&pdev->regs.PCGCCTL);
|
|
||||||
power.b.gatehclk = 0;
|
|
||||||
power.b.stoppclk = 0;
|
|
||||||
USB_OTG_WRITE_REG32(pdev->regs.PCGCCTL, power.d32);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Clear the Remote Wake-up Signaling */
|
|
||||||
devctl.d32 = 0;
|
|
||||||
devctl.b.rmtwkupsig = 1;
|
|
||||||
USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DCTL, devctl.d32, 0);
|
|
||||||
|
|
||||||
/* Inform upper layer by the Resume Event */
|
|
||||||
USBD_DCD_INT_fops->Resume (pdev);
|
|
||||||
|
|
||||||
/* Clear interrupt */
|
|
||||||
gintsts.d32 = 0;
|
|
||||||
gintsts.b.wkupintr = 1;
|
|
||||||
USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GINTSTS, gintsts.d32);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USB_OTG_HandleUSBSuspend_ISR
|
|
||||||
* Indicates that SUSPEND state has been detected on the USB
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint32_t DCD_HandleUSBSuspend_ISR(USB_OTG_CORE_HANDLE *pdev)
|
|
||||||
{
|
|
||||||
USB_OTG_GINTSTS_TypeDef gintsts;
|
|
||||||
USB_OTG_PCGCCTL_TypeDef power;
|
|
||||||
USB_OTG_DSTS_TypeDef dsts;
|
|
||||||
|
|
||||||
USBD_DCD_INT_fops->Suspend (pdev);
|
|
||||||
|
|
||||||
dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS);
|
|
||||||
|
|
||||||
/* Clear interrupt */
|
|
||||||
gintsts.d32 = 0;
|
|
||||||
gintsts.b.usbsuspend = 1;
|
|
||||||
USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, gintsts.d32);
|
|
||||||
|
|
||||||
if((pdev->cfg.low_power) && (dsts.b.suspsts == 1))
|
|
||||||
{
|
|
||||||
/* switch-off the clocks */
|
|
||||||
power.d32 = 0;
|
|
||||||
power.b.stoppclk = 1;
|
|
||||||
USB_OTG_MODIFY_REG32(pdev->regs.PCGCCTL, 0, power.d32);
|
|
||||||
|
|
||||||
power.b.gatehclk = 1;
|
|
||||||
USB_OTG_MODIFY_REG32(pdev->regs.PCGCCTL, 0, power.d32);
|
|
||||||
|
|
||||||
/* Request to enter Sleep mode after exit from current ISR */
|
|
||||||
SCB->SCR |= (SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk);
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief DCD_HandleInEP_ISR
|
|
||||||
* Indicates that an IN EP has a pending Interrupt
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint32_t DCD_HandleInEP_ISR(USB_OTG_CORE_HANDLE *pdev)
|
|
||||||
{
|
|
||||||
USB_OTG_DIEPINTn_TypeDef diepint;
|
|
||||||
|
|
||||||
|
|
||||||
uint32_t ep_intr;
|
|
||||||
uint32_t epnum = 0;
|
|
||||||
uint32_t fifoemptymsk;
|
|
||||||
diepint.d32 = 0;
|
|
||||||
ep_intr = USB_OTG_ReadDevAllInEPItr(pdev);
|
|
||||||
|
|
||||||
while ( ep_intr )
|
|
||||||
{
|
|
||||||
if (ep_intr&0x1) /* In ITR */
|
|
||||||
{
|
|
||||||
diepint.d32 = DCD_ReadDevInEP(pdev , epnum); /* Get In ITR status */
|
|
||||||
if ( diepint.b.xfercompl )
|
|
||||||
{
|
|
||||||
fifoemptymsk = 0x1 << epnum;
|
|
||||||
USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, fifoemptymsk, 0);
|
|
||||||
CLEAR_IN_EP_INTR(epnum, xfercompl);
|
|
||||||
/* TX COMPLETE */
|
|
||||||
USBD_DCD_INT_fops->DataInStage(pdev , epnum);
|
|
||||||
|
|
||||||
if (pdev->cfg.dma_enable == 1)
|
|
||||||
{
|
|
||||||
if((epnum == 0) && (pdev->dev.device_state == USB_OTG_EP0_STATUS_IN))
|
|
||||||
{
|
|
||||||
/* prepare to rx more setup packets */
|
|
||||||
USB_OTG_EP0_OutStart(pdev);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( diepint.b.ahberr )
|
|
||||||
{
|
|
||||||
CLEAR_IN_EP_INTR(epnum, ahberr);
|
|
||||||
}
|
|
||||||
if ( diepint.b.timeout )
|
|
||||||
{
|
|
||||||
CLEAR_IN_EP_INTR(epnum, timeout);
|
|
||||||
}
|
|
||||||
if (diepint.b.intktxfemp)
|
|
||||||
{
|
|
||||||
CLEAR_IN_EP_INTR(epnum, intktxfemp);
|
|
||||||
}
|
|
||||||
if (diepint.b.intknepmis)
|
|
||||||
{
|
|
||||||
CLEAR_IN_EP_INTR(epnum, intknepmis);
|
|
||||||
}
|
|
||||||
if (diepint.b.inepnakeff)
|
|
||||||
{
|
|
||||||
CLEAR_IN_EP_INTR(epnum, inepnakeff);
|
|
||||||
}
|
|
||||||
if ( diepint.b.epdisabled )
|
|
||||||
{
|
|
||||||
CLEAR_IN_EP_INTR(epnum, epdisabled);
|
|
||||||
}
|
|
||||||
if (diepint.b.emptyintr)
|
|
||||||
{
|
|
||||||
|
|
||||||
DCD_WriteEmptyTxFifo(pdev , epnum);
|
|
||||||
|
|
||||||
//CLEAR_IN_EP_INTR(epnum, emptyintr);
|
|
||||||
diepint.d32=0;
|
|
||||||
diepint.b.emptyintr = 1;
|
|
||||||
USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[epnum]->DIEPINT,diepint.d32);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
epnum++;
|
|
||||||
ep_intr >>= 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief DCD_HandleOutEP_ISR
|
|
||||||
* Indicates that an OUT EP has a pending Interrupt
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint32_t DCD_HandleOutEP_ISR(USB_OTG_CORE_HANDLE *pdev)
|
|
||||||
{
|
|
||||||
uint32_t ep_intr;
|
|
||||||
USB_OTG_DOEPINTn_TypeDef doepint;
|
|
||||||
USB_OTG_DEPXFRSIZ_TypeDef deptsiz;
|
|
||||||
uint32_t epnum = 0;
|
|
||||||
|
|
||||||
doepint.d32 = 0;
|
|
||||||
|
|
||||||
/* Read in the device interrupt bits */
|
|
||||||
ep_intr = USB_OTG_ReadDevAllOutEp_itr(pdev);
|
|
||||||
|
|
||||||
while ( ep_intr )
|
|
||||||
{
|
|
||||||
if (ep_intr&0x1)
|
|
||||||
{
|
|
||||||
|
|
||||||
doepint.d32 = USB_OTG_ReadDevOutEP_itr(pdev, epnum);
|
|
||||||
|
|
||||||
/* Transfer complete */
|
|
||||||
if ( doepint.b.xfercompl )
|
|
||||||
{
|
|
||||||
/* Clear the bit in DOEPINTn for this interrupt */
|
|
||||||
CLEAR_OUT_EP_INTR(epnum, xfercompl);
|
|
||||||
if (pdev->cfg.dma_enable == 1)
|
|
||||||
{
|
|
||||||
deptsiz.d32 = USB_OTG_READ_REG32(&(pdev->regs.OUTEP_REGS[epnum]->DOEPTSIZ));
|
|
||||||
/*ToDo : handle more than one single MPS size packet */
|
|
||||||
pdev->dev.out_ep[epnum].xfer_count = pdev->dev.out_ep[epnum].maxpacket - \
|
|
||||||
deptsiz.b.xfersize;
|
|
||||||
}
|
|
||||||
/* Inform upper layer: data ready */
|
|
||||||
/* RX COMPLETE */
|
|
||||||
USBD_DCD_INT_fops->DataOutStage(pdev , epnum);
|
|
||||||
|
|
||||||
if (pdev->cfg.dma_enable == 1)
|
|
||||||
{
|
|
||||||
if((epnum == 0) && (pdev->dev.device_state == USB_OTG_EP0_STATUS_OUT))
|
|
||||||
{
|
|
||||||
/* prepare to rx more setup packets */
|
|
||||||
USB_OTG_EP0_OutStart(pdev);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* Endpoint disable */
|
|
||||||
if ( doepint.b.epdisabled )
|
|
||||||
{
|
|
||||||
/* Clear the bit in DOEPINTn for this interrupt */
|
|
||||||
CLEAR_OUT_EP_INTR(epnum, epdisabled);
|
|
||||||
}
|
|
||||||
/* AHB Error */
|
|
||||||
if ( doepint.b.ahberr )
|
|
||||||
{
|
|
||||||
CLEAR_OUT_EP_INTR(epnum, ahberr);
|
|
||||||
}
|
|
||||||
/* Setup Phase Done (control EPs) */
|
|
||||||
if ( doepint.b.setup )
|
|
||||||
{
|
|
||||||
|
|
||||||
/* inform the upper layer that a setup packet is available */
|
|
||||||
/* SETUP COMPLETE */
|
|
||||||
USBD_DCD_INT_fops->SetupStage(pdev);
|
|
||||||
CLEAR_OUT_EP_INTR(epnum, setup);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
epnum++;
|
|
||||||
ep_intr >>= 1;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief DCD_HandleSof_ISR
|
|
||||||
* Handles the SOF Interrupts
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint32_t DCD_HandleSof_ISR(USB_OTG_CORE_HANDLE *pdev)
|
|
||||||
{
|
|
||||||
USB_OTG_GINTSTS_TypeDef GINTSTS;
|
|
||||||
|
|
||||||
|
|
||||||
USBD_DCD_INT_fops->SOF(pdev);
|
|
||||||
|
|
||||||
/* Clear interrupt */
|
|
||||||
GINTSTS.d32 = 0;
|
|
||||||
GINTSTS.b.sofintr = 1;
|
|
||||||
USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GINTSTS, GINTSTS.d32);
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief DCD_HandleRxStatusQueueLevel_ISR
|
|
||||||
* Handles the Rx Status Queue Level Interrupt
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint32_t DCD_HandleRxStatusQueueLevel_ISR(USB_OTG_CORE_HANDLE *pdev)
|
|
||||||
{
|
|
||||||
USB_OTG_GINTMSK_TypeDef int_mask;
|
|
||||||
USB_OTG_DRXSTS_TypeDef status;
|
|
||||||
USB_OTG_EP *ep;
|
|
||||||
|
|
||||||
/* Disable the Rx Status Queue Level interrupt */
|
|
||||||
int_mask.d32 = 0;
|
|
||||||
int_mask.b.rxstsqlvl = 1;
|
|
||||||
USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, int_mask.d32, 0);
|
|
||||||
|
|
||||||
/* Get the Status from the top of the FIFO */
|
|
||||||
status.d32 = USB_OTG_READ_REG32( &pdev->regs.GREGS->GRXSTSP );
|
|
||||||
|
|
||||||
ep = &pdev->dev.out_ep[status.b.epnum];
|
|
||||||
|
|
||||||
switch (status.b.pktsts)
|
|
||||||
{
|
|
||||||
case STS_GOUT_NAK:
|
|
||||||
break;
|
|
||||||
case STS_DATA_UPDT:
|
|
||||||
if (status.b.bcnt)
|
|
||||||
{
|
|
||||||
USB_OTG_ReadPacket(pdev,ep->xfer_buff, status.b.bcnt);
|
|
||||||
ep->xfer_buff += status.b.bcnt;
|
|
||||||
ep->xfer_count += status.b.bcnt;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case STS_XFER_COMP:
|
|
||||||
break;
|
|
||||||
case STS_SETUP_COMP:
|
|
||||||
break;
|
|
||||||
case STS_SETUP_UPDT:
|
|
||||||
/* Copy the setup packet received in FIFO into the setup buffer in RAM */
|
|
||||||
USB_OTG_ReadPacket(pdev , pdev->dev.setup_packet, 8);
|
|
||||||
ep->xfer_count += status.b.bcnt;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Enable the Rx Status Queue Level interrupt */
|
|
||||||
USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, 0, int_mask.d32);
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief DCD_WriteEmptyTxFifo
|
|
||||||
* check FIFO for the next packet to be loaded
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint32_t DCD_WriteEmptyTxFifo(USB_OTG_CORE_HANDLE *pdev, uint32_t epnum)
|
|
||||||
{
|
|
||||||
USB_OTG_DTXFSTSn_TypeDef txstatus;
|
|
||||||
USB_OTG_EP *ep;
|
|
||||||
uint32_t len = 0;
|
|
||||||
uint32_t len32b;
|
|
||||||
static uint32_t count = 0;
|
|
||||||
txstatus.d32 = 0;
|
|
||||||
|
|
||||||
ep = &pdev->dev.in_ep[epnum];
|
|
||||||
|
|
||||||
len = ep->xfer_len - ep->xfer_count;
|
|
||||||
|
|
||||||
if (len > ep->maxpacket)
|
|
||||||
{
|
|
||||||
len = ep->maxpacket;
|
|
||||||
}
|
|
||||||
|
|
||||||
len32b = (len + 3) / 4;
|
|
||||||
txstatus.d32 = USB_OTG_READ_REG32( &pdev->regs.INEP_REGS[epnum]->DTXFSTS);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
while (txstatus.b.txfspcavail > len32b &&
|
|
||||||
ep->xfer_count < ep->xfer_len &&
|
|
||||||
ep->xfer_len != 0)
|
|
||||||
{
|
|
||||||
/* Write the FIFO */
|
|
||||||
len = ep->xfer_len - ep->xfer_count;
|
|
||||||
|
|
||||||
if (len > ep->maxpacket)
|
|
||||||
{
|
|
||||||
len = ep->maxpacket;
|
|
||||||
}
|
|
||||||
len32b = (len + 3) / 4;
|
|
||||||
|
|
||||||
USB_OTG_WritePacket (pdev , ep->xfer_buff, epnum, len);
|
|
||||||
|
|
||||||
ep->xfer_buff += len;
|
|
||||||
ep->xfer_count += len;
|
|
||||||
|
|
||||||
txstatus.d32 = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[epnum]->DTXFSTS);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if(len == 0)
|
|
||||||
{
|
|
||||||
|
|
||||||
uint32_t fifoemptymsk;
|
|
||||||
|
|
||||||
count++;
|
|
||||||
if(count == 10)
|
|
||||||
{
|
|
||||||
fifoemptymsk = 0x1 << epnum;
|
|
||||||
USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, fifoemptymsk, 0);
|
|
||||||
count = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
count = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief DCD_HandleUsbReset_ISR
|
|
||||||
* This interrupt occurs when a USB Reset is detected
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint32_t DCD_HandleUsbReset_ISR(USB_OTG_CORE_HANDLE *pdev)
|
|
||||||
{
|
|
||||||
USB_OTG_DAINT_TypeDef daintmsk;
|
|
||||||
USB_OTG_DOEPMSK_TypeDef doepmsk;
|
|
||||||
USB_OTG_DIEPMSK_TypeDef diepmsk;
|
|
||||||
USB_OTG_DCFG_TypeDef dcfg;
|
|
||||||
USB_OTG_DCTL_TypeDef dctl;
|
|
||||||
USB_OTG_GINTSTS_TypeDef gintsts;
|
|
||||||
uint32_t i;
|
|
||||||
|
|
||||||
dctl.d32 = 0;
|
|
||||||
daintmsk.d32 = 0;
|
|
||||||
doepmsk.d32 = 0;
|
|
||||||
diepmsk.d32 = 0;
|
|
||||||
dcfg.d32 = 0;
|
|
||||||
gintsts.d32 = 0;
|
|
||||||
|
|
||||||
/* Clear the Remote Wake-up Signaling */
|
|
||||||
dctl.b.rmtwkupsig = 1;
|
|
||||||
USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DCTL, dctl.d32, 0 );
|
|
||||||
|
|
||||||
/* Flush the Tx FIFO */
|
|
||||||
USB_OTG_FlushTxFifo(pdev , 0 );
|
|
||||||
|
|
||||||
for (i = 0; i < pdev->cfg.dev_endpoints ; i++)
|
|
||||||
{
|
|
||||||
USB_OTG_WRITE_REG32( &pdev->regs.INEP_REGS[i]->DIEPINT, 0xFF);
|
|
||||||
USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[i]->DOEPINT, 0xFF);
|
|
||||||
}
|
|
||||||
USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINT, 0xFFFFFFFF );
|
|
||||||
|
|
||||||
daintmsk.ep.in = 1;
|
|
||||||
daintmsk.ep.out = 1;
|
|
||||||
USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINTMSK, daintmsk.d32 );
|
|
||||||
|
|
||||||
doepmsk.b.setup = 1;
|
|
||||||
doepmsk.b.xfercompl = 1;
|
|
||||||
doepmsk.b.ahberr = 1;
|
|
||||||
doepmsk.b.epdisabled = 1;
|
|
||||||
USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DOEPMSK, doepmsk.d32 );
|
|
||||||
#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED
|
|
||||||
USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DOUTEP1MSK, doepmsk.d32 );
|
|
||||||
#endif
|
|
||||||
diepmsk.b.xfercompl = 1;
|
|
||||||
diepmsk.b.timeout = 1;
|
|
||||||
diepmsk.b.epdisabled = 1;
|
|
||||||
diepmsk.b.ahberr = 1;
|
|
||||||
diepmsk.b.intknepmis = 1;
|
|
||||||
USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DIEPMSK, diepmsk.d32 );
|
|
||||||
#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED
|
|
||||||
USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DINEP1MSK, diepmsk.d32 );
|
|
||||||
#endif
|
|
||||||
/* Reset Device Address */
|
|
||||||
dcfg.d32 = USB_OTG_READ_REG32( &pdev->regs.DREGS->DCFG);
|
|
||||||
dcfg.b.devaddr = 0;
|
|
||||||
USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DCFG, dcfg.d32);
|
|
||||||
|
|
||||||
|
|
||||||
/* setup EP0 to receive SETUP packets */
|
|
||||||
USB_OTG_EP0_OutStart(pdev);
|
|
||||||
|
|
||||||
/* Clear interrupt */
|
|
||||||
gintsts.d32 = 0;
|
|
||||||
gintsts.b.usbreset = 1;
|
|
||||||
USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GINTSTS, gintsts.d32);
|
|
||||||
|
|
||||||
/*Reset internal state machine */
|
|
||||||
USBD_DCD_INT_fops->Reset(pdev);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief DCD_HandleEnumDone_ISR
|
|
||||||
* Read the device status register and set the device speed
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint32_t DCD_HandleEnumDone_ISR(USB_OTG_CORE_HANDLE *pdev)
|
|
||||||
{
|
|
||||||
USB_OTG_GINTSTS_TypeDef gintsts;
|
|
||||||
USB_OTG_GUSBCFG_TypeDef gusbcfg;
|
|
||||||
|
|
||||||
USB_OTG_EP0Activate(pdev);
|
|
||||||
|
|
||||||
/* Set USB turn-around time based on device speed and PHY interface. */
|
|
||||||
gusbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG);
|
|
||||||
|
|
||||||
/* Full or High speed */
|
|
||||||
if ( USB_OTG_GetDeviceSpeed(pdev) == USB_SPEED_HIGH)
|
|
||||||
{
|
|
||||||
pdev->cfg.speed = USB_OTG_SPEED_HIGH;
|
|
||||||
pdev->cfg.mps = USB_OTG_HS_MAX_PACKET_SIZE ;
|
|
||||||
gusbcfg.b.usbtrdtim = 9;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pdev->cfg.speed = USB_OTG_SPEED_FULL;
|
|
||||||
pdev->cfg.mps = USB_OTG_FS_MAX_PACKET_SIZE ;
|
|
||||||
gusbcfg.b.usbtrdtim = 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GUSBCFG, gusbcfg.d32);
|
|
||||||
|
|
||||||
/* Clear interrupt */
|
|
||||||
gintsts.d32 = 0;
|
|
||||||
gintsts.b.enumdone = 1;
|
|
||||||
USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GINTSTS, gintsts.d32 );
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief DCD_IsoINIncomplete_ISR
|
|
||||||
* handle the ISO IN incomplete interrupt
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint32_t DCD_IsoINIncomplete_ISR(USB_OTG_CORE_HANDLE *pdev)
|
|
||||||
{
|
|
||||||
USB_OTG_GINTSTS_TypeDef gintsts;
|
|
||||||
|
|
||||||
gintsts.d32 = 0;
|
|
||||||
|
|
||||||
USBD_DCD_INT_fops->IsoINIncomplete (pdev);
|
|
||||||
|
|
||||||
/* Clear interrupt */
|
|
||||||
gintsts.b.incomplisoin = 1;
|
|
||||||
USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, gintsts.d32);
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief DCD_IsoOUTIncomplete_ISR
|
|
||||||
* handle the ISO OUT incomplete interrupt
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint32_t DCD_IsoOUTIncomplete_ISR(USB_OTG_CORE_HANDLE *pdev)
|
|
||||||
{
|
|
||||||
USB_OTG_GINTSTS_TypeDef gintsts;
|
|
||||||
|
|
||||||
gintsts.d32 = 0;
|
|
||||||
|
|
||||||
USBD_DCD_INT_fops->IsoOUTIncomplete (pdev);
|
|
||||||
|
|
||||||
/* Clear interrupt */
|
|
||||||
gintsts.b.incomplisoout = 1;
|
|
||||||
USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, gintsts.d32);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief DCD_ReadDevInEP
|
|
||||||
* Reads ep flags
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
static uint32_t DCD_ReadDevInEP (USB_OTG_CORE_HANDLE *pdev, uint8_t epnum)
|
|
||||||
{
|
|
||||||
uint32_t v, msk, emp;
|
|
||||||
msk = USB_OTG_READ_REG32(&pdev->regs.DREGS->DIEPMSK);
|
|
||||||
emp = USB_OTG_READ_REG32(&pdev->regs.DREGS->DIEPEMPMSK);
|
|
||||||
msk |= ((emp >> epnum) & 0x1) << 7;
|
|
||||||
v = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[epnum]->DIEPINT) & msk;
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
@ -1,6 +1 @@
|
|||||||
#SUB_FOLDER += firmware/arch/stm32f4xx/lib
|
|
||||||
#INCLUDES += firmware/arch/stm32f4xx/lib
|
|
||||||
|
|
||||||
include firmware/arch/stm32f4xx/lib/stdperiph/stdperiph.mk
|
include firmware/arch/stm32f4xx/lib/stdperiph/stdperiph.mk
|
||||||
#include firmware/arch/stm32f4xx/lib/STM32_USB_Device_Library/dev_lib.mk
|
|
||||||
#include firmware/arch/stm32f4xx/lib/STM32_USB_OTG_Driver/otg_driver.mk
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
CHECK_FOLDER += firmware/arch/stm32f4xx
|
CHECK_FOLDER += firmware/arch/stm32f4xx
|
||||||
SUB_FOLDER += firmware/arch/stm32f4xx
|
SUB_FOLDER += firmware/arch/stm32f4xx
|
||||||
INCLUDES += firmware/arch/stm32f4xx
|
INCLUDES += firmware/arch/stm32f4xx/include
|
||||||
DOC_SRC += firmware/arch/stm32f4xx
|
DOC_SRC += firmware/arch/stm32f4xx
|
||||||
|
|
||||||
include firmware/arch/stm32f4xx/board/board.mk
|
include firmware/arch/stm32f4xx/board/board.mk
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
CHECK_FOLDER += firmware/kernel/driver
|
CHECK_FOLDER += firmware/kernel/driver
|
||||||
SUB_FOLDER += firmware/kernel/driver
|
SUB_FOLDER += firmware/kernel/driver
|
||||||
INCLUDES += firmware/kernel/driver
|
INCLUDES += firmware/kernel/driver/include
|
||||||
DOC_SRC += firmware/kernel/driver
|
DOC_SRC += firmware/kernel/driver
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
CHECK_FOLDER += firmware/kernel
|
CHECK_FOLDER += firmware/kernel
|
||||||
SUB_FOLDER += firmware/kernel
|
SUB_FOLDER += firmware/kernel
|
||||||
INCLUDES += firmware/kernel
|
INCLUDES += firmware/kernel/include
|
||||||
DOC_SRC += firmware/kernel
|
DOC_SRC += firmware/kernel
|
||||||
|
|
||||||
include firmware/kernel/driver/driver.mk
|
include firmware/kernel/driver/driver.mk
|
||||||
|
Loading…
Reference in New Issue
Block a user