Martin Vladic
2 years ago
101 changed files with 36151 additions and 11028 deletions
File diff suppressed because one or more lines are too long
@ -1,3 +1,27 @@
|
||||
{ |
||||
"makefile.extensionOutputFolder": "./.vscode" |
||||
"makefile.extensionOutputFolder": "./.vscode", |
||||
"files.associations": { |
||||
"xmemory": "cpp", |
||||
"bit": "c", |
||||
"charconv": "c", |
||||
"chrono": "c", |
||||
"compare": "c", |
||||
"cstddef": "c", |
||||
"filesystem": "c", |
||||
"format": "c", |
||||
"iterator": "c", |
||||
"limits": "c", |
||||
"memory": "c", |
||||
"sstream": "c", |
||||
"system_error": "c", |
||||
"type_traits": "c", |
||||
"vector": "c", |
||||
"xiosbase": "c", |
||||
"xlocale": "c", |
||||
"xlocbuf": "c", |
||||
"xlocmon": "c", |
||||
"xloctime": "c", |
||||
"xtree": "c", |
||||
"xutility": "c" |
||||
} |
||||
} |
@ -1,4 +1,2 @@
|
||||
void My_SystemClock_Config(void); |
||||
|
||||
void MY_LCD_Init(); |
||||
void MY_LCD_Tick(); |
||||
|
@ -1,53 +0,0 @@
|
||||
/**
|
||||
****************************************************************************** |
||||
* @file LCD_DSI/LCD_DSI_VideoMode_DoubleBuffering/Src/stm32f4xx_hal_msp.c |
||||
* @author MCD Application Team |
||||
* @brief HAL MSP module. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* Copyright (c) 2017 STMicroelectronics. |
||||
* All rights reserved. |
||||
* |
||||
* This software is licensed under terms that can be found in the LICENSE file |
||||
* in the root directory of this software component. |
||||
* If no LICENSE file comes with this software, it is provided AS-IS. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "main.h" |
||||
|
||||
/** @addtogroup STM32F4xx_HAL_Examples
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup HAL_MSP
|
||||
* @brief HAL MSP module. |
||||
* @{ |
||||
*/ |
||||
|
||||
/* Private typedef -----------------------------------------------------------*/ |
||||
/* Private define ------------------------------------------------------------*/ |
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
/* Private functions ---------------------------------------------------------*/ |
||||
|
||||
/** @defgroup HAL_MSP_Private_Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
@ -1,166 +0,0 @@
|
||||
/**
|
||||
****************************************************************************** |
||||
* @file LCD_DSI/LCD_DSI_VideoMode_DoubleBuffering/Src/stm32f4xx_it.c
|
||||
* @author MCD Application Team |
||||
* @brief Main Interrupt Service Routines. |
||||
* This file provides template for all exceptions handler and |
||||
* peripherals interrupt service routine. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* Copyright (c) 2017 STMicroelectronics. |
||||
* All rights reserved. |
||||
* |
||||
* This software is licensed under terms that can be found in the LICENSE file |
||||
* in the root directory of this software component. |
||||
* If no LICENSE file comes with this software, it is provided AS-IS. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "main.h" |
||||
#include "stm32f4xx_it.h" |
||||
|
||||
/** @addtogroup STM32F4xx_HAL_Examples
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @addtogroup LCD_DSI_Video_OneLayer
|
||||
* @{ |
||||
*/ |
||||
|
||||
/* Private typedef -----------------------------------------------------------*/ |
||||
extern LTDC_HandleTypeDef hltdc_eval;
|
||||
/* Private define ------------------------------------------------------------*/ |
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
/* Private functions ---------------------------------------------------------*/ |
||||
|
||||
/******************************************************************************/ |
||||
/* Cortex-M4 Processor Exceptions Handlers */ |
||||
/******************************************************************************/ |
||||
|
||||
/**
|
||||
* @brief This function handles NMI exception. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void NMI_Handler(void) |
||||
{ |
||||
} |
||||
|
||||
/**
|
||||
* @brief This function handles Hard Fault exception. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void HardFault_Handler(void) |
||||
{ |
||||
/* Go to infinite loop when Hard Fault exception occurs */ |
||||
while (1) |
||||
{ |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief This function handles Memory Manage exception. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void MemManage_Handler(void) |
||||
{ |
||||
/* Go to infinite loop when Memory Manage exception occurs */ |
||||
while (1) |
||||
{ |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief This function handles Bus Fault exception. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void BusFault_Handler(void) |
||||
{ |
||||
/* Go to infinite loop when Bus Fault exception occurs */ |
||||
while (1) |
||||
{ |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief This function handles Usage Fault exception. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void UsageFault_Handler(void) |
||||
{ |
||||
/* Go to infinite loop when Usage Fault exception occurs */ |
||||
while (1) |
||||
{ |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief This function handles SVCall exception. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void SVC_Handler(void) |
||||
{ |
||||
} |
||||
|
||||
/**
|
||||
* @brief This function handles Debug Monitor exception. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void DebugMon_Handler(void) |
||||
{ |
||||
} |
||||
|
||||
/**
|
||||
* @brief This function handles PendSVC exception. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void PendSV_Handler(void) |
||||
{ |
||||
} |
||||
|
||||
/**
|
||||
* @brief This function handles SysTick Handler. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void SysTick_Handler(void) |
||||
{ |
||||
HAL_IncTick(); |
||||
} |
||||
|
||||
/******************************************************************************/ |
||||
/* STM32F4xx Peripherals Interrupt Handlers */ |
||||
/* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */ |
||||
/* available peripheral interrupt handler's name please refer to the startup */ |
||||
/* file (startup_stm32f4xx.s). */ |
||||
/******************************************************************************/ |
||||
|
||||
/**
|
||||
* @brief This function handles LTDC interrupt request. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void LTDC_IRQHandler(void) |
||||
{ |
||||
HAL_LTDC_IRQHandler(&hltdc_eval); |
||||
} |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
@ -1,433 +0,0 @@
|
||||
/**
|
||||
****************************************************************************** |
||||
* @file system_stm32f4xx.c |
||||
* @author MCD Application Team |
||||
* @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File. |
||||
* |
||||
* This file provides two functions and one global variable to be called from
|
||||
* user application: |
||||
* - SystemInit(): This function is called at startup just after reset and
|
||||
* before branch to main program. This call is made inside |
||||
* the "startup_stm32f4xx.s" file. |
||||
* |
||||
* - SystemCoreClock variable: Contains the core clock (HCLK), it can be used |
||||
* by the user application to setup the SysTick
|
||||
* timer or configure other parameters. |
||||
*
|
||||
* - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must |
||||
* be called whenever the core clock is changed |
||||
* during program execution. |
||||
* |
||||
* |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* Copyright (c) 2017 STMicroelectronics. |
||||
* All rights reserved. |
||||
* |
||||
* This software is licensed under terms that can be found in the LICENSE file |
||||
* in the root directory of this software component. |
||||
* If no LICENSE file comes with this software, it is provided AS-IS. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/** @addtogroup CMSIS
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @addtogroup stm32f4xx_system
|
||||
* @{ |
||||
*/
|
||||
|
||||
/** @addtogroup STM32F4xx_System_Private_Includes
|
||||
* @{ |
||||
*/ |
||||
|
||||
|
||||
#include "stm32f4xx.h" |
||||
|
||||
#if !defined (HSE_VALUE) |
||||
#if defined(USE_STM32469I_DISCO_REVA) |
||||
#define HSE_VALUE ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */ |
||||
#else |
||||
#define HSE_VALUE ((uint32_t)8000000) /*!< Default value of the External oscillator in Hz */ |
||||
#endif /* USE_STM32469I_DISCO_REVA */ |
||||
#endif /* HSE_VALUE */ |
||||
|
||||
#if !defined (HSI_VALUE) |
||||
#define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ |
||||
#endif /* HSI_VALUE */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @addtogroup STM32F4xx_System_Private_TypesDefinitions
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @addtogroup STM32F4xx_System_Private_Defines
|
||||
* @{ |
||||
*/ |
||||
|
||||
/************************* Miscellaneous Configuration ************************/ |
||||
/*!< Uncomment the following line if you need to use external SDRAM mounted
|
||||
on DK as data memory */ |
||||
/* #define DATA_IN_ExtSDRAM */ |
||||
|
||||
/*!< Uncomment the following line if you need to relocate your vector Table in
|
||||
Internal SRAM. */ |
||||
/* #define VECT_TAB_SRAM */ |
||||
#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. |
||||
This value must be a multiple of 0x200. */ |
||||
/******************************************************************************/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @addtogroup STM32F4xx_System_Private_Macros
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @addtogroup STM32F4xx_System_Private_Variables
|
||||
* @{ |
||||
*/ |
||||
/* This variable is updated in three ways:
|
||||
1) by calling CMSIS function SystemCoreClockUpdate() |
||||
2) by calling HAL API function HAL_RCC_GetHCLKFreq() |
||||
3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency
|
||||
Note: If you use this function to configure the system clock; then there |
||||
is no need to call the 2 first functions listed above, since SystemCoreClock |
||||
variable is updated automatically. |
||||
*/ |
||||
uint32_t SystemCoreClock = 16000000; |
||||
const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; |
||||
const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes
|
||||
* @{ |
||||
*/ |
||||
|
||||
#if defined (DATA_IN_ExtSDRAM) |
||||
static void SystemInit_ExtMemCtl(void);
|
||||
#endif /* DATA_IN_ExtSDRAM */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @addtogroup STM32F4xx_System_Private_Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Setup the microcontroller system |
||||
* Initialize the FPU setting, vector table location and External memory
|
||||
* configuration. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void SystemInit(void) |
||||
{ |
||||
/* FPU settings ------------------------------------------------------------*/ |
||||
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) |
||||
SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ |
||||
#endif |
||||
/* Reset the RCC clock configuration to the default reset state ------------*/ |
||||
/* Set HSION bit */ |
||||
RCC->CR |= (uint32_t)0x00000001; |
||||
|
||||
/* Reset CFGR register */ |
||||
RCC->CFGR = 0x00000000; |
||||
|
||||
/* Reset HSEON, CSSON and PLLON bits */ |
||||
RCC->CR &= (uint32_t)0xFEF6FFFF; |
||||
|
||||
/* Reset PLLCFGR register */ |
||||
RCC->PLLCFGR = 0x24003010; |
||||
|
||||
/* Reset HSEBYP bit */ |
||||
RCC->CR &= (uint32_t)0xFFFBFFFF; |
||||
|
||||
/* Disable all interrupts */ |
||||
RCC->CIR = 0x00000000; |
||||
|
||||
#if defined (DATA_IN_ExtSDRAM) |
||||
SystemInit_ExtMemCtl();
|
||||
#endif /* DATA_IN_ExtSDRAM */ |
||||
|
||||
/* Configure the Vector Table location add offset address ------------------*/ |
||||
#ifdef VECT_TAB_SRAM |
||||
SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ |
||||
#else |
||||
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ |
||||
#endif |
||||
} |
||||
|
||||
/**
|
||||
* @brief Update SystemCoreClock variable according to Clock Register Values. |
||||
* The SystemCoreClock variable contains the core clock (HCLK), it can |
||||
* be used by the user application to setup the SysTick timer or configure |
||||
* other parameters. |
||||
*
|
||||
* @note Each time the core clock (HCLK) changes, this function must be called |
||||
* to update SystemCoreClock variable value. Otherwise, any configuration |
||||
* based on this variable will be incorrect.
|
||||
*
|
||||
* @note - The system frequency computed by this function is not the real
|
||||
* frequency in the chip. It is calculated based on the predefined
|
||||
* constant and the selected clock source: |
||||
*
|
||||
* - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) |
||||
*
|
||||
* - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) |
||||
*
|
||||
* - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**)
|
||||
* or HSI_VALUE(*) multiplied/divided by the PLL factors. |
||||
*
|
||||
* (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value |
||||
* 16 MHz) but the real value may vary depending on the variations |
||||
* in voltage and temperature.
|
||||
*
|
||||
* (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (its value |
||||
* depends on the application requirements), user has to ensure that HSE_VALUE |
||||
* is same as the real frequency of the crystal used. Otherwise, this function |
||||
* may have wrong result. |
||||
*
|
||||
* - The result of this function could be not correct when using fractional |
||||
* value for HSE crystal. |
||||
*
|
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void SystemCoreClockUpdate(void) |
||||
{ |
||||
uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2; |
||||
|
||||
/* Get SYSCLK source -------------------------------------------------------*/ |
||||
tmp = RCC->CFGR & RCC_CFGR_SWS; |
||||
|
||||
switch (tmp) |
||||
{ |
||||
case 0x00: /* HSI used as system clock source */ |
||||
SystemCoreClock = HSI_VALUE; |
||||
break; |
||||
case 0x04: /* HSE used as system clock source */ |
||||
SystemCoreClock = HSE_VALUE; |
||||
break; |
||||
case 0x08: /* PLL used as system clock source */ |
||||
|
||||
/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N
|
||||
SYSCLK = PLL_VCO / PLL_P |
||||
*/
|
||||
pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22; |
||||
pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; |
||||
|
||||
if (pllsource != 0) |
||||
{ |
||||
/* HSE used as PLL clock source */ |
||||
pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); |
||||
} |
||||
else |
||||
{ |
||||
/* HSI used as PLL clock source */ |
||||
pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); |
||||
} |
||||
|
||||
pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2; |
||||
SystemCoreClock = pllvco/pllp; |
||||
break; |
||||
default: |
||||
SystemCoreClock = HSI_VALUE; |
||||
break; |
||||
} |
||||
/* Compute HCLK frequency --------------------------------------------------*/ |
||||
/* Get HCLK prescaler */ |
||||
tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; |
||||
/* HCLK frequency */ |
||||
SystemCoreClock >>= tmp; |
||||
} |
||||
|
||||
#if defined (DATA_IN_ExtSDRAM) |
||||
/**
|
||||
* @brief Setup the external memory controller. |
||||
* Called in startup_stm32f4xx.s before jump to main. |
||||
* This function configures the external memories (SRAM/SDRAM) |
||||
* This SRAM/SDRAM will be used as program data memory (including heap and stack). |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void SystemInit_ExtMemCtl(void) |
||||
{ |
||||
register uint32_t tmpreg = 0, timeout = 0xFFFF; |
||||
register __IO uint32_t index; |
||||
|
||||
/* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH, and GPIOI interface
|
||||
clock */ |
||||
RCC->AHB1ENR |= 0x000001FC; |
||||
|
||||
/* Connect PCx pins to FMC Alternate function */ |
||||
GPIOC->AFR[0] = 0x0000000C; |
||||
GPIOC->AFR[1] = 0x00000000; |
||||
/* Configure PCx pins in Alternate function mode */
|
||||
GPIOC->MODER = 0x00000002; |
||||
/* Configure PCx pins speed to 100 MHz */ |
||||
GPIOC->OSPEEDR = 0x00000003; |
||||
/* Configure PCx pins Output type to push-pull */ |
||||
GPIOC->OTYPER = 0x00000000; |
||||
/* No pull-up, pull-down for PCx pins */
|
||||
GPIOC->PUPDR = 0x00000000; |
||||
|
||||
/* Connect PDx pins to FMC Alternate function */ |
||||
GPIOD->AFR[0] = 0x000000CC; |
||||
GPIOD->AFR[1] = 0xCC000CCC; |
||||
/* Configure PDx pins in Alternate function mode */
|
||||
GPIOD->MODER = 0xA02A000A; |
||||
/* Configure PDx pins speed to 100 MHz */ |
||||
GPIOD->OSPEEDR = 0xF03F000F; |
||||
/* Configure PDx pins Output type to push-pull */ |
||||
GPIOD->OTYPER = 0x00000000; |
||||
/* No pull-up, pull-down for PDx pins */
|
||||
GPIOD->PUPDR = 0x00000000; |
||||
|
||||
/* Connect PEx pins to FMC Alternate function */ |
||||
GPIOE->AFR[0] = 0xC00000CC; |
||||
GPIOE->AFR[1] = 0xCCCCCCCC; |
||||
/* Configure PEx pins in Alternate function mode */
|
||||
GPIOE->MODER = 0xAAAA800A; |
||||
/* Configure PEx pins speed to 100 MHz */ |
||||
GPIOE->OSPEEDR = 0xFFFFC00F; |
||||
/* Configure PEx pins Output type to push-pull */ |
||||
GPIOE->OTYPER = 0x00000000; |
||||
/* No pull-up, pull-down for PEx pins */
|
||||
GPIOE->PUPDR = 0x00000000; |
||||
|
||||
/* Connect PFx pins to FMC Alternate function */ |
||||
GPIOF->AFR[0] = 0x00CCCCCC; |
||||
GPIOF->AFR[1] = 0xCCCCC000; |
||||
/* Configure PFx pins in Alternate function mode */
|
||||
GPIOF->MODER = 0xAA800AAA; |
||||
/* Configure PFx pins speed to 100 MHz */ |
||||
GPIOF->OSPEEDR = 0xFFC00FFF; |
||||
/* Configure PFx pins Output type to push-pull */ |
||||
GPIOF->OTYPER = 0x00000000; |
||||
/* No pull-up, pull-down for PFx pins */
|
||||
GPIOF->PUPDR = 0x00000000; |
||||
|
||||
/* Connect PGx pins to FMC Alternate function */ |
||||
GPIOG->AFR[0] = 0x00CC00CC; |
||||
GPIOG->AFR[1] = 0xC000000C; |
||||
/* Configure PGx pins in Alternate function mode */
|
||||
GPIOG->MODER = 0x80020A0A; |
||||
/* Configure PGx pins speed to 100 MHz */ |
||||
GPIOG->OSPEEDR = 0xC0030F0F; |
||||
/* Configure PGx pins Output type to push-pull */ |
||||
GPIOG->OTYPER = 0x00000000; |
||||
/* No pull-up, pull-down for PGx pins */
|
||||
GPIOG->PUPDR = 0x00000000; |
||||
|
||||
/* Connect PHx pins to FMC Alternate function */ |
||||
GPIOH->AFR[0] = 0x0000CC00; |
||||
GPIOH->AFR[1] = 0xCCCCCCCC; |
||||
/* Configure PHx pins in Alternate function mode */
|
||||
GPIOH->MODER = 0xAAAA00A0; |
||||
/* Configure PHx pins speed to 100 MHz */ |
||||
GPIOH->OSPEEDR = 0xFFFF00F0; |
||||
/* Configure PHx pins Output type to push-pull */ |
||||
GPIOH->OTYPER = 0x00000000; |
||||
/* No pull-up, pull-down for PHx pins */
|
||||
GPIOH->PUPDR = 0x00000000; |
||||
|
||||
/* Connect PIx pins to FMC Alternate function */ |
||||
GPIOI->AFR[0] = 0xCCCCCCCC; |
||||
GPIOI->AFR[1] = 0x00000CC0; |
||||
/* Configure PIx pins in Alternate function mode */
|
||||
GPIOI->MODER = 0x0028AAAA; |
||||
/* Configure PIx pins speed to 100 MHz */ |
||||
GPIOI->OSPEEDR = 0x003CFFFF; |
||||
/* Configure PIx pins Output type to push-pull */ |
||||
GPIOI->OTYPER = 0x00000000; |
||||
/* No pull-up, pull-down for PIx pins */
|
||||
GPIOI->PUPDR = 0x00000000; |
||||
|
||||
/* FMC Configuration */ |
||||
/* Enable the FMC interface clock */ |
||||
RCC->AHB3ENR |= 0x00000001; |
||||
|
||||
/* Configure and enable SDRAM bank2 */ |
||||
FMC_Bank5_6->SDCR[0] = 0x000019E4; |
||||
FMC_Bank5_6->SDTR[0] = 0x01115351; |
||||
|
||||
/* SDRAM initialization sequence */ |
||||
/* Clock enable command */ |
||||
FMC_Bank5_6->SDCMR = 0x00000011;
|
||||
tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
|
||||
while((tmpreg != 0) && (timeout-- > 0)) |
||||
{ |
||||
tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
|
||||
} |
||||
|
||||
/* Delay */ |
||||
for (index = 0; index<1000; index++); |
||||
|
||||
/* PALL command */ |
||||
FMC_Bank5_6->SDCMR = 0x00000012;
|
||||
tmpreg = FMC_Bank5_6->SDSR & 0x00000020; |
||||
timeout = 0xFFFF; |
||||
while((tmpreg != 0) && (timeout-- > 0)) |
||||
{ |
||||
tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
|
||||
} |
||||
|
||||
/* Auto refresh command */ |
||||
FMC_Bank5_6->SDCMR = 0x000000F3; |
||||
tmpreg = FMC_Bank5_6->SDSR & 0x00000020; |
||||
timeout = 0xFFFF; |
||||
while((tmpreg != 0) && (timeout-- > 0)) |
||||
{ |
||||
tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
|
||||
} |
||||
|
||||
/* MRD register program */ |
||||
FMC_Bank5_6->SDCMR = 0x00046014; |
||||
tmpreg = FMC_Bank5_6->SDSR & 0x00000020; |
||||
timeout = 0xFFFF; |
||||
while((tmpreg != 0) && (timeout-- > 0)) |
||||
{ |
||||
tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
|
||||
}
|
||||
|
||||
/* Set refresh count */ |
||||
tmpreg = FMC_Bank5_6->SDRTR; |
||||
FMC_Bank5_6->SDRTR = (tmpreg | (0x0000056A<<1)); |
||||
|
||||
/* Disable write protection */ |
||||
tmpreg = FMC_Bank5_6->SDCR[0];
|
||||
FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF); |
||||
} |
||||
#endif /* DATA_IN_ExtSDRAM */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
@ -1,316 +0,0 @@
|
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm32f4xx_hal_hcd.h |
||||
* @author MCD Application Team |
||||
* @brief Header file of HCD HAL module. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* Copyright (c) 2016 STMicroelectronics. |
||||
* All rights reserved. |
||||
* |
||||
* This software is licensed under terms that can be found in the LICENSE file |
||||
* in the root directory of this software component. |
||||
* If no LICENSE file comes with this software, it is provided AS-IS. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef STM32F4xx_HAL_HCD_H |
||||
#define STM32F4xx_HAL_HCD_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm32f4xx_ll_usb.h" |
||||
|
||||
#if defined (USB_OTG_FS) || defined (USB_OTG_HS) |
||||
/** @addtogroup STM32F4xx_HAL_Driver
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @addtogroup HCD HCD
|
||||
* @{ |
||||
*/ |
||||
|
||||
/* Exported types ------------------------------------------------------------*/ |
||||
/** @defgroup HCD_Exported_Types HCD Exported Types
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup HCD_Exported_Types_Group1 HCD State Structure definition
|
||||
* @{ |
||||
*/ |
||||
typedef enum |
||||
{ |
||||
HAL_HCD_STATE_RESET = 0x00, |
||||
HAL_HCD_STATE_READY = 0x01, |
||||
HAL_HCD_STATE_ERROR = 0x02, |
||||
HAL_HCD_STATE_BUSY = 0x03, |
||||
HAL_HCD_STATE_TIMEOUT = 0x04 |
||||
} HCD_StateTypeDef; |
||||
|
||||
typedef USB_OTG_GlobalTypeDef HCD_TypeDef; |
||||
typedef USB_OTG_CfgTypeDef HCD_InitTypeDef; |
||||
typedef USB_OTG_HCTypeDef HCD_HCTypeDef; |
||||
typedef USB_OTG_URBStateTypeDef HCD_URBStateTypeDef; |
||||
typedef USB_OTG_HCStateTypeDef HCD_HCStateTypeDef; |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup HCD_Exported_Types_Group2 HCD Handle Structure definition
|
||||
* @{ |
||||
*/ |
||||
#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U) |
||||
typedef struct __HCD_HandleTypeDef |
||||
#else |
||||
typedef struct |
||||
#endif /* USE_HAL_HCD_REGISTER_CALLBACKS */ |
||||
{ |
||||
HCD_TypeDef *Instance; /*!< Register base address */ |
||||
HCD_InitTypeDef Init; /*!< HCD required parameters */ |
||||
HCD_HCTypeDef hc[16]; /*!< Host channels parameters */ |
||||
HAL_LockTypeDef Lock; /*!< HCD peripheral status */ |
||||
__IO HCD_StateTypeDef State; /*!< HCD communication state */ |
||||
__IO uint32_t ErrorCode; /*!< HCD Error code */ |
||||
void *pData; /*!< Pointer Stack Handler */ |
||||
#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U) |
||||
void (* SOFCallback)(struct __HCD_HandleTypeDef *hhcd); /*!< USB OTG HCD SOF callback */ |
||||
void (* ConnectCallback)(struct __HCD_HandleTypeDef *hhcd); /*!< USB OTG HCD Connect callback */ |
||||
void (* DisconnectCallback)(struct __HCD_HandleTypeDef *hhcd); /*!< USB OTG HCD Disconnect callback */ |
||||
void (* PortEnabledCallback)(struct __HCD_HandleTypeDef *hhcd); /*!< USB OTG HCD Port Enable callback */ |
||||
void (* PortDisabledCallback)(struct __HCD_HandleTypeDef *hhcd); /*!< USB OTG HCD Port Disable callback */ |
||||
void (* HC_NotifyURBChangeCallback)(struct __HCD_HandleTypeDef *hhcd, uint8_t chnum, |
||||
HCD_URBStateTypeDef urb_state); /*!< USB OTG HCD Host Channel Notify URB Change callback */ |
||||
|
||||
void (* MspInitCallback)(struct __HCD_HandleTypeDef *hhcd); /*!< USB OTG HCD Msp Init callback */ |
||||
void (* MspDeInitCallback)(struct __HCD_HandleTypeDef *hhcd); /*!< USB OTG HCD Msp DeInit callback */ |
||||
#endif /* USE_HAL_HCD_REGISTER_CALLBACKS */ |
||||
} HCD_HandleTypeDef; |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported constants --------------------------------------------------------*/ |
||||
/** @defgroup HCD_Exported_Constants HCD Exported Constants
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup HCD_Speed HCD Speed
|
||||
* @{ |
||||
*/ |
||||
#define HCD_SPEED_HIGH USBH_HS_SPEED |
||||
#define HCD_SPEED_FULL USBH_FSLS_SPEED |
||||
#define HCD_SPEED_LOW USBH_FSLS_SPEED |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup HCD_Device_Speed HCD Device Speed
|
||||
* @{ |
||||
*/ |
||||
#define HCD_DEVICE_SPEED_HIGH 0U |
||||
#define HCD_DEVICE_SPEED_FULL 1U |
||||
#define HCD_DEVICE_SPEED_LOW 2U |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup HCD_PHY_Module HCD PHY Module
|
||||
* @{ |
||||
*/ |
||||
#define HCD_PHY_ULPI 1U |
||||
#define HCD_PHY_EMBEDDED 2U |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup HCD_Error_Code_definition HCD Error Code definition
|
||||
* @brief HCD Error Code definition |
||||
* @{ |
||||
*/ |
||||
#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U) |
||||
#define HAL_HCD_ERROR_INVALID_CALLBACK (0x00000010U) /*!< Invalid Callback error */ |
||||
#endif /* USE_HAL_HCD_REGISTER_CALLBACKS */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported macro ------------------------------------------------------------*/ |
||||
/** @defgroup HCD_Exported_Macros HCD Exported Macros
|
||||
* @brief macros to handle interrupts and specific clock configurations |
||||
* @{ |
||||
*/ |
||||
#define __HAL_HCD_ENABLE(__HANDLE__) (void)USB_EnableGlobalInt ((__HANDLE__)->Instance) |
||||
#define __HAL_HCD_DISABLE(__HANDLE__) (void)USB_DisableGlobalInt ((__HANDLE__)->Instance) |
||||
|
||||
#define __HAL_HCD_GET_FLAG(__HANDLE__, __INTERRUPT__) ((USB_ReadInterrupts((__HANDLE__)->Instance)\ |
||||
& (__INTERRUPT__)) == (__INTERRUPT__)) |
||||
#define __HAL_HCD_CLEAR_FLAG(__HANDLE__, __INTERRUPT__) (((__HANDLE__)->Instance->GINTSTS) = (__INTERRUPT__)) |
||||
#define __HAL_HCD_IS_INVALID_INTERRUPT(__HANDLE__) (USB_ReadInterrupts((__HANDLE__)->Instance) == 0U) |
||||
|
||||
#define __HAL_HCD_CLEAR_HC_INT(chnum, __INTERRUPT__) (USBx_HC(chnum)->HCINT = (__INTERRUPT__)) |
||||
#define __HAL_HCD_MASK_HALT_HC_INT(chnum) (USBx_HC(chnum)->HCINTMSK &= ~USB_OTG_HCINTMSK_CHHM) |
||||
#define __HAL_HCD_UNMASK_HALT_HC_INT(chnum) (USBx_HC(chnum)->HCINTMSK |= USB_OTG_HCINTMSK_CHHM) |
||||
#define __HAL_HCD_MASK_ACK_HC_INT(chnum) (USBx_HC(chnum)->HCINTMSK &= ~USB_OTG_HCINTMSK_ACKM) |
||||
#define __HAL_HCD_UNMASK_ACK_HC_INT(chnum) (USBx_HC(chnum)->HCINTMSK |= USB_OTG_HCINTMSK_ACKM) |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported functions --------------------------------------------------------*/ |
||||
/** @addtogroup HCD_Exported_Functions HCD Exported Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup HCD_Exported_Functions_Group1 Initialization and de-initialization functions
|
||||
* @{ |
||||
*/ |
||||
HAL_StatusTypeDef HAL_HCD_Init(HCD_HandleTypeDef *hhcd); |
||||
HAL_StatusTypeDef HAL_HCD_DeInit(HCD_HandleTypeDef *hhcd); |
||||
HAL_StatusTypeDef HAL_HCD_HC_Init(HCD_HandleTypeDef *hhcd, uint8_t ch_num, |
||||
uint8_t epnum, uint8_t dev_address, |
||||
uint8_t speed, uint8_t ep_type, uint16_t mps); |
||||
|
||||
HAL_StatusTypeDef HAL_HCD_HC_Halt(HCD_HandleTypeDef *hhcd, uint8_t ch_num); |
||||
void HAL_HCD_MspInit(HCD_HandleTypeDef *hhcd); |
||||
void HAL_HCD_MspDeInit(HCD_HandleTypeDef *hhcd); |
||||
|
||||
#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U) |
||||
/** @defgroup HAL_HCD_Callback_ID_enumeration_definition HAL USB OTG HCD Callback ID enumeration definition
|
||||
* @brief HAL USB OTG HCD Callback ID enumeration definition |
||||
* @{ |
||||
*/ |
||||
typedef enum |
||||
{ |
||||
HAL_HCD_SOF_CB_ID = 0x01, /*!< USB HCD SOF callback ID */ |
||||
HAL_HCD_CONNECT_CB_ID = 0x02, /*!< USB HCD Connect callback ID */ |
||||
HAL_HCD_DISCONNECT_CB_ID = 0x03, /*!< USB HCD Disconnect callback ID */ |
||||
HAL_HCD_PORT_ENABLED_CB_ID = 0x04, /*!< USB HCD Port Enable callback ID */ |
||||
HAL_HCD_PORT_DISABLED_CB_ID = 0x05, /*!< USB HCD Port Disable callback ID */ |
||||
|
||||
HAL_HCD_MSPINIT_CB_ID = 0x06, /*!< USB HCD MspInit callback ID */ |
||||
HAL_HCD_MSPDEINIT_CB_ID = 0x07 /*!< USB HCD MspDeInit callback ID */ |
||||
|
||||
} HAL_HCD_CallbackIDTypeDef; |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup HAL_HCD_Callback_pointer_definition HAL USB OTG HCD Callback pointer definition
|
||||
* @brief HAL USB OTG HCD Callback pointer definition |
||||
* @{ |
||||
*/ |
||||
|
||||
typedef void (*pHCD_CallbackTypeDef)(HCD_HandleTypeDef *hhcd); /*!< pointer to a common USB OTG HCD callback function */ |
||||
typedef void (*pHCD_HC_NotifyURBChangeCallbackTypeDef)(HCD_HandleTypeDef *hhcd, |
||||
uint8_t epnum, |
||||
HCD_URBStateTypeDef urb_state); /*!< pointer to USB OTG HCD host channel callback */ |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
HAL_StatusTypeDef HAL_HCD_RegisterCallback(HCD_HandleTypeDef *hhcd, |
||||
HAL_HCD_CallbackIDTypeDef CallbackID, |
||||
pHCD_CallbackTypeDef pCallback); |
||||
|
||||
HAL_StatusTypeDef HAL_HCD_UnRegisterCallback(HCD_HandleTypeDef *hhcd, |
||||
HAL_HCD_CallbackIDTypeDef CallbackID); |
||||
|
||||
HAL_StatusTypeDef HAL_HCD_RegisterHC_NotifyURBChangeCallback(HCD_HandleTypeDef *hhcd, |
||||
pHCD_HC_NotifyURBChangeCallbackTypeDef pCallback); |
||||
|
||||
HAL_StatusTypeDef HAL_HCD_UnRegisterHC_NotifyURBChangeCallback(HCD_HandleTypeDef *hhcd); |
||||
#endif /* USE_HAL_HCD_REGISTER_CALLBACKS */ |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* I/O operation functions ***************************************************/ |
||||
/** @addtogroup HCD_Exported_Functions_Group2 Input and Output operation functions
|
||||
* @{ |
||||
*/ |
||||
HAL_StatusTypeDef HAL_HCD_HC_SubmitRequest(HCD_HandleTypeDef *hhcd, uint8_t ch_num, |
||||
uint8_t direction, uint8_t ep_type, |
||||
uint8_t token, uint8_t *pbuff, |
||||
uint16_t length, uint8_t do_ping); |
||||
|
||||
/* Non-Blocking mode: Interrupt */ |
||||
void HAL_HCD_IRQHandler(HCD_HandleTypeDef *hhcd); |
||||
void HAL_HCD_WKUP_IRQHandler(HCD_HandleTypeDef *hhcd); |
||||
void HAL_HCD_SOF_Callback(HCD_HandleTypeDef *hhcd); |
||||
void HAL_HCD_Connect_Callback(HCD_HandleTypeDef *hhcd); |
||||
void HAL_HCD_Disconnect_Callback(HCD_HandleTypeDef *hhcd); |
||||
void HAL_HCD_PortEnabled_Callback(HCD_HandleTypeDef *hhcd); |
||||
void HAL_HCD_PortDisabled_Callback(HCD_HandleTypeDef *hhcd); |
||||
void HAL_HCD_HC_NotifyURBChange_Callback(HCD_HandleTypeDef *hhcd, uint8_t chnum, |
||||
HCD_URBStateTypeDef urb_state); |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Peripheral Control functions **********************************************/ |
||||
/** @addtogroup HCD_Exported_Functions_Group3 Peripheral Control functions
|
||||
* @{ |
||||
*/ |
||||
HAL_StatusTypeDef HAL_HCD_ResetPort(HCD_HandleTypeDef *hhcd); |
||||
HAL_StatusTypeDef HAL_HCD_Start(HCD_HandleTypeDef *hhcd); |
||||
HAL_StatusTypeDef HAL_HCD_Stop(HCD_HandleTypeDef *hhcd); |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Peripheral State functions ************************************************/ |
||||
/** @addtogroup HCD_Exported_Functions_Group4 Peripheral State functions
|
||||
* @{ |
||||
*/ |
||||
HCD_StateTypeDef HAL_HCD_GetState(HCD_HandleTypeDef *hhcd); |
||||
HCD_URBStateTypeDef HAL_HCD_HC_GetURBState(HCD_HandleTypeDef *hhcd, uint8_t chnum); |
||||
HCD_HCStateTypeDef HAL_HCD_HC_GetState(HCD_HandleTypeDef *hhcd, uint8_t chnum); |
||||
uint32_t HAL_HCD_HC_GetXferCount(HCD_HandleTypeDef *hhcd, uint8_t chnum); |
||||
uint32_t HAL_HCD_GetCurrentFrame(HCD_HandleTypeDef *hhcd); |
||||
uint32_t HAL_HCD_GetCurrentSpeed(HCD_HandleTypeDef *hhcd); |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Private macros ------------------------------------------------------------*/ |
||||
/** @defgroup HCD_Private_Macros HCD Private Macros
|
||||
* @{ |
||||
*/ |
||||
/**
|
||||
* @} |
||||
*/ |
||||
/* Private functions prototypes ----------------------------------------------*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
/**
|
||||
* @} |
||||
*/ |
||||
#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* STM32F4xx_HAL_HCD_H */ |
@ -0,0 +1,459 @@
|
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm32f4xx_hal_pcd.h |
||||
* @author MCD Application Team |
||||
* @brief Header file of PCD HAL module. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* Copyright (c) 2016 STMicroelectronics. |
||||
* All rights reserved. |
||||
* |
||||
* This software is licensed under terms that can be found in the LICENSE file |
||||
* in the root directory of this software component. |
||||
* If no LICENSE file comes with this software, it is provided AS-IS. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef STM32F4xx_HAL_PCD_H |
||||
#define STM32F4xx_HAL_PCD_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm32f4xx_ll_usb.h" |
||||
|
||||
#if defined (USB_OTG_FS) || defined (USB_OTG_HS) |
||||
|
||||
/** @addtogroup STM32F4xx_HAL_Driver
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @addtogroup PCD
|
||||
* @{ |
||||
*/ |
||||
|
||||
/* Exported types ------------------------------------------------------------*/ |
||||
/** @defgroup PCD_Exported_Types PCD Exported Types
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief PCD State structure definition |
||||
*/ |
||||
typedef enum |
||||
{ |
||||
HAL_PCD_STATE_RESET = 0x00, |
||||
HAL_PCD_STATE_READY = 0x01, |
||||
HAL_PCD_STATE_ERROR = 0x02, |
||||
HAL_PCD_STATE_BUSY = 0x03, |
||||
HAL_PCD_STATE_TIMEOUT = 0x04 |
||||
} PCD_StateTypeDef; |
||||
|
||||
/* Device LPM suspend state */ |
||||
typedef enum |
||||
{ |
||||
LPM_L0 = 0x00, /* on */ |
||||
LPM_L1 = 0x01, /* LPM L1 sleep */ |
||||
LPM_L2 = 0x02, /* suspend */ |
||||
LPM_L3 = 0x03, /* off */ |
||||
} PCD_LPM_StateTypeDef; |
||||
|
||||
typedef enum |
||||
{ |
||||
PCD_LPM_L0_ACTIVE = 0x00, /* on */ |
||||
PCD_LPM_L1_ACTIVE = 0x01, /* LPM L1 sleep */ |
||||
} PCD_LPM_MsgTypeDef; |
||||
|
||||
typedef enum |
||||
{ |
||||
PCD_BCD_ERROR = 0xFF, |
||||
PCD_BCD_CONTACT_DETECTION = 0xFE, |
||||
PCD_BCD_STD_DOWNSTREAM_PORT = 0xFD, |
||||
PCD_BCD_CHARGING_DOWNSTREAM_PORT = 0xFC, |
||||
PCD_BCD_DEDICATED_CHARGING_PORT = 0xFB, |
||||
PCD_BCD_DISCOVERY_COMPLETED = 0x00, |
||||
|
||||
} PCD_BCD_MsgTypeDef; |
||||
|
||||
#if defined (USB_OTG_FS) || defined (USB_OTG_HS) |
||||
typedef USB_OTG_GlobalTypeDef PCD_TypeDef; |
||||
typedef USB_OTG_CfgTypeDef PCD_InitTypeDef; |
||||
typedef USB_OTG_EPTypeDef PCD_EPTypeDef; |
||||
#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ |
||||
|
||||
/**
|
||||
* @brief PCD Handle Structure definition |
||||
*/ |
||||
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) |
||||
typedef struct __PCD_HandleTypeDef |
||||
#else |
||||
typedef struct |
||||
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ |
||||
{ |
||||
PCD_TypeDef *Instance; /*!< Register base address */ |
||||
PCD_InitTypeDef Init; /*!< PCD required parameters */ |
||||
__IO uint8_t USB_Address; /*!< USB Address */ |
||||
PCD_EPTypeDef IN_ep[16]; /*!< IN endpoint parameters */ |
||||
PCD_EPTypeDef OUT_ep[16]; /*!< OUT endpoint parameters */ |
||||
HAL_LockTypeDef Lock; /*!< PCD peripheral status */ |
||||
__IO PCD_StateTypeDef State; /*!< PCD communication state */ |
||||
__IO uint32_t ErrorCode; /*!< PCD Error code */ |
||||
uint32_t Setup[12]; /*!< Setup packet buffer */ |
||||
PCD_LPM_StateTypeDef LPM_State; /*!< LPM State */ |
||||
uint32_t BESL; |
||||
uint32_t FrameNumber; /*!< Store Current Frame number */ |
||||
|
||||
|
||||
uint32_t lpm_active; /*!< Enable or disable the Link Power Management .
|
||||
This parameter can be set to ENABLE or DISABLE */ |
||||
|
||||
uint32_t battery_charging_active; /*!< Enable or disable Battery charging.
|
||||
This parameter can be set to ENABLE or DISABLE */ |
||||
void *pData; /*!< Pointer to upper stack Handler */ |
||||
|
||||
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) |
||||
void (* SOFCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD SOF callback */ |
||||
void (* SetupStageCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Setup Stage callback */ |
||||
void (* ResetCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Reset callback */ |
||||
void (* SuspendCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Suspend callback */ |
||||
void (* ResumeCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Resume callback */ |
||||
void (* ConnectCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Connect callback */ |
||||
void (* DisconnectCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Disconnect callback */ |
||||
|
||||
void (* DataOutStageCallback)(struct __PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< USB OTG PCD Data OUT Stage callback */ |
||||
void (* DataInStageCallback)(struct __PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< USB OTG PCD Data IN Stage callback */ |
||||
void (* ISOOUTIncompleteCallback)(struct __PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< USB OTG PCD ISO OUT Incomplete callback */ |
||||
void (* ISOINIncompleteCallback)(struct __PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< USB OTG PCD ISO IN Incomplete callback */ |
||||
void (* BCDCallback)(struct __PCD_HandleTypeDef *hpcd, PCD_BCD_MsgTypeDef msg); /*!< USB OTG PCD BCD callback */ |
||||
void (* LPMCallback)(struct __PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg); /*!< USB OTG PCD LPM callback */ |
||||
|
||||
void (* MspInitCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Msp Init callback */ |
||||
void (* MspDeInitCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Msp DeInit callback */ |
||||
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ |
||||
} PCD_HandleTypeDef; |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Include PCD HAL Extended module */ |
||||
#include "stm32f4xx_hal_pcd_ex.h" |
||||
|
||||
/* Exported constants --------------------------------------------------------*/ |
||||
/** @defgroup PCD_Exported_Constants PCD Exported Constants
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup PCD_Speed PCD Speed
|
||||
* @{ |
||||
*/ |
||||
#define PCD_SPEED_HIGH USBD_HS_SPEED |
||||
#define PCD_SPEED_HIGH_IN_FULL USBD_HSINFS_SPEED |
||||
#define PCD_SPEED_FULL USBD_FS_SPEED |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup PCD_PHY_Module PCD PHY Module
|
||||
* @{ |
||||
*/ |
||||
#define PCD_PHY_ULPI 1U |
||||
#define PCD_PHY_EMBEDDED 2U |
||||
#define PCD_PHY_UTMI 3U |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup PCD_Error_Code_definition PCD Error Code definition
|
||||
* @brief PCD Error Code definition |
||||
* @{ |
||||
*/ |
||||
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) |
||||
#define HAL_PCD_ERROR_INVALID_CALLBACK (0x00000010U) /*!< Invalid Callback error */ |
||||
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported macros -----------------------------------------------------------*/ |
||||
/** @defgroup PCD_Exported_Macros PCD Exported Macros
|
||||
* @brief macros to handle interrupts and specific clock configurations |
||||
* @{ |
||||
*/ |
||||
#if defined (USB_OTG_FS) || defined (USB_OTG_HS) |
||||
#define __HAL_PCD_ENABLE(__HANDLE__) (void)USB_EnableGlobalInt ((__HANDLE__)->Instance) |
||||
#define __HAL_PCD_DISABLE(__HANDLE__) (void)USB_DisableGlobalInt ((__HANDLE__)->Instance) |
||||
|
||||
#define __HAL_PCD_GET_FLAG(__HANDLE__, __INTERRUPT__) \ |
||||
((USB_ReadInterrupts((__HANDLE__)->Instance) & (__INTERRUPT__)) == (__INTERRUPT__)) |
||||
|
||||
#define __HAL_PCD_CLEAR_FLAG(__HANDLE__, __INTERRUPT__) (((__HANDLE__)->Instance->GINTSTS) &= (__INTERRUPT__)) |
||||
#define __HAL_PCD_IS_INVALID_INTERRUPT(__HANDLE__) (USB_ReadInterrupts((__HANDLE__)->Instance) == 0U) |
||||
|
||||
#define __HAL_PCD_UNGATE_PHYCLOCK(__HANDLE__) \ |
||||
*(__IO uint32_t *)((uint32_t)((__HANDLE__)->Instance) + USB_OTG_PCGCCTL_BASE) &= ~(USB_OTG_PCGCCTL_STOPCLK) |
||||
|
||||
#define __HAL_PCD_GATE_PHYCLOCK(__HANDLE__) \ |
||||
*(__IO uint32_t *)((uint32_t)((__HANDLE__)->Instance) + USB_OTG_PCGCCTL_BASE) |= USB_OTG_PCGCCTL_STOPCLK |
||||
|
||||
#define __HAL_PCD_IS_PHY_SUSPENDED(__HANDLE__) \ |
||||
((*(__IO uint32_t *)((uint32_t)((__HANDLE__)->Instance) + USB_OTG_PCGCCTL_BASE)) & 0x10U) |
||||
|
||||
#define __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_IT() EXTI->IMR |= (USB_OTG_HS_WAKEUP_EXTI_LINE) |
||||
#define __HAL_USB_OTG_HS_WAKEUP_EXTI_DISABLE_IT() EXTI->IMR &= ~(USB_OTG_HS_WAKEUP_EXTI_LINE) |
||||
#define __HAL_USB_OTG_HS_WAKEUP_EXTI_GET_FLAG() EXTI->PR & (USB_OTG_HS_WAKEUP_EXTI_LINE) |
||||
#define __HAL_USB_OTG_HS_WAKEUP_EXTI_CLEAR_FLAG() EXTI->PR = (USB_OTG_HS_WAKEUP_EXTI_LINE) |
||||
|
||||
#define __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_RISING_EDGE() \ |
||||
do { \
|
||||
EXTI->FTSR &= ~(USB_OTG_HS_WAKEUP_EXTI_LINE); \
|
||||
EXTI->RTSR |= USB_OTG_HS_WAKEUP_EXTI_LINE; \
|
||||
} while(0U) |
||||
#define __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_IT() EXTI->IMR |= USB_OTG_FS_WAKEUP_EXTI_LINE |
||||
#define __HAL_USB_OTG_FS_WAKEUP_EXTI_DISABLE_IT() EXTI->IMR &= ~(USB_OTG_FS_WAKEUP_EXTI_LINE) |
||||
#define __HAL_USB_OTG_FS_WAKEUP_EXTI_GET_FLAG() EXTI->PR & (USB_OTG_FS_WAKEUP_EXTI_LINE) |
||||
#define __HAL_USB_OTG_FS_WAKEUP_EXTI_CLEAR_FLAG() EXTI->PR = USB_OTG_FS_WAKEUP_EXTI_LINE |
||||
|
||||
#define __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_RISING_EDGE() \ |
||||
do { \
|
||||
EXTI->FTSR &= ~(USB_OTG_FS_WAKEUP_EXTI_LINE); \
|
||||
EXTI->RTSR |= USB_OTG_FS_WAKEUP_EXTI_LINE; \
|
||||
} while(0U) |
||||
#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ |
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported functions --------------------------------------------------------*/ |
||||
/** @addtogroup PCD_Exported_Functions PCD Exported Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
/* Initialization/de-initialization functions ********************************/ |
||||
/** @addtogroup PCD_Exported_Functions_Group1 Initialization and de-initialization functions
|
||||
* @{ |
||||
*/ |
||||
HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd); |
||||
HAL_StatusTypeDef HAL_PCD_DeInit(PCD_HandleTypeDef *hpcd); |
||||
void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd); |
||||
void HAL_PCD_MspDeInit(PCD_HandleTypeDef *hpcd); |
||||
|
||||
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) |
||||
/** @defgroup HAL_PCD_Callback_ID_enumeration_definition HAL USB OTG PCD Callback ID enumeration definition
|
||||
* @brief HAL USB OTG PCD Callback ID enumeration definition |
||||
* @{ |
||||
*/ |
||||
typedef enum |
||||
{ |
||||
HAL_PCD_SOF_CB_ID = 0x01, /*!< USB PCD SOF callback ID */ |
||||
HAL_PCD_SETUPSTAGE_CB_ID = 0x02, /*!< USB PCD Setup Stage callback ID */ |
||||
HAL_PCD_RESET_CB_ID = 0x03, /*!< USB PCD Reset callback ID */ |
||||
HAL_PCD_SUSPEND_CB_ID = 0x04, /*!< USB PCD Suspend callback ID */ |
||||
HAL_PCD_RESUME_CB_ID = 0x05, /*!< USB PCD Resume callback ID */ |
||||
HAL_PCD_CONNECT_CB_ID = 0x06, /*!< USB PCD Connect callback ID */ |
||||
HAL_PCD_DISCONNECT_CB_ID = 0x07, /*!< USB PCD Disconnect callback ID */ |
||||
|
||||
HAL_PCD_MSPINIT_CB_ID = 0x08, /*!< USB PCD MspInit callback ID */ |
||||
HAL_PCD_MSPDEINIT_CB_ID = 0x09 /*!< USB PCD MspDeInit callback ID */ |
||||
|
||||
} HAL_PCD_CallbackIDTypeDef; |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup HAL_PCD_Callback_pointer_definition HAL USB OTG PCD Callback pointer definition
|
||||
* @brief HAL USB OTG PCD Callback pointer definition |
||||
* @{ |
||||
*/ |
||||
|
||||
typedef void (*pPCD_CallbackTypeDef)(PCD_HandleTypeDef *hpcd); /*!< pointer to a common USB OTG PCD callback function */ |
||||
typedef void (*pPCD_DataOutStageCallbackTypeDef)(PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< pointer to USB OTG PCD Data OUT Stage callback */ |
||||
typedef void (*pPCD_DataInStageCallbackTypeDef)(PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< pointer to USB OTG PCD Data IN Stage callback */ |
||||
typedef void (*pPCD_IsoOutIncpltCallbackTypeDef)(PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< pointer to USB OTG PCD ISO OUT Incomplete callback */ |
||||
typedef void (*pPCD_IsoInIncpltCallbackTypeDef)(PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< pointer to USB OTG PCD ISO IN Incomplete callback */ |
||||
typedef void (*pPCD_LpmCallbackTypeDef)(PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg); /*!< pointer to USB OTG PCD LPM callback */ |
||||
typedef void (*pPCD_BcdCallbackTypeDef)(PCD_HandleTypeDef *hpcd, PCD_BCD_MsgTypeDef msg); /*!< pointer to USB OTG PCD BCD callback */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
HAL_StatusTypeDef HAL_PCD_RegisterCallback(PCD_HandleTypeDef *hpcd, HAL_PCD_CallbackIDTypeDef CallbackID, |
||||
pPCD_CallbackTypeDef pCallback); |
||||
|
||||
HAL_StatusTypeDef HAL_PCD_UnRegisterCallback(PCD_HandleTypeDef *hpcd, HAL_PCD_CallbackIDTypeDef CallbackID); |
||||
|
||||
HAL_StatusTypeDef HAL_PCD_RegisterDataOutStageCallback(PCD_HandleTypeDef *hpcd, |
||||
pPCD_DataOutStageCallbackTypeDef pCallback); |
||||
|
||||
HAL_StatusTypeDef HAL_PCD_UnRegisterDataOutStageCallback(PCD_HandleTypeDef *hpcd); |
||||
|
||||
HAL_StatusTypeDef HAL_PCD_RegisterDataInStageCallback(PCD_HandleTypeDef *hpcd, |
||||
pPCD_DataInStageCallbackTypeDef pCallback); |
||||
|
||||
HAL_StatusTypeDef HAL_PCD_UnRegisterDataInStageCallback(PCD_HandleTypeDef *hpcd); |
||||
|
||||
HAL_StatusTypeDef HAL_PCD_RegisterIsoOutIncpltCallback(PCD_HandleTypeDef *hpcd, |
||||
pPCD_IsoOutIncpltCallbackTypeDef pCallback); |
||||
|
||||
HAL_StatusTypeDef HAL_PCD_UnRegisterIsoOutIncpltCallback(PCD_HandleTypeDef *hpcd); |
||||
|
||||
HAL_StatusTypeDef HAL_PCD_RegisterIsoInIncpltCallback(PCD_HandleTypeDef *hpcd, |
||||
pPCD_IsoInIncpltCallbackTypeDef pCallback); |
||||
|
||||
HAL_StatusTypeDef HAL_PCD_UnRegisterIsoInIncpltCallback(PCD_HandleTypeDef *hpcd); |
||||
|
||||
HAL_StatusTypeDef HAL_PCD_RegisterBcdCallback(PCD_HandleTypeDef *hpcd, pPCD_BcdCallbackTypeDef pCallback); |
||||
HAL_StatusTypeDef HAL_PCD_UnRegisterBcdCallback(PCD_HandleTypeDef *hpcd); |
||||
|
||||
HAL_StatusTypeDef HAL_PCD_RegisterLpmCallback(PCD_HandleTypeDef *hpcd, pPCD_LpmCallbackTypeDef pCallback); |
||||
HAL_StatusTypeDef HAL_PCD_UnRegisterLpmCallback(PCD_HandleTypeDef *hpcd); |
||||
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* I/O operation functions ***************************************************/ |
||||
/* Non-Blocking mode: Interrupt */ |
||||
/** @addtogroup PCD_Exported_Functions_Group2 Input and Output operation functions
|
||||
* @{ |
||||
*/ |
||||
HAL_StatusTypeDef HAL_PCD_Start(PCD_HandleTypeDef *hpcd); |
||||
HAL_StatusTypeDef HAL_PCD_Stop(PCD_HandleTypeDef *hpcd); |
||||
void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd); |
||||
void HAL_PCD_WKUP_IRQHandler(PCD_HandleTypeDef *hpcd); |
||||
|
||||
void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd); |
||||
void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd); |
||||
void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd); |
||||
void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd); |
||||
void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd); |
||||
void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd); |
||||
void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd); |
||||
|
||||
void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum); |
||||
void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum); |
||||
void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum); |
||||
void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum); |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Peripheral Control functions **********************************************/ |
||||
/** @addtogroup PCD_Exported_Functions_Group3 Peripheral Control functions
|
||||
* @{ |
||||
*/ |
||||
HAL_StatusTypeDef HAL_PCD_DevConnect(PCD_HandleTypeDef *hpcd); |
||||
HAL_StatusTypeDef HAL_PCD_DevDisconnect(PCD_HandleTypeDef *hpcd); |
||||
HAL_StatusTypeDef HAL_PCD_SetAddress(PCD_HandleTypeDef *hpcd, uint8_t address); |
||||
HAL_StatusTypeDef HAL_PCD_EP_Open(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint16_t ep_mps, uint8_t ep_type); |
||||
HAL_StatusTypeDef HAL_PCD_EP_Close(PCD_HandleTypeDef *hpcd, uint8_t ep_addr); |
||||
HAL_StatusTypeDef HAL_PCD_EP_Receive(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len); |
||||
HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len); |
||||
HAL_StatusTypeDef HAL_PCD_EP_SetStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr); |
||||
HAL_StatusTypeDef HAL_PCD_EP_ClrStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr); |
||||
HAL_StatusTypeDef HAL_PCD_EP_Flush(PCD_HandleTypeDef *hpcd, uint8_t ep_addr); |
||||
HAL_StatusTypeDef HAL_PCD_EP_Abort(PCD_HandleTypeDef *hpcd, uint8_t ep_addr); |
||||
HAL_StatusTypeDef HAL_PCD_ActivateRemoteWakeup(PCD_HandleTypeDef *hpcd); |
||||
HAL_StatusTypeDef HAL_PCD_DeActivateRemoteWakeup(PCD_HandleTypeDef *hpcd); |
||||
HAL_StatusTypeDef HAL_PCD_SetTestMode(PCD_HandleTypeDef *hpcd, uint8_t testmode); |
||||
|
||||
uint32_t HAL_PCD_EP_GetRxCount(PCD_HandleTypeDef *hpcd, uint8_t ep_addr); |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Peripheral State functions ************************************************/ |
||||
/** @addtogroup PCD_Exported_Functions_Group4 Peripheral State functions
|
||||
* @{ |
||||
*/ |
||||
PCD_StateTypeDef HAL_PCD_GetState(PCD_HandleTypeDef *hpcd); |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Private constants ---------------------------------------------------------*/ |
||||
/** @defgroup PCD_Private_Constants PCD Private Constants
|
||||
* @{ |
||||
*/ |
||||
/** @defgroup USB_EXTI_Line_Interrupt USB EXTI line interrupt
|
||||
* @{ |
||||
*/ |
||||
#if defined (USB_OTG_FS) || defined (USB_OTG_HS) |
||||
#define USB_OTG_FS_WAKEUP_EXTI_LINE (0x1U << 18) /*!< USB FS EXTI Line WakeUp Interrupt */ |
||||
#define USB_OTG_HS_WAKEUP_EXTI_LINE (0x1U << 20) /*!< USB HS EXTI Line WakeUp Interrupt */ |
||||
#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ |
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#if defined (USB_OTG_FS) || defined (USB_OTG_HS) |
||||
#ifndef USB_OTG_DOEPINT_OTEPSPR |
||||
#define USB_OTG_DOEPINT_OTEPSPR (0x1UL << 5) /*!< Status Phase Received interrupt */ |
||||
#endif /* defined USB_OTG_DOEPINT_OTEPSPR */ |
||||
|
||||
#ifndef USB_OTG_DOEPMSK_OTEPSPRM |
||||
#define USB_OTG_DOEPMSK_OTEPSPRM (0x1UL << 5) /*!< Setup Packet Received interrupt mask */ |
||||
#endif /* defined USB_OTG_DOEPMSK_OTEPSPRM */ |
||||
|
||||
#ifndef USB_OTG_DOEPINT_NAK |
||||
#define USB_OTG_DOEPINT_NAK (0x1UL << 13) /*!< NAK interrupt */ |
||||
#endif /* defined USB_OTG_DOEPINT_NAK */ |
||||
|
||||
#ifndef USB_OTG_DOEPMSK_NAKM |
||||
#define USB_OTG_DOEPMSK_NAKM (0x1UL << 13) /*!< OUT Packet NAK interrupt mask */ |
||||
#endif /* defined USB_OTG_DOEPMSK_NAKM */ |
||||
|
||||
#ifndef USB_OTG_DOEPINT_STPKTRX |
||||
#define USB_OTG_DOEPINT_STPKTRX (0x1UL << 15) /*!< Setup Packet Received interrupt */ |
||||
#endif /* defined USB_OTG_DOEPINT_STPKTRX */ |
||||
|
||||
#ifndef USB_OTG_DOEPMSK_NYETM |
||||
#define USB_OTG_DOEPMSK_NYETM (0x1UL << 14) /*!< Setup Packet Received interrupt mask */ |
||||
#endif /* defined USB_OTG_DOEPMSK_NYETM */ |
||||
#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ |
||||
|
||||
/* Private macros ------------------------------------------------------------*/ |
||||
/** @defgroup PCD_Private_Macros PCD Private Macros
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* STM32F4xx_HAL_PCD_H */ |
@ -0,0 +1,88 @@
|
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm32f4xx_hal_pcd_ex.h |
||||
* @author MCD Application Team |
||||
* @brief Header file of PCD HAL Extension module. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* Copyright (c) 2016 STMicroelectronics. |
||||
* All rights reserved. |
||||
* |
||||
* This software is licensed under terms that can be found in the LICENSE file |
||||
* in the root directory of this software component. |
||||
* If no LICENSE file comes with this software, it is provided AS-IS. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef STM32F4xx_HAL_PCD_EX_H |
||||
#define STM32F4xx_HAL_PCD_EX_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif /* __cplusplus */ |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm32f4xx_hal_def.h" |
||||
|
||||
#if defined (USB_OTG_FS) || defined (USB_OTG_HS) |
||||
/** @addtogroup STM32F4xx_HAL_Driver
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @addtogroup PCDEx
|
||||
* @{ |
||||
*/ |
||||
/* Exported types ------------------------------------------------------------*/ |
||||
/* Exported constants --------------------------------------------------------*/ |
||||
/* Exported macros -----------------------------------------------------------*/ |
||||
/* Exported functions --------------------------------------------------------*/ |
||||
/** @addtogroup PCDEx_Exported_Functions PCDEx Exported Functions
|
||||
* @{ |
||||
*/ |
||||
/** @addtogroup PCDEx_Exported_Functions_Group1 Peripheral Control functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
#if defined (USB_OTG_FS) || defined (USB_OTG_HS) |
||||
HAL_StatusTypeDef HAL_PCDEx_SetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo, uint16_t size); |
||||
HAL_StatusTypeDef HAL_PCDEx_SetRxFiFo(PCD_HandleTypeDef *hpcd, uint16_t size); |
||||
#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ |
||||
|
||||
#if defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) |
||||
HAL_StatusTypeDef HAL_PCDEx_ActivateLPM(PCD_HandleTypeDef *hpcd); |
||||
HAL_StatusTypeDef HAL_PCDEx_DeActivateLPM(PCD_HandleTypeDef *hpcd); |
||||
#endif /* defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) */ |
||||
#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) |
||||
HAL_StatusTypeDef HAL_PCDEx_ActivateBCD(PCD_HandleTypeDef *hpcd); |
||||
HAL_StatusTypeDef HAL_PCDEx_DeActivateBCD(PCD_HandleTypeDef *hpcd); |
||||
void HAL_PCDEx_BCD_VBUSDetect(PCD_HandleTypeDef *hpcd); |
||||
#endif /* defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) */ |
||||
void HAL_PCDEx_LPM_Callback(PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg); |
||||
void HAL_PCDEx_BCD_Callback(PCD_HandleTypeDef *hpcd, PCD_BCD_MsgTypeDef msg); |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif /* __cplusplus */ |
||||
|
||||
|
||||
#endif /* STM32F4xx_HAL_PCD_EX_H */ |
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,341 @@
|
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm32f4xx_hal_pcd_ex.c |
||||
* @author MCD Application Team |
||||
* @brief PCD Extended HAL module driver. |
||||
* This file provides firmware functions to manage the following |
||||
* functionalities of the USB Peripheral Controller: |
||||
* + Extended features functions |
||||
* |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* Copyright (c) 2016 STMicroelectronics. |
||||
* All rights reserved. |
||||
* |
||||
* This software is licensed under terms that can be found in the LICENSE file |
||||
* in the root directory of this software component. |
||||
* If no LICENSE file comes with this software, it is provided AS-IS. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm32f4xx_hal.h" |
||||
|
||||
/** @addtogroup STM32F4xx_HAL_Driver
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup PCDEx PCDEx
|
||||
* @brief PCD Extended HAL module driver |
||||
* @{ |
||||
*/ |
||||
|
||||
#ifdef HAL_PCD_MODULE_ENABLED |
||||
|
||||
#if defined (USB_OTG_FS) || defined (USB_OTG_HS) |
||||
/* Private types -------------------------------------------------------------*/ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
/* Private constants ---------------------------------------------------------*/ |
||||
/* Private macros ------------------------------------------------------------*/ |
||||
/* Private functions ---------------------------------------------------------*/ |
||||
/* Exported functions --------------------------------------------------------*/ |
||||
|
||||
/** @defgroup PCDEx_Exported_Functions PCDEx Exported Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup PCDEx_Exported_Functions_Group1 Peripheral Control functions
|
||||
* @brief PCDEx control functions |
||||
* |
||||
@verbatim |
||||
=============================================================================== |
||||
##### Extended features functions ##### |
||||
=============================================================================== |
||||
[..] This section provides functions allowing to: |
||||
(+) Update FIFO configuration |
||||
|
||||
@endverbatim |
||||
* @{ |
||||
*/ |
||||
#if defined (USB_OTG_FS) || defined (USB_OTG_HS) |
||||
/**
|
||||
* @brief Set Tx FIFO |
||||
* @param hpcd PCD handle |
||||
* @param fifo The number of Tx fifo |
||||
* @param size Fifo size |
||||
* @retval HAL status |
||||
*/ |
||||
HAL_StatusTypeDef HAL_PCDEx_SetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo, uint16_t size) |
||||
{ |
||||
uint8_t i; |
||||
uint32_t Tx_Offset; |
||||
|
||||
/* TXn min size = 16 words. (n : Transmit FIFO index)
|
||||
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 |
||||
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. |
||||
When DMA is used 3n * FIFO locations should be reserved for internal DMA registers */ |
||||
|
||||
Tx_Offset = hpcd->Instance->GRXFSIZ; |
||||
|
||||
if (fifo == 0U) |
||||
{ |
||||
hpcd->Instance->DIEPTXF0_HNPTXFSIZ = ((uint32_t)size << 16) | Tx_Offset; |
||||
} |
||||
else |
||||
{ |
||||
Tx_Offset += (hpcd->Instance->DIEPTXF0_HNPTXFSIZ) >> 16; |
||||
for (i = 0U; i < (fifo - 1U); i++) |
||||
{ |
||||
Tx_Offset += (hpcd->Instance->DIEPTXF[i] >> 16); |
||||
} |
||||
|
||||
/* Multiply Tx_Size by 2 to get higher performance */ |
||||
hpcd->Instance->DIEPTXF[fifo - 1U] = ((uint32_t)size << 16) | Tx_Offset; |
||||
} |
||||
|
||||
return HAL_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Set Rx FIFO |
||||
* @param hpcd PCD handle |
||||
* @param size Size of Rx fifo |
||||
* @retval HAL status |
||||
*/ |
||||
HAL_StatusTypeDef HAL_PCDEx_SetRxFiFo(PCD_HandleTypeDef *hpcd, uint16_t size) |
||||
{ |
||||
hpcd->Instance->GRXFSIZ = size; |
||||
|
||||
return HAL_OK; |
||||
} |
||||
#if defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) |
||||
/**
|
||||
* @brief Activate LPM feature. |
||||
* @param hpcd PCD handle |
||||
* @retval HAL status |
||||
*/ |
||||
HAL_StatusTypeDef HAL_PCDEx_ActivateLPM(PCD_HandleTypeDef *hpcd) |
||||
{ |
||||
USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; |
||||
|
||||
hpcd->lpm_active = 1U; |
||||
hpcd->LPM_State = LPM_L0; |
||||
USBx->GINTMSK |= USB_OTG_GINTMSK_LPMINTM; |
||||
USBx->GLPMCFG |= (USB_OTG_GLPMCFG_LPMEN | USB_OTG_GLPMCFG_LPMACK | USB_OTG_GLPMCFG_ENBESL); |
||||
|
||||
return HAL_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Deactivate LPM feature. |
||||
* @param hpcd PCD handle |
||||
* @retval HAL status |
||||
*/ |
||||
HAL_StatusTypeDef HAL_PCDEx_DeActivateLPM(PCD_HandleTypeDef *hpcd) |
||||
{ |
||||
USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; |
||||
|
||||
hpcd->lpm_active = 0U; |
||||
USBx->GINTMSK &= ~USB_OTG_GINTMSK_LPMINTM; |
||||
USBx->GLPMCFG &= ~(USB_OTG_GLPMCFG_LPMEN | USB_OTG_GLPMCFG_LPMACK | USB_OTG_GLPMCFG_ENBESL); |
||||
|
||||
return HAL_OK; |
||||
} |
||||
#endif /* defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) */ |
||||
#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) |
||||
/**
|
||||
* @brief Handle BatteryCharging Process. |
||||
* @param hpcd PCD handle |
||||
* @retval HAL status |
||||
*/ |
||||
void HAL_PCDEx_BCD_VBUSDetect(PCD_HandleTypeDef *hpcd) |
||||
{ |
||||
USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; |
||||
uint32_t tickstart = HAL_GetTick(); |
||||
|
||||
/* Enable DCD : Data Contact Detect */ |
||||
USBx->GCCFG |= USB_OTG_GCCFG_DCDEN; |
||||
|
||||
/* Wait for Min DCD Timeout */ |
||||
HAL_Delay(300U); |
||||
|
||||
/* Check Detect flag */ |
||||
if ((USBx->GCCFG & USB_OTG_GCCFG_DCDET) == USB_OTG_GCCFG_DCDET) |
||||
{ |
||||
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) |
||||
hpcd->BCDCallback(hpcd, PCD_BCD_CONTACT_DETECTION); |
||||
#else |
||||
HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_CONTACT_DETECTION); |
||||
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ |
||||
} |
||||
|
||||
/* Primary detection: checks if connected to Standard Downstream Port
|
||||
(without charging capability) */ |
||||
USBx->GCCFG &= ~ USB_OTG_GCCFG_DCDEN; |
||||
HAL_Delay(50U); |
||||
USBx->GCCFG |= USB_OTG_GCCFG_PDEN; |
||||
HAL_Delay(50U); |
||||
|
||||
if ((USBx->GCCFG & USB_OTG_GCCFG_PDET) == 0U) |
||||
{ |
||||
/* Case of Standard Downstream Port */ |
||||
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) |
||||
hpcd->BCDCallback(hpcd, PCD_BCD_STD_DOWNSTREAM_PORT); |
||||
#else |
||||
HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_STD_DOWNSTREAM_PORT); |
||||
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ |
||||
} |
||||
else |
||||
{ |
||||
/* start secondary detection to check connection to Charging Downstream
|
||||
Port or Dedicated Charging Port */ |
||||
USBx->GCCFG &= ~ USB_OTG_GCCFG_PDEN; |
||||
HAL_Delay(50U); |
||||
USBx->GCCFG |= USB_OTG_GCCFG_SDEN; |
||||
HAL_Delay(50U); |
||||
|
||||
if ((USBx->GCCFG & USB_OTG_GCCFG_SDET) == USB_OTG_GCCFG_SDET) |
||||
{ |
||||
/* case Dedicated Charging Port */ |
||||
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) |
||||
hpcd->BCDCallback(hpcd, PCD_BCD_DEDICATED_CHARGING_PORT); |
||||
#else |
||||
HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_DEDICATED_CHARGING_PORT); |
||||
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ |
||||
} |
||||
else |
||||
{ |
||||
/* case Charging Downstream Port */ |
||||
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) |
||||
hpcd->BCDCallback(hpcd, PCD_BCD_CHARGING_DOWNSTREAM_PORT); |
||||
#else |
||||
HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_CHARGING_DOWNSTREAM_PORT); |
||||
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ |
||||
} |
||||
} |
||||
|
||||
/* Battery Charging capability discovery finished */ |
||||
(void)HAL_PCDEx_DeActivateBCD(hpcd); |
||||
|
||||
/* Check for the Timeout, else start USB Device */ |
||||
if ((HAL_GetTick() - tickstart) > 1000U) |
||||
{ |
||||
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) |
||||
hpcd->BCDCallback(hpcd, PCD_BCD_ERROR); |
||||
#else |
||||
HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_ERROR); |
||||
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ |
||||
} |
||||
else |
||||
{ |
||||
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) |
||||
hpcd->BCDCallback(hpcd, PCD_BCD_DISCOVERY_COMPLETED); |
||||
#else |
||||
HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_DISCOVERY_COMPLETED); |
||||
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Activate BatteryCharging feature. |
||||
* @param hpcd PCD handle |
||||
* @retval HAL status |
||||
*/ |
||||
HAL_StatusTypeDef HAL_PCDEx_ActivateBCD(PCD_HandleTypeDef *hpcd) |
||||
{ |
||||
USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; |
||||
|
||||
USBx->GCCFG &= ~(USB_OTG_GCCFG_PDEN); |
||||
USBx->GCCFG &= ~(USB_OTG_GCCFG_SDEN); |
||||
|
||||
/* Power Down USB transceiver */ |
||||
USBx->GCCFG &= ~(USB_OTG_GCCFG_PWRDWN); |
||||
|
||||
/* Enable Battery charging */ |
||||
USBx->GCCFG |= USB_OTG_GCCFG_BCDEN; |
||||
|
||||
hpcd->battery_charging_active = 1U; |
||||
|
||||
return HAL_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Deactivate BatteryCharging feature. |
||||
* @param hpcd PCD handle |
||||
* @retval HAL status |
||||
*/ |
||||
HAL_StatusTypeDef HAL_PCDEx_DeActivateBCD(PCD_HandleTypeDef *hpcd) |
||||
{ |
||||
USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; |
||||
|
||||
USBx->GCCFG &= ~(USB_OTG_GCCFG_SDEN); |
||||
USBx->GCCFG &= ~(USB_OTG_GCCFG_PDEN); |
||||
|
||||
/* Disable Battery charging */ |
||||
USBx->GCCFG &= ~(USB_OTG_GCCFG_BCDEN); |
||||
|
||||
hpcd->battery_charging_active = 0U; |
||||
|
||||
return HAL_OK; |
||||
} |
||||
#endif /* defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) */ |
||||
#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ |
||||
|
||||
/**
|
||||
* @brief Send LPM message to user layer callback. |
||||
* @param hpcd PCD handle |
||||
* @param msg LPM message |
||||
* @retval HAL status |
||||
*/ |
||||
__weak void HAL_PCDEx_LPM_Callback(PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg) |
||||
{ |
||||
/* Prevent unused argument(s) compilation warning */ |
||||
UNUSED(hpcd); |
||||
UNUSED(msg); |
||||
|
||||
/* NOTE : This function should not be modified, when the callback is needed,
|
||||
the HAL_PCDEx_LPM_Callback could be implemented in the user file |
||||
*/ |
||||
} |
||||
|
||||
/**
|
||||
* @brief Send BatteryCharging message to user layer callback. |
||||
* @param hpcd PCD handle |
||||
* @param msg LPM message |
||||
* @retval HAL status |
||||
*/ |
||||
__weak void HAL_PCDEx_BCD_Callback(PCD_HandleTypeDef *hpcd, PCD_BCD_MsgTypeDef msg) |
||||
{ |
||||
/* Prevent unused argument(s) compilation warning */ |
||||
UNUSED(hpcd); |
||||
UNUSED(msg); |
||||
|
||||
/* NOTE : This function should not be modified, when the callback is needed,
|
||||
the HAL_PCDEx_BCD_Callback could be implemented in the user file |
||||
*/ |
||||
} |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ |
||||
#endif /* HAL_PCD_MODULE_ENABLED */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
@ -0,0 +1,179 @@
|
||||
/**
|
||||
****************************************************************************** |
||||
* @file usbd_cdc.h |
||||
* @author MCD Application Team |
||||
* @brief header file for the usbd_cdc.c file. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* Copyright (c) 2015 STMicroelectronics. |
||||
* All rights reserved. |
||||
* |
||||
* This software is licensed under terms that can be found in the LICENSE file |
||||
* in the root directory of this software component. |
||||
* If no LICENSE file comes with this software, it is provided AS-IS. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __USB_CDC_H |
||||
#define __USB_CDC_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbd_ioreq.h" |
||||
|
||||
/** @addtogroup STM32_USB_DEVICE_LIBRARY
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup usbd_cdc
|
||||
* @brief This file is the Header file for usbd_cdc.c |
||||
* @{ |
||||
*/ |
||||
|
||||
|
||||
/** @defgroup usbd_cdc_Exported_Defines
|
||||
* @{ |
||||
*/ |
||||
#ifndef CDC_IN_EP |
||||
#define CDC_IN_EP 0x81U /* EP1 for data IN */ |
||||
#endif /* CDC_IN_EP */ |
||||
#ifndef CDC_OUT_EP |
||||
#define CDC_OUT_EP 0x01U /* EP1 for data OUT */ |
||||
#endif /* CDC_OUT_EP */ |
||||
#ifndef CDC_CMD_EP |
||||
#define CDC_CMD_EP 0x82U /* EP2 for CDC commands */ |
||||
#endif /* CDC_CMD_EP */ |
||||
|
||||
#ifndef CDC_HS_BINTERVAL |
||||
#define CDC_HS_BINTERVAL 0x10U |
||||
#endif /* CDC_HS_BINTERVAL */ |
||||
|
||||
#ifndef CDC_FS_BINTERVAL |
||||
#define CDC_FS_BINTERVAL 0x10U |
||||
#endif /* CDC_FS_BINTERVAL */ |
||||
|
||||
/* CDC Endpoints parameters: you can fine tune these values depending on the needed baudrates and performance. */ |
||||
#define CDC_DATA_HS_MAX_PACKET_SIZE 512U /* Endpoint IN & OUT Packet size */ |
||||
#define CDC_DATA_FS_MAX_PACKET_SIZE 64U /* Endpoint IN & OUT Packet size */ |
||||
#define CDC_CMD_PACKET_SIZE 8U /* Control Endpoint Packet size */ |
||||
|
||||
#define USB_CDC_CONFIG_DESC_SIZ 67U |
||||
#define CDC_DATA_HS_IN_PACKET_SIZE CDC_DATA_HS_MAX_PACKET_SIZE |
||||
#define CDC_DATA_HS_OUT_PACKET_SIZE CDC_DATA_HS_MAX_PACKET_SIZE |
||||
|
||||
#define CDC_DATA_FS_IN_PACKET_SIZE CDC_DATA_FS_MAX_PACKET_SIZE |
||||
#define CDC_DATA_FS_OUT_PACKET_SIZE CDC_DATA_FS_MAX_PACKET_SIZE |
||||
|
||||
#define CDC_REQ_MAX_DATA_SIZE 0x7U |
||||
/*---------------------------------------------------------------------*/ |
||||
/* CDC definitions */ |
||||
/*---------------------------------------------------------------------*/ |
||||
#define CDC_SEND_ENCAPSULATED_COMMAND 0x00U |
||||
#define CDC_GET_ENCAPSULATED_RESPONSE 0x01U |
||||
#define CDC_SET_COMM_FEATURE 0x02U |
||||
#define CDC_GET_COMM_FEATURE 0x03U |
||||
#define CDC_CLEAR_COMM_FEATURE 0x04U |
||||
#define CDC_SET_LINE_CODING 0x20U |
||||
#define CDC_GET_LINE_CODING 0x21U |
||||
#define CDC_SET_CONTROL_LINE_STATE 0x22U |
||||
#define CDC_SEND_BREAK 0x23U |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/** @defgroup USBD_CORE_Exported_TypesDefinitions
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
typedef struct |
||||
{ |
||||
uint32_t bitrate; |
||||
uint8_t format; |
||||
uint8_t paritytype; |
||||
uint8_t datatype; |
||||
} USBD_CDC_LineCodingTypeDef; |
||||
|
||||
typedef struct _USBD_CDC_Itf |
||||
{ |
||||
int8_t (* Init)(void); |
||||
int8_t (* DeInit)(void); |
||||
int8_t (* Control)(uint8_t cmd, uint8_t *pbuf, uint16_t length); |
||||
int8_t (* Receive)(uint8_t *Buf, uint32_t *Len); |
||||
int8_t (* TransmitCplt)(uint8_t *Buf, uint32_t *Len, uint8_t epnum); |
||||
} USBD_CDC_ItfTypeDef; |
||||
|
||||
|
||||
typedef struct |
||||
{ |
||||
uint32_t data[CDC_DATA_HS_MAX_PACKET_SIZE / 4U]; /* Force 32-bit alignment */ |
||||
uint8_t CmdOpCode; |
||||
uint8_t CmdLength; |
||||
uint8_t *RxBuffer; |
||||
uint8_t *TxBuffer; |
||||
uint32_t RxLength; |
||||
uint32_t TxLength; |
||||
|
||||
__IO uint32_t TxState; |
||||
__IO uint32_t RxState; |
||||
} USBD_CDC_HandleTypeDef; |
||||
|
||||
|
||||
|
||||
/** @defgroup USBD_CORE_Exported_Macros
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBD_CORE_Exported_Variables
|
||||
* @{ |
||||
*/ |
||||
|
||||
extern USBD_ClassTypeDef USBD_CDC; |
||||
#define USBD_CDC_CLASS &USBD_CDC |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USB_CORE_Exported_Functions
|
||||
* @{ |
||||
*/ |
||||
uint8_t USBD_CDC_RegisterInterface(USBD_HandleTypeDef *pdev, |
||||
USBD_CDC_ItfTypeDef *fops); |
||||
|
||||
uint8_t USBD_CDC_SetTxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff, |
||||
uint32_t length); |
||||
|
||||
uint8_t USBD_CDC_SetRxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff); |
||||
uint8_t USBD_CDC_ReceivePacket(USBD_HandleTypeDef *pdev); |
||||
uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev); |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* __USB_CDC_H */ |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
@ -0,0 +1,875 @@
|
||||
/**
|
||||
****************************************************************************** |
||||
* @file usbd_cdc.c |
||||
* @author MCD Application Team |
||||
* @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 |
||||
* |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* Copyright (c) 2015 STMicroelectronics. |
||||
* All rights reserved. |
||||
* |
||||
* This software is licensed under terms that can be found in the LICENSE file |
||||
* in the root directory of this software component. |
||||
* If no LICENSE file comes with this software, it is provided AS-IS. |
||||
* |
||||
****************************************************************************** |
||||
* @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 |
||||
* |
||||
* 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 |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* BSPDependencies
|
||||
- "stm32xxxxx_{eval}{discovery}{nucleo_144}.c" |
||||
- "stm32xxxxx_{eval}{discovery}_io.c" |
||||
EndBSPDependencies */ |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbd_cdc.h" |
||||
#include "usbd_ctlreq.h" |
||||
|
||||
|
||||
/** @addtogroup STM32_USB_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
|
||||
* @{ |
||||
*/ |
||||
|
||||
static uint8_t USBD_CDC_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx); |
||||
static uint8_t USBD_CDC_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx); |
||||
static uint8_t USBD_CDC_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); |
||||
static uint8_t USBD_CDC_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum); |
||||
static uint8_t USBD_CDC_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum); |
||||
static uint8_t USBD_CDC_EP0_RxReady(USBD_HandleTypeDef *pdev); |
||||
#ifndef USE_USBD_COMPOSITE |
||||
static uint8_t *USBD_CDC_GetFSCfgDesc(uint16_t *length); |
||||
static uint8_t *USBD_CDC_GetHSCfgDesc(uint16_t *length); |
||||
static uint8_t *USBD_CDC_GetOtherSpeedCfgDesc(uint16_t *length); |
||||
static uint8_t *USBD_CDC_GetOtherSpeedCfgDesc(uint16_t *length); |
||||
uint8_t *USBD_CDC_GetDeviceQualifierDescriptor(uint16_t *length); |
||||
#endif /* USE_USBD_COMPOSITE */ |
||||
|
||||
#ifndef USE_USBD_COMPOSITE |
||||
/* USB Standard Device Descriptor */ |
||||
__ALIGN_BEGIN static uint8_t USBD_CDC_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, |
||||
}; |
||||
#endif /* USE_USBD_COMPOSITE */ |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBD_CDC_Private_Variables
|
||||
* @{ |
||||
*/ |
||||
|
||||
|
||||
/* CDC interface class callbacks structure */ |
||||
USBD_ClassTypeDef USBD_CDC = |
||||
{ |
||||
USBD_CDC_Init, |
||||
USBD_CDC_DeInit, |
||||
USBD_CDC_Setup, |
||||
NULL, /* EP0_TxSent */ |
||||
USBD_CDC_EP0_RxReady, |
||||
USBD_CDC_DataIn, |
||||
USBD_CDC_DataOut, |
||||
NULL, |
||||
NULL, |
||||
NULL, |
||||
#ifdef USE_USBD_COMPOSITE |
||||
NULL, |
||||
NULL, |
||||
NULL, |
||||
NULL, |
||||
#else |
||||
USBD_CDC_GetHSCfgDesc, |
||||
USBD_CDC_GetFSCfgDesc, |
||||
USBD_CDC_GetOtherSpeedCfgDesc, |
||||
USBD_CDC_GetDeviceQualifierDescriptor, |
||||
#endif /* USE_USBD_COMPOSITE */ |
||||
}; |
||||
|
||||
#ifndef USE_USBD_COMPOSITE |
||||
/* USB CDC device Configuration Descriptor */ |
||||
__ALIGN_BEGIN static uint8_t USBD_CDC_CfgDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END = |
||||
{ |
||||
/* Configuration Descriptor */ |
||||
0x09, /* bLength: Configuration Descriptor size */ |
||||
USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ |
||||
USB_CDC_CONFIG_DESC_SIZ, /* wTotalLength */ |
||||
0x00, |
||||
0x02, /* bNumInterfaces: 2 interfaces */ |
||||
0x01, /* bConfigurationValue: Configuration value */ |
||||
0x00, /* iConfiguration: Index of string descriptor
|
||||
describing the configuration */ |
||||
#if (USBD_SELF_POWERED == 1U) |
||||
0xC0, /* bmAttributes: Bus Powered according to user configuration */ |
||||
#else |
||||
0x80, /* bmAttributes: Bus Powered according to user configuration */ |
||||
#endif /* USBD_SELF_POWERED */ |
||||
USBD_MAX_POWER, /* MaxPower (mA) */ |
||||
|
||||
/*---------------------------------------------------------------------------*/ |
||||
|
||||
/* Interface Descriptor */ |
||||
0x09, /* bLength: Interface Descriptor size */ |
||||
USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ |
||||
/* Interface descriptor type */ |
||||
0x00, /* bInterfaceNumber: Number of Interface */ |
||||
0x00, /* bAlternateSetting: Alternate setting */ |
||||
0x01, /* bNumEndpoints: One endpoint 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 */ |
||||
|
||||
/* 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_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ |
||||
CDC_CMD_EP, /* bEndpointAddress */ |
||||
0x03, /* bmAttributes: Interrupt */ |
||||
LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize */ |
||||
HIBYTE(CDC_CMD_PACKET_SIZE), |
||||
CDC_FS_BINTERVAL, /* bInterval */ |
||||
/*---------------------------------------------------------------------------*/ |
||||
|
||||
/* Data class interface descriptor */ |
||||
0x09, /* bLength: Endpoint Descriptor size */ |
||||
USB_DESC_TYPE_INTERFACE, /* 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_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ |
||||
CDC_OUT_EP, /* bEndpointAddress */ |
||||
0x02, /* bmAttributes: Bulk */ |
||||
LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize */ |
||||
HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), |
||||
0x00, /* bInterval */ |
||||
|
||||
/* Endpoint IN Descriptor */ |
||||
0x07, /* bLength: Endpoint Descriptor size */ |
||||
USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ |
||||
CDC_IN_EP, /* bEndpointAddress */ |
||||
0x02, /* bmAttributes: Bulk */ |
||||
LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize */ |
||||
HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), |
||||
0x00 /* bInterval */ |
||||
}; |
||||
#endif /* USE_USBD_COMPOSITE */ |
||||
|
||||
static uint8_t CDCInEpAdd = CDC_IN_EP; |
||||
static uint8_t CDCOutEpAdd = CDC_OUT_EP; |
||||
static uint8_t CDCCmdEpAdd = CDC_CMD_EP; |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBD_CDC_Private_Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief USBD_CDC_Init |
||||
* Initialize the CDC interface |
||||
* @param pdev: device instance |
||||
* @param cfgidx: Configuration index |
||||
* @retval status |
||||
*/ |
||||
static uint8_t USBD_CDC_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) |
||||
{ |
||||
UNUSED(cfgidx); |
||||
USBD_CDC_HandleTypeDef *hcdc; |
||||
|
||||
hcdc = (USBD_CDC_HandleTypeDef *)USBD_malloc(sizeof(USBD_CDC_HandleTypeDef)); |
||||
|
||||
if (hcdc == NULL) |
||||
{ |
||||
pdev->pClassDataCmsit[pdev->classId] = NULL; |
||||
return (uint8_t)USBD_EMEM; |
||||
} |
||||
|
||||
(void)USBD_memset(hcdc, 0, sizeof(USBD_CDC_HandleTypeDef)); |
||||
|
||||
pdev->pClassDataCmsit[pdev->classId] = (void *)hcdc; |
||||
pdev->pClassData = pdev->pClassDataCmsit[pdev->classId]; |
||||
|
||||
#ifdef USE_USBD_COMPOSITE |
||||
/* Get the Endpoints addresses allocated for this class instance */ |
||||
CDCInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK); |
||||
CDCOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK); |
||||
CDCCmdEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_INTR); |
||||
#endif /* USE_USBD_COMPOSITE */ |
||||
|
||||
if (pdev->dev_speed == USBD_SPEED_HIGH) |
||||
{ |
||||
/* Open EP IN */ |
||||
(void)USBD_LL_OpenEP(pdev, CDCInEpAdd, USBD_EP_TYPE_BULK, |
||||
CDC_DATA_HS_IN_PACKET_SIZE); |
||||
|
||||
pdev->ep_in[CDCInEpAdd & 0xFU].is_used = 1U; |
||||
|
||||
/* Open EP OUT */ |
||||
(void)USBD_LL_OpenEP(pdev, CDCOutEpAdd, USBD_EP_TYPE_BULK, |
||||
CDC_DATA_HS_OUT_PACKET_SIZE); |
||||
|
||||
pdev->ep_out[CDCOutEpAdd & 0xFU].is_used = 1U; |
||||
|
||||
/* Set bInterval for CDC CMD Endpoint */ |
||||
pdev->ep_in[CDCCmdEpAdd & 0xFU].bInterval = CDC_HS_BINTERVAL; |
||||
} |
||||
else |
||||
{ |
||||
/* Open EP IN */ |
||||
(void)USBD_LL_OpenEP(pdev, CDCInEpAdd, USBD_EP_TYPE_BULK, |
||||
CDC_DATA_FS_IN_PACKET_SIZE); |
||||
|
||||
pdev->ep_in[CDCInEpAdd & 0xFU].is_used = 1U; |
||||
|
||||
/* Open EP OUT */ |
||||
(void)USBD_LL_OpenEP(pdev, CDCOutEpAdd, USBD_EP_TYPE_BULK, |
||||
CDC_DATA_FS_OUT_PACKET_SIZE); |
||||
|
||||
pdev->ep_out[CDCOutEpAdd & 0xFU].is_used = 1U; |
||||
|
||||
/* Set bInterval for CMD Endpoint */ |
||||
pdev->ep_in[CDCCmdEpAdd & 0xFU].bInterval = CDC_FS_BINTERVAL; |
||||
} |
||||
|
||||
/* Open Command IN EP */ |
||||
(void)USBD_LL_OpenEP(pdev, CDCCmdEpAdd, USBD_EP_TYPE_INTR, CDC_CMD_PACKET_SIZE); |
||||
pdev->ep_in[CDCCmdEpAdd & 0xFU].is_used = 1U; |
||||
|
||||
hcdc->RxBuffer = NULL; |
||||
|
||||
/* Init physical Interface components */ |
||||
((USBD_CDC_ItfTypeDef *)pdev->pUserData[pdev->classId])->Init(); |
||||
|
||||
/* Init Xfer states */ |
||||
hcdc->TxState = 0U; |
||||
hcdc->RxState = 0U; |
||||
|
||||
if (hcdc->RxBuffer == NULL) |
||||
{ |
||||
return (uint8_t)USBD_EMEM; |
||||
} |
||||
|
||||
if (pdev->dev_speed == USBD_SPEED_HIGH) |
||||
{ |
||||
/* Prepare Out endpoint to receive next packet */ |
||||
(void)USBD_LL_PrepareReceive(pdev, CDCOutEpAdd, hcdc->RxBuffer, |
||||
CDC_DATA_HS_OUT_PACKET_SIZE); |
||||
} |
||||
else |
||||
{ |
||||
/* Prepare Out endpoint to receive next packet */ |
||||
(void)USBD_LL_PrepareReceive(pdev, CDCOutEpAdd, hcdc->RxBuffer, |
||||
CDC_DATA_FS_OUT_PACKET_SIZE); |
||||
} |
||||
|
||||
return (uint8_t)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(USBD_HandleTypeDef *pdev, uint8_t cfgidx) |
||||
{ |
||||
UNUSED(cfgidx); |
||||
|
||||
|
||||
#ifdef USE_USBD_COMPOSITE |
||||
/* Get the Endpoints addresses allocated for this CDC class instance */ |
||||
CDCInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK); |
||||
CDCOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK); |
||||
CDCCmdEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_INTR); |
||||
#endif /* USE_USBD_COMPOSITE */ |
||||
|
||||
/* Close EP IN */ |
||||
(void)USBD_LL_CloseEP(pdev, CDCInEpAdd); |
||||
pdev->ep_in[CDCInEpAdd & 0xFU].is_used = 0U; |
||||
|
||||
/* Close EP OUT */ |
||||
(void)USBD_LL_CloseEP(pdev, CDCOutEpAdd); |
||||
pdev->ep_out[CDCOutEpAdd & 0xFU].is_used = 0U; |
||||
|
||||
/* Close Command IN EP */ |
||||
(void)USBD_LL_CloseEP(pdev, CDCCmdEpAdd); |
||||
pdev->ep_in[CDCCmdEpAdd & 0xFU].is_used = 0U; |
||||
pdev->ep_in[CDCCmdEpAdd & 0xFU].bInterval = 0U; |
||||
|
||||
/* DeInit physical Interface components */ |
||||
if (pdev->pClassDataCmsit[pdev->classId] != NULL) |
||||
{ |
||||
((USBD_CDC_ItfTypeDef *)pdev->pUserData[pdev->classId])->DeInit(); |
||||
(void)USBD_free(pdev->pClassDataCmsit[pdev->classId]); |
||||
pdev->pClassDataCmsit[pdev->classId] = NULL; |
||||
pdev->pClassData = NULL; |
||||
} |
||||
|
||||
return (uint8_t)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(USBD_HandleTypeDef *pdev, |
||||
USBD_SetupReqTypedef *req) |
||||
{ |
||||
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; |
||||
uint16_t len; |
||||
uint8_t ifalt = 0U; |
||||
uint16_t status_info = 0U; |
||||
USBD_StatusTypeDef ret = USBD_OK; |
||||
|
||||
if (hcdc == NULL) |
||||
{ |
||||
return (uint8_t)USBD_FAIL; |
||||
} |
||||
|
||||
switch (req->bmRequest & USB_REQ_TYPE_MASK) |
||||
{ |
||||
case USB_REQ_TYPE_CLASS: |
||||
if (req->wLength != 0U) |
||||
{ |
||||
if ((req->bmRequest & 0x80U) != 0U) |
||||
{ |
||||
((USBD_CDC_ItfTypeDef *)pdev->pUserData[pdev->classId])->Control(req->bRequest, |
||||
(uint8_t *)hcdc->data, |
||||
req->wLength); |
||||
|
||||
len = MIN(CDC_REQ_MAX_DATA_SIZE, req->wLength); |
||||
(void)USBD_CtlSendData(pdev, (uint8_t *)hcdc->data, len); |
||||
} |
||||
else |
||||
{ |
||||
hcdc->CmdOpCode = req->bRequest; |
||||
hcdc->CmdLength = (uint8_t)MIN(req->wLength, USB_MAX_EP0_SIZE); |
||||
|
||||
(void)USBD_CtlPrepareRx(pdev, (uint8_t *)hcdc->data, hcdc->CmdLength); |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
((USBD_CDC_ItfTypeDef *)pdev->pUserData[pdev->classId])->Control(req->bRequest, |
||||
(uint8_t *)req, 0U); |
||||
} |
||||
break; |
||||
|
||||
case USB_REQ_TYPE_STANDARD: |
||||
switch (req->bRequest) |
||||
{ |
||||
case USB_REQ_GET_STATUS: |
||||
if (pdev->dev_state == USBD_STATE_CONFIGURED) |
||||
{ |
||||
(void)USBD_CtlSendData(pdev, (uint8_t *)&status_info, 2U); |
||||
} |
||||
else |
||||
{ |
||||
USBD_CtlError(pdev, req); |
||||
ret = USBD_FAIL; |
||||
} |
||||
break; |
||||
|
||||
case USB_REQ_GET_INTERFACE: |
||||
if (pdev->dev_state == USBD_STATE_CONFIGURED) |
||||
{ |
||||
(void)USBD_CtlSendData(pdev, &ifalt, 1U); |
||||
} |
||||
else |
||||
{ |
||||
USBD_CtlError(pdev, req); |
||||
ret = USBD_FAIL; |
||||
} |
||||
break; |
||||
|
||||
case USB_REQ_SET_INTERFACE: |
||||
if (pdev->dev_state != USBD_STATE_CONFIGURED) |
||||
{ |
||||
USBD_CtlError(pdev, req); |
||||
ret = USBD_FAIL; |
||||
} |
||||
break; |
||||
|
||||
case USB_REQ_CLEAR_FEATURE: |
||||
break; |
||||
|
||||
default: |
||||
USBD_CtlError(pdev, req); |
||||
ret = USBD_FAIL; |
||||
break; |
||||
} |
||||
break; |
||||
|
||||
default: |
||||
USBD_CtlError(pdev, req); |
||||
ret = USBD_FAIL; |
||||
break; |
||||
} |
||||
|
||||
return (uint8_t)ret; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_CDC_DataIn |
||||
* Data sent on non-control IN endpoint |
||||
* @param pdev: device instance |
||||
* @param epnum: endpoint number |
||||
* @retval status |
||||
*/ |
||||
static uint8_t USBD_CDC_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum) |
||||
{ |
||||
USBD_CDC_HandleTypeDef *hcdc; |
||||
PCD_HandleTypeDef *hpcd = (PCD_HandleTypeDef *)pdev->pData; |
||||
|
||||
if (pdev->pClassDataCmsit[pdev->classId] == NULL) |
||||
{ |
||||
return (uint8_t)USBD_FAIL; |
||||
} |
||||
|
||||
hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; |
||||
|
||||
if ((pdev->ep_in[epnum & 0xFU].total_length > 0U) && |
||||
((pdev->ep_in[epnum & 0xFU].total_length % hpcd->IN_ep[epnum & 0xFU].maxpacket) == 0U)) |
||||
{ |
||||
/* Update the packet total length */ |
||||
pdev->ep_in[epnum & 0xFU].total_length = 0U; |
||||
|
||||
/* Send ZLP */ |
||||
(void)USBD_LL_Transmit(pdev, epnum, NULL, 0U); |
||||
} |
||||
else |
||||
{ |
||||
hcdc->TxState = 0U; |
||||
|
||||
if (((USBD_CDC_ItfTypeDef *)pdev->pUserData[pdev->classId])->TransmitCplt != NULL) |
||||
{ |
||||
((USBD_CDC_ItfTypeDef *)pdev->pUserData[pdev->classId])->TransmitCplt(hcdc->TxBuffer, &hcdc->TxLength, epnum); |
||||
} |
||||
} |
||||
|
||||
return (uint8_t)USBD_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_CDC_DataOut |
||||
* Data received on non-control Out endpoint |
||||
* @param pdev: device instance |
||||
* @param epnum: endpoint number |
||||
* @retval status |
||||
*/ |
||||
static uint8_t USBD_CDC_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum) |
||||
{ |
||||
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; |
||||
|
||||
if (pdev->pClassDataCmsit[pdev->classId] == NULL) |
||||
{ |
||||
return (uint8_t)USBD_FAIL; |
||||
} |
||||
|
||||
/* Get the received data length */ |
||||
hcdc->RxLength = USBD_LL_GetRxDataSize(pdev, epnum); |
||||
|
||||
/* USB data will be immediately processed, this allow next USB traffic being
|
||||
NAKed till the end of the application Xfer */ |
||||
|
||||
((USBD_CDC_ItfTypeDef *)pdev->pUserData[pdev->classId])->Receive(hcdc->RxBuffer, &hcdc->RxLength); |
||||
|
||||
return (uint8_t)USBD_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_CDC_EP0_RxReady |
||||
* Handle EP0 Rx Ready event |
||||
* @param pdev: device instance |
||||
* @retval status |
||||
*/ |
||||
static uint8_t USBD_CDC_EP0_RxReady(USBD_HandleTypeDef *pdev) |
||||
{ |
||||
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; |
||||
|
||||
if (hcdc == NULL) |
||||
{ |
||||
return (uint8_t)USBD_FAIL; |
||||
} |
||||
|
||||
if ((pdev->pUserData[pdev->classId] != NULL) && (hcdc->CmdOpCode != 0xFFU)) |
||||
{ |
||||
((USBD_CDC_ItfTypeDef *)pdev->pUserData[pdev->classId])->Control(hcdc->CmdOpCode, |
||||
(uint8_t *)hcdc->data, |
||||
(uint16_t)hcdc->CmdLength); |
||||
hcdc->CmdOpCode = 0xFFU; |
||||
} |
||||
|
||||
return (uint8_t)USBD_OK; |
||||
} |
||||
#ifndef USE_USBD_COMPOSITE |
||||
/**
|
||||
* @brief USBD_CDC_GetFSCfgDesc |
||||
* Return configuration descriptor |
||||
* @param length : pointer data length |
||||
* @retval pointer to descriptor buffer |
||||
*/ |
||||
static uint8_t *USBD_CDC_GetFSCfgDesc(uint16_t *length) |
||||
{ |
||||
USBD_EpDescTypeDef *pEpCmdDesc = USBD_GetEpDesc(USBD_CDC_CfgDesc, CDC_CMD_EP); |
||||
USBD_EpDescTypeDef *pEpOutDesc = USBD_GetEpDesc(USBD_CDC_CfgDesc, CDC_OUT_EP); |
||||
USBD_EpDescTypeDef *pEpInDesc = USBD_GetEpDesc(USBD_CDC_CfgDesc, CDC_IN_EP); |
||||
|
||||
if (pEpCmdDesc != NULL) |
||||
{ |
||||
pEpCmdDesc->bInterval = CDC_FS_BINTERVAL; |
||||
} |
||||
|
||||
if (pEpOutDesc != NULL) |
||||
{ |
||||
pEpOutDesc->wMaxPacketSize = CDC_DATA_FS_MAX_PACKET_SIZE; |
||||
} |
||||
|
||||
if (pEpInDesc != NULL) |
||||
{ |
||||
pEpInDesc->wMaxPacketSize = CDC_DATA_FS_MAX_PACKET_SIZE; |
||||
} |
||||
|
||||
*length = (uint16_t)sizeof(USBD_CDC_CfgDesc); |
||||
return USBD_CDC_CfgDesc; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_CDC_GetHSCfgDesc |
||||
* Return configuration descriptor |
||||
* @param length : pointer data length |
||||
* @retval pointer to descriptor buffer |
||||
*/ |
||||
static uint8_t *USBD_CDC_GetHSCfgDesc(uint16_t *length) |
||||
{ |
||||
USBD_EpDescTypeDef *pEpCmdDesc = USBD_GetEpDesc(USBD_CDC_CfgDesc, CDC_CMD_EP); |
||||
USBD_EpDescTypeDef *pEpOutDesc = USBD_GetEpDesc(USBD_CDC_CfgDesc, CDC_OUT_EP); |
||||
USBD_EpDescTypeDef *pEpInDesc = USBD_GetEpDesc(USBD_CDC_CfgDesc, CDC_IN_EP); |
||||
|
||||
if (pEpCmdDesc != NULL) |
||||
{ |
||||
pEpCmdDesc->bInterval = CDC_HS_BINTERVAL; |
||||
} |
||||
|
||||
if (pEpOutDesc != NULL) |
||||
{ |
||||
pEpOutDesc->wMaxPacketSize = CDC_DATA_HS_MAX_PACKET_SIZE; |
||||
} |
||||
|
||||
if (pEpInDesc != NULL) |
||||
{ |
||||
pEpInDesc->wMaxPacketSize = CDC_DATA_HS_MAX_PACKET_SIZE; |
||||
} |
||||
|
||||
*length = (uint16_t)sizeof(USBD_CDC_CfgDesc); |
||||
return USBD_CDC_CfgDesc; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_CDC_GetOtherSpeedCfgDesc |
||||
* Return configuration descriptor |
||||
* @param length : pointer data length |
||||
* @retval pointer to descriptor buffer |
||||
*/ |
||||
static uint8_t *USBD_CDC_GetOtherSpeedCfgDesc(uint16_t *length) |
||||
{ |
||||
USBD_EpDescTypeDef *pEpCmdDesc = USBD_GetEpDesc(USBD_CDC_CfgDesc, CDC_CMD_EP); |
||||
USBD_EpDescTypeDef *pEpOutDesc = USBD_GetEpDesc(USBD_CDC_CfgDesc, CDC_OUT_EP); |
||||
USBD_EpDescTypeDef *pEpInDesc = USBD_GetEpDesc(USBD_CDC_CfgDesc, CDC_IN_EP); |
||||
|
||||
if (pEpCmdDesc != NULL) |
||||
{ |
||||
pEpCmdDesc->bInterval = CDC_FS_BINTERVAL; |
||||
} |
||||
|
||||
if (pEpOutDesc != NULL) |
||||
{ |
||||
pEpOutDesc->wMaxPacketSize = CDC_DATA_FS_MAX_PACKET_SIZE; |
||||
} |
||||
|
||||
if (pEpInDesc != NULL) |
||||
{ |
||||
pEpInDesc->wMaxPacketSize = CDC_DATA_FS_MAX_PACKET_SIZE; |
||||
} |
||||
|
||||
*length = (uint16_t)sizeof(USBD_CDC_CfgDesc); |
||||
return USBD_CDC_CfgDesc; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_CDC_GetDeviceQualifierDescriptor |
||||
* return Device Qualifier descriptor |
||||
* @param length : pointer data length |
||||
* @retval pointer to descriptor buffer |
||||
*/ |
||||
uint8_t *USBD_CDC_GetDeviceQualifierDescriptor(uint16_t *length) |
||||
{ |
||||
*length = (uint16_t)sizeof(USBD_CDC_DeviceQualifierDesc); |
||||
|
||||
return USBD_CDC_DeviceQualifierDesc; |
||||
} |
||||
#endif /* USE_USBD_COMPOSITE */ |
||||
/**
|
||||
* @brief USBD_CDC_RegisterInterface |
||||
* @param pdev: device instance |
||||
* @param fops: CD Interface callback |
||||
* @retval status |
||||
*/ |
||||
uint8_t USBD_CDC_RegisterInterface(USBD_HandleTypeDef *pdev, |
||||
USBD_CDC_ItfTypeDef *fops) |
||||
{ |
||||
if (fops == NULL) |
||||
{ |
||||
return (uint8_t)USBD_FAIL; |
||||
} |
||||
|
||||
pdev->pUserData[pdev->classId] = fops; |
||||
|
||||
return (uint8_t)USBD_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_CDC_SetTxBuffer |
||||
* @param pdev: device instance |
||||
* @param pbuff: Tx Buffer |
||||
* @param length: Tx Buffer length |
||||
* @retval status |
||||
*/ |
||||
uint8_t USBD_CDC_SetTxBuffer(USBD_HandleTypeDef *pdev, |
||||
uint8_t *pbuff, uint32_t length) |
||||
{ |
||||
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; |
||||
|
||||
if (hcdc == NULL) |
||||
{ |
||||
return (uint8_t)USBD_FAIL; |
||||
} |
||||
|
||||
hcdc->TxBuffer = pbuff; |
||||
hcdc->TxLength = length; |
||||
|
||||
return (uint8_t)USBD_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_CDC_SetRxBuffer |
||||
* @param pdev: device instance |
||||
* @param pbuff: Rx Buffer |
||||
* @retval status |
||||
*/ |
||||
uint8_t USBD_CDC_SetRxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff) |
||||
{ |
||||
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; |
||||
|
||||
if (hcdc == NULL) |
||||
{ |
||||
return (uint8_t)USBD_FAIL; |
||||
} |
||||
|
||||
hcdc->RxBuffer = pbuff; |
||||
|
||||
return (uint8_t)USBD_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_CDC_TransmitPacket |
||||
* Transmit packet on IN endpoint |
||||
* @param pdev: device instance |
||||
* @retval status |
||||
*/ |
||||
uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev) |
||||
{ |
||||
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; |
||||
USBD_StatusTypeDef ret = USBD_BUSY; |
||||
|
||||
#ifdef USE_USBD_COMPOSITE |
||||
/* Get the Endpoints addresses allocated for this class instance */ |
||||
CDCInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK); |
||||
#endif /* USE_USBD_COMPOSITE */ |
||||
if (pdev->pClassDataCmsit[pdev->classId] == NULL) |
||||
{ |
||||
return (uint8_t)USBD_FAIL; |
||||
} |
||||
|
||||
if (hcdc->TxState == 0U) |
||||
{ |
||||
/* Tx Transfer in progress */ |
||||
hcdc->TxState = 1U; |
||||
|
||||
/* Update the packet total length */ |
||||
pdev->ep_in[CDCInEpAdd & 0xFU].total_length = hcdc->TxLength; |
||||
|
||||
/* Transmit next packet */ |
||||
(void)USBD_LL_Transmit(pdev, CDCInEpAdd, hcdc->TxBuffer, hcdc->TxLength); |
||||
|
||||
ret = USBD_OK; |
||||
} |
||||
|
||||
return (uint8_t)ret; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_CDC_ReceivePacket |
||||
* prepare OUT Endpoint for reception |
||||
* @param pdev: device instance |
||||
* @retval status |
||||
*/ |
||||
uint8_t USBD_CDC_ReceivePacket(USBD_HandleTypeDef *pdev) |
||||
{ |
||||
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; |
||||
|
||||
#ifdef USE_USBD_COMPOSITE |
||||
/* Get the Endpoints addresses allocated for this class instance */ |
||||
CDCOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK); |
||||
#endif /* USE_USBD_COMPOSITE */ |
||||
|
||||
if (pdev->pClassDataCmsit[pdev->classId] == NULL) |
||||
{ |
||||
return (uint8_t)USBD_FAIL; |
||||
} |
||||
|
||||
if (pdev->dev_speed == USBD_SPEED_HIGH) |
||||
{ |
||||
/* Prepare Out endpoint to receive next packet */ |
||||
(void)USBD_LL_PrepareReceive(pdev, CDCOutEpAdd, hcdc->RxBuffer, |
||||
CDC_DATA_HS_OUT_PACKET_SIZE); |
||||
} |
||||
else |
||||
{ |
||||
/* Prepare Out endpoint to receive next packet */ |
||||
(void)USBD_LL_PrepareReceive(pdev, CDCOutEpAdd, hcdc->RxBuffer, |
||||
CDC_DATA_FS_OUT_PACKET_SIZE); |
||||
} |
||||
|
||||
return (uint8_t)USBD_OK; |
||||
} |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
@ -0,0 +1,172 @@
|
||||
/**
|
||||
****************************************************************************** |
||||
* @file usbd_core.h |
||||
* @author MCD Application Team |
||||
* @brief Header file for usbd_core.c file |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* Copyright (c) 2015 STMicroelectronics. |
||||
* All rights reserved. |
||||
* |
||||
* This software is licensed under terms that can be found in the LICENSE file |
||||
* in the root directory of this software component. |
||||
* If no LICENSE file comes with this software, it is provided AS-IS. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __USBD_CORE_H |
||||
#define __USBD_CORE_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbd_conf.h" |
||||
#include "usbd_def.h" |
||||
#include "usbd_ioreq.h" |
||||
#include "usbd_ctlreq.h" |
||||
|
||||
/** @addtogroup STM32_USB_DEVICE_LIBRARY
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup USBD_CORE
|
||||
* @brief This file is the Header file for usbd_core.c file |
||||
* @{ |
||||
*/ |
||||
|
||||
|
||||
/** @defgroup USBD_CORE_Exported_Defines
|
||||
* @{ |
||||
*/ |
||||
#ifndef USBD_DEBUG_LEVEL |
||||
#define USBD_DEBUG_LEVEL 0U |
||||
#endif /* USBD_DEBUG_LEVEL */ |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/** @defgroup USBD_CORE_Exported_TypesDefinitions
|
||||
* @{ |
||||
*/ |
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
|
||||
/** @defgroup USBD_CORE_Exported_Macros
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBD_CORE_Exported_Variables
|
||||
* @{ |
||||
*/ |
||||
#define USBD_SOF USBD_LL_SOF |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBD_CORE_Exported_FunctionsPrototype
|
||||
* @{ |
||||
*/ |
||||
USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef *pdev, USBD_DescriptorsTypeDef *pdesc, uint8_t id); |
||||
USBD_StatusTypeDef USBD_DeInit(USBD_HandleTypeDef *pdev); |
||||
USBD_StatusTypeDef USBD_Start(USBD_HandleTypeDef *pdev); |
||||
USBD_StatusTypeDef USBD_Stop(USBD_HandleTypeDef *pdev); |
||||
USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass); |
||||
|
||||
#ifdef USE_USBD_COMPOSITE |
||||
USBD_StatusTypeDef USBD_RegisterClassComposite(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass, |
||||
USBD_CompositeClassTypeDef classtype, uint8_t *EpAddr); |
||||
|
||||
USBD_StatusTypeDef USBD_UnRegisterClassComposite(USBD_HandleTypeDef *pdev); |
||||
uint8_t USBD_CoreGetEPAdd(USBD_HandleTypeDef *pdev, uint8_t ep_dir, uint8_t ep_type); |
||||
#endif /* USE_USBD_COMPOSITE */ |
||||
|
||||
uint8_t USBD_CoreFindIF(USBD_HandleTypeDef *pdev, uint8_t index); |
||||
uint8_t USBD_CoreFindEP(USBD_HandleTypeDef *pdev, uint8_t index); |
||||
|
||||
USBD_StatusTypeDef USBD_RunTestMode(USBD_HandleTypeDef *pdev); |
||||
USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx); |
||||
USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx); |
||||
|
||||
USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup); |
||||
USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev, uint8_t epnum, uint8_t *pdata); |
||||
USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev, uint8_t epnum, uint8_t *pdata); |
||||
|
||||
USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev); |
||||
USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef *pdev, USBD_SpeedTypeDef speed); |
||||
USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef *pdev); |
||||
USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef *pdev); |
||||
|
||||
USBD_StatusTypeDef USBD_LL_SOF(USBD_HandleTypeDef *pdev); |
||||
USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum); |
||||
USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum); |
||||
|
||||
USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev); |
||||
USBD_StatusTypeDef USBD_LL_DevDisconnected(USBD_HandleTypeDef *pdev); |
||||
|
||||
/* USBD Low Level Driver */ |
||||
USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev); |
||||
USBD_StatusTypeDef USBD_LL_DeInit(USBD_HandleTypeDef *pdev); |
||||
USBD_StatusTypeDef USBD_LL_Start(USBD_HandleTypeDef *pdev); |
||||
USBD_StatusTypeDef USBD_LL_Stop(USBD_HandleTypeDef *pdev); |
||||
|
||||
USBD_StatusTypeDef USBD_LL_OpenEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr, |
||||
uint8_t ep_type, uint16_t ep_mps); |
||||
|
||||
USBD_StatusTypeDef USBD_LL_CloseEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); |
||||
USBD_StatusTypeDef USBD_LL_FlushEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); |
||||
USBD_StatusTypeDef USBD_LL_StallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); |
||||
USBD_StatusTypeDef USBD_LL_ClearStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); |
||||
USBD_StatusTypeDef USBD_LL_SetUSBAddress(USBD_HandleTypeDef *pdev, uint8_t dev_addr); |
||||
|
||||
USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, uint8_t ep_addr, |
||||
uint8_t *pbuf, uint32_t size); |
||||
|
||||
USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, uint8_t ep_addr, |
||||
uint8_t *pbuf, uint32_t size); |
||||
|
||||
#ifdef USBD_HS_TESTMODE_ENABLE |
||||
USBD_StatusTypeDef USBD_LL_SetTestMode(USBD_HandleTypeDef *pdev, uint8_t testmode); |
||||
#endif /* USBD_HS_TESTMODE_ENABLE */ |
||||
|
||||
uint8_t USBD_LL_IsStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); |
||||
uint32_t USBD_LL_GetRxDataSize(USBD_HandleTypeDef *pdev, uint8_t ep_addr); |
||||
|
||||
void USBD_LL_Delay(uint32_t Delay); |
||||
|
||||
void *USBD_GetEpDesc(uint8_t *pConfDesc, uint8_t EpAddr); |
||||
USBD_DescHeaderTypeDef *USBD_GetNextDesc(uint8_t *pbuf, uint16_t *ptr); |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* __USBD_CORE_H */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
@ -0,0 +1,101 @@
|
||||
/**
|
||||
****************************************************************************** |
||||
* @file usbd_req.h |
||||
* @author MCD Application Team |
||||
* @brief Header file for the usbd_req.c file |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* Copyright (c) 2015 STMicroelectronics. |
||||
* All rights reserved. |
||||
* |
||||
* This software is licensed under terms that can be found in the LICENSE file |
||||
* in the root directory of this software component. |
||||
* If no LICENSE file comes with this software, it is provided AS-IS. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __USB_REQUEST_H |
||||
#define __USB_REQUEST_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbd_def.h" |
||||
|
||||
|
||||
/** @addtogroup STM32_USB_DEVICE_LIBRARY
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup USBD_REQ
|
||||
* @brief header file for the usbd_req.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_StatusTypeDef USBD_StdDevReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); |
||||
USBD_StatusTypeDef USBD_StdItfReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); |
||||
USBD_StatusTypeDef USBD_StdEPReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); |
||||
|
||||
void USBD_CtlError(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); |
||||
void USBD_ParseSetupRequest(USBD_SetupReqTypedef *req, uint8_t *pdata); |
||||
void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len); |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* __USB_REQUEST_H */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
@ -0,0 +1,514 @@
|
||||
/**
|
||||
****************************************************************************** |
||||
* @file usbd_def.h |
||||
* @author MCD Application Team |
||||
* @brief General defines for the usb device library |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* Copyright (c) 2015 STMicroelectronics. |
||||
* All rights reserved. |
||||
* |
||||
* This software is licensed under terms that can be found in the LICENSE file |
||||
* in the root directory of this software component. |
||||
* If no LICENSE file comes with this software, it is provided AS-IS. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __USBD_DEF_H |
||||
#define __USBD_DEF_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbd_conf.h" |
||||
|
||||
/** @addtogroup STM32_USBD_DEVICE_LIBRARY
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup USB_DEF
|
||||
* @brief general defines for the usb device library file |
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup USB_DEF_Exported_Defines
|
||||
* @{ |
||||
*/ |
||||
|
||||
#ifndef NULL |
||||
#define NULL 0U |
||||
#endif /* NULL */ |
||||
|
||||
#ifndef USBD_MAX_NUM_INTERFACES |
||||
#define USBD_MAX_NUM_INTERFACES 1U |
||||
#endif /* USBD_MAX_NUM_CONFIGURATION */ |
||||
|
||||
#ifndef USBD_MAX_NUM_CONFIGURATION |
||||
#define USBD_MAX_NUM_CONFIGURATION 1U |
||||
#endif /* USBD_MAX_NUM_CONFIGURATION */ |
||||
|
||||
#ifdef USE_USBD_COMPOSITE |
||||
#ifndef USBD_MAX_SUPPORTED_CLASS |
||||
#define USBD_MAX_SUPPORTED_CLASS 4U |
||||
#endif /* USBD_MAX_SUPPORTED_CLASS */ |
||||
#else |
||||
#ifndef USBD_MAX_SUPPORTED_CLASS |
||||
#define USBD_MAX_SUPPORTED_CLASS 1U |
||||
#endif /* USBD_MAX_SUPPORTED_CLASS */ |
||||
#endif /* USE_USBD_COMPOSITE */ |
||||
|
||||
#ifndef USBD_MAX_CLASS_ENDPOINTS |
||||
#define USBD_MAX_CLASS_ENDPOINTS 5U |
||||
#endif /* USBD_MAX_CLASS_ENDPOINTS */ |
||||
|
||||
#ifndef USBD_MAX_CLASS_INTERFACES |
||||
#define USBD_MAX_CLASS_INTERFACES 5U |
||||
#endif /* USBD_MAX_CLASS_INTERFACES */ |
||||
|
||||
#ifndef USBD_LPM_ENABLED |
||||
#define USBD_LPM_ENABLED 0U |
||||
#endif /* USBD_LPM_ENABLED */ |
||||
|
||||
#ifndef USBD_SELF_POWERED |
||||
#define USBD_SELF_POWERED 1U |
||||
#endif /*USBD_SELF_POWERED */ |
||||
|
||||
#ifndef USBD_MAX_POWER |
||||
#define USBD_MAX_POWER 0x32U /* 100 mA */ |
||||
#endif /* USBD_MAX_POWER */ |
||||
|
||||
#ifndef USBD_SUPPORT_USER_STRING_DESC |
||||
#define USBD_SUPPORT_USER_STRING_DESC 0U |
||||
#endif /* USBD_SUPPORT_USER_STRING_DESC */ |
||||
|
||||
#ifndef USBD_CLASS_USER_STRING_DESC |
||||
#define USBD_CLASS_USER_STRING_DESC 0U |
||||
#endif /* USBD_CLASS_USER_STRING_DESC */ |
||||
|
||||
#define USB_LEN_DEV_QUALIFIER_DESC 0x0AU |
||||
#define USB_LEN_DEV_DESC 0x12U |
||||
#define USB_LEN_CFG_DESC 0x09U |
||||
#define USB_LEN_IF_DESC 0x09U |
||||
#define USB_LEN_EP_DESC 0x07U |
||||
#define USB_LEN_OTG_DESC 0x03U |
||||
#define USB_LEN_LANGID_STR_DESC 0x04U |
||||
#define USB_LEN_OTHER_SPEED_DESC_SIZ 0x09U |
||||
|
||||
#define USBD_IDX_LANGID_STR 0x00U |
||||
#define USBD_IDX_MFC_STR 0x01U |
||||
#define USBD_IDX_PRODUCT_STR 0x02U |
||||
#define USBD_IDX_SERIAL_STR 0x03U |
||||
#define USBD_IDX_CONFIG_STR 0x04U |
||||
#define USBD_IDX_INTERFACE_STR 0x05U |
||||
|
||||
#define USB_REQ_TYPE_STANDARD 0x00U |
||||
#define USB_REQ_TYPE_CLASS 0x20U |
||||
#define USB_REQ_TYPE_VENDOR 0x40U |
||||
#define USB_REQ_TYPE_MASK 0x60U |
||||
|
||||
#define USB_REQ_RECIPIENT_DEVICE 0x00U |
||||
#define USB_REQ_RECIPIENT_INTERFACE 0x01U |
||||
#define USB_REQ_RECIPIENT_ENDPOINT 0x02U |
||||
#define USB_REQ_RECIPIENT_MASK 0x03U |
||||
|
||||
#define USB_REQ_GET_STATUS 0x00U |
||||
#define USB_REQ_CLEAR_FEATURE 0x01U |
||||
#define USB_REQ_SET_FEATURE 0x03U |
||||
#define USB_REQ_SET_ADDRESS 0x05U |
||||
#define USB_REQ_GET_DESCRIPTOR 0x06U |
||||
#define USB_REQ_SET_DESCRIPTOR 0x07U |
||||
#define USB_REQ_GET_CONFIGURATION 0x08U |
||||
#define USB_REQ_SET_CONFIGURATION 0x09U |
||||
#define USB_REQ_GET_INTERFACE 0x0AU |
||||
#define USB_REQ_SET_INTERFACE 0x0BU |
||||
#define USB_REQ_SYNCH_FRAME 0x0CU |
||||
|
||||
#define USB_DESC_TYPE_DEVICE 0x01U |
||||
#define USB_DESC_TYPE_CONFIGURATION 0x02U |
||||
#define USB_DESC_TYPE_STRING 0x03U |
||||
#define USB_DESC_TYPE_INTERFACE 0x04U |
||||
#define USB_DESC_TYPE_ENDPOINT 0x05U |
||||
#define USB_DESC_TYPE_DEVICE_QUALIFIER 0x06U |
||||
#define USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION 0x07U |
||||
#define USB_DESC_TYPE_IAD 0x0BU |
||||
#define USB_DESC_TYPE_BOS 0x0FU |
||||
|
||||
#define USB_CONFIG_REMOTE_WAKEUP 0x02U |
||||
#define USB_CONFIG_SELF_POWERED 0x01U |
||||
|
||||
#define USB_FEATURE_EP_HALT 0x00U |
||||
#define USB_FEATURE_REMOTE_WAKEUP 0x01U |
||||
#define USB_FEATURE_TEST_MODE 0x02U |
||||
|
||||
#define USB_DEVICE_CAPABITY_TYPE 0x10U |
||||
|
||||
#define USB_CONF_DESC_SIZE 0x09U |
||||
#define USB_IF_DESC_SIZE 0x09U |
||||
#define USB_EP_DESC_SIZE 0x07U |
||||
#define USB_IAD_DESC_SIZE 0x08U |
||||
|
||||
#define USB_HS_MAX_PACKET_SIZE 512U |
||||
#define USB_FS_MAX_PACKET_SIZE 64U |
||||
#define USB_MAX_EP0_SIZE 64U |
||||
|
||||
/* Device Status */ |
||||
#define USBD_STATE_DEFAULT 0x01U |
||||
#define USBD_STATE_ADDRESSED 0x02U |
||||
#define USBD_STATE_CONFIGURED 0x03U |
||||
#define USBD_STATE_SUSPENDED 0x04U |
||||
|
||||
|
||||
/* EP0 State */ |
||||
#define USBD_EP0_IDLE 0x00U |
||||
#define USBD_EP0_SETUP 0x01U |
||||
#define USBD_EP0_DATA_IN 0x02U |
||||
#define USBD_EP0_DATA_OUT 0x03U |
||||
#define USBD_EP0_STATUS_IN 0x04U |
||||
#define USBD_EP0_STATUS_OUT 0x05U |
||||
#define USBD_EP0_STALL 0x06U |
||||
|
||||
#define USBD_EP_TYPE_CTRL 0x00U |
||||
#define USBD_EP_TYPE_ISOC 0x01U |
||||
#define USBD_EP_TYPE_BULK 0x02U |
||||
#define USBD_EP_TYPE_INTR 0x03U |
||||
|
||||
#ifdef USE_USBD_COMPOSITE |
||||
#define USBD_EP_IN 0x80U |
||||
#define USBD_EP_OUT 0x00U |
||||
#define USBD_FUNC_DESCRIPTOR_TYPE 0x24U |
||||
#define USBD_DESC_SUBTYPE_ACM 0x0FU |
||||
#define USBD_DESC_ECM_BCD_LOW 0x00U |
||||
#define USBD_DESC_ECM_BCD_HIGH 0x10U |
||||
#endif /* USE_USBD_COMPOSITE */ |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/** @defgroup USBD_DEF_Exported_TypesDefinitions
|
||||
* @{ |
||||
*/ |
||||
|
||||
typedef struct usb_setup_req |
||||
{ |
||||
uint8_t bmRequest; |
||||
uint8_t bRequest; |
||||
uint16_t wValue; |
||||
uint16_t wIndex; |
||||
uint16_t wLength; |
||||
} USBD_SetupReqTypedef; |
||||
|
||||
typedef struct |
||||
{ |
||||
uint8_t bLength; |
||||
uint8_t bDescriptorType; |
||||
uint16_t wTotalLength; |
||||
uint8_t bNumInterfaces; |
||||
uint8_t bConfigurationValue; |
||||
uint8_t iConfiguration; |
||||
uint8_t bmAttributes; |
||||
uint8_t bMaxPower; |
||||
} __PACKED USBD_ConfigDescTypeDef; |
||||
|
||||
typedef struct |
||||
{ |
||||
uint8_t bLength; |
||||
uint8_t bDescriptorType; |
||||
uint16_t wTotalLength; |
||||
uint8_t bNumDeviceCaps; |
||||
} USBD_BosDescTypeDef; |
||||
|
||||
typedef struct |
||||
{ |
||||
uint8_t bLength; |
||||
uint8_t bDescriptorType; |
||||
uint8_t bEndpointAddress; |
||||
uint8_t bmAttributes; |
||||
uint16_t wMaxPacketSize; |
||||
uint8_t bInterval; |
||||
} __PACKED USBD_EpDescTypeDef; |
||||
|
||||
typedef struct |
||||
{ |
||||
uint8_t bLength; |
||||
uint8_t bDescriptorType; |
||||
uint8_t bDescriptorSubType; |
||||
} USBD_DescHeaderTypeDef; |
||||
|
||||
struct _USBD_HandleTypeDef; |
||||
|
||||
typedef struct _Device_cb |
||||
{ |
||||
uint8_t (*Init)(struct _USBD_HandleTypeDef *pdev, uint8_t cfgidx); |
||||
uint8_t (*DeInit)(struct _USBD_HandleTypeDef *pdev, uint8_t cfgidx); |
||||
/* Control Endpoints*/ |
||||
uint8_t (*Setup)(struct _USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); |
||||
uint8_t (*EP0_TxSent)(struct _USBD_HandleTypeDef *pdev); |
||||
uint8_t (*EP0_RxReady)(struct _USBD_HandleTypeDef *pdev); |
||||
/* Class Specific Endpoints*/ |
||||
uint8_t (*DataIn)(struct _USBD_HandleTypeDef *pdev, uint8_t epnum); |
||||
uint8_t (*DataOut)(struct _USBD_HandleTypeDef *pdev, uint8_t epnum); |
||||
uint8_t (*SOF)(struct _USBD_HandleTypeDef *pdev); |
||||
uint8_t (*IsoINIncomplete)(struct _USBD_HandleTypeDef *pdev, uint8_t epnum); |
||||
uint8_t (*IsoOUTIncomplete)(struct _USBD_HandleTypeDef *pdev, uint8_t epnum); |
||||
|
||||
uint8_t *(*GetHSConfigDescriptor)(uint16_t *length); |
||||
uint8_t *(*GetFSConfigDescriptor)(uint16_t *length); |
||||
uint8_t *(*GetOtherSpeedConfigDescriptor)(uint16_t *length); |
||||
uint8_t *(*GetDeviceQualifierDescriptor)(uint16_t *length); |
||||
#if (USBD_SUPPORT_USER_STRING_DESC == 1U) |
||||
uint8_t *(*GetUsrStrDescriptor)(struct _USBD_HandleTypeDef *pdev, uint8_t index, uint16_t *length); |
||||
#endif /* USBD_SUPPORT_USER_STRING_DESC */ |
||||
|
||||
} USBD_ClassTypeDef; |
||||
|
||||
/* Following USB Device Speed */ |
||||
typedef enum |
||||
{ |
||||
USBD_SPEED_HIGH = 0U, |
||||
USBD_SPEED_FULL = 1U, |
||||
USBD_SPEED_LOW = 2U, |
||||
} USBD_SpeedTypeDef; |
||||
|
||||
/* Following USB Device status */ |
||||
typedef enum |
||||
{ |
||||
USBD_OK = 0U, |
||||
USBD_BUSY, |
||||
USBD_EMEM, |
||||
USBD_FAIL, |
||||
} USBD_StatusTypeDef; |
||||
|
||||
/* USB Device descriptors structure */ |
||||
typedef struct |
||||
{ |
||||
uint8_t *(*GetDeviceDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); |
||||
uint8_t *(*GetLangIDStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); |
||||
uint8_t *(*GetManufacturerStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); |
||||
uint8_t *(*GetProductStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); |
||||
uint8_t *(*GetSerialStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); |
||||
uint8_t *(*GetConfigurationStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); |
||||
uint8_t *(*GetInterfaceStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); |
||||
#if (USBD_CLASS_USER_STRING_DESC == 1) |
||||
uint8_t *(*GetUserStrDescriptor)(USBD_SpeedTypeDef speed, uint8_t idx, uint16_t *length); |
||||
#endif /* USBD_CLASS_USER_STRING_DESC */ |
||||
#if ((USBD_LPM_ENABLED == 1U) || (USBD_CLASS_BOS_ENABLED == 1)) |
||||
uint8_t *(*GetBOSDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); |
||||
#endif /* (USBD_LPM_ENABLED == 1U) || (USBD_CLASS_BOS_ENABLED == 1) */ |
||||
} USBD_DescriptorsTypeDef; |
||||
|
||||
/* USB Device handle structure */ |
||||
typedef struct |
||||
{ |
||||
uint32_t status; |
||||
uint32_t total_length; |
||||
uint32_t rem_length; |
||||
uint32_t maxpacket; |
||||
uint16_t is_used; |
||||
uint16_t bInterval; |
||||
} USBD_EndpointTypeDef; |
||||
|
||||
#ifdef USE_USBD_COMPOSITE |
||||
typedef enum |
||||
{ |
||||
CLASS_TYPE_NONE = 0, |
||||
CLASS_TYPE_HID = 1, |
||||
CLASS_TYPE_CDC = 2, |
||||
CLASS_TYPE_MSC = 3, |
||||
CLASS_TYPE_DFU = 4, |
||||
CLASS_TYPE_CHID = 5, |
||||
CLASS_TYPE_AUDIO = 6, |
||||
CLASS_TYPE_ECM = 7, |
||||
CLASS_TYPE_RNDIS = 8, |
||||
CLASS_TYPE_MTP = 9, |
||||
CLASS_TYPE_VIDEO = 10, |
||||
CLASS_TYPE_PRINTER = 11, |
||||
CLASS_TYPE_CCID = 12, |
||||
} USBD_CompositeClassTypeDef; |
||||
|
||||
|
||||
/* USB Device handle structure */ |
||||
typedef struct |
||||
{ |
||||
uint8_t add; |
||||
uint8_t type; |
||||
uint8_t size; |
||||
uint8_t is_used; |
||||
} USBD_EPTypeDef; |
||||
|
||||
/* USB Device handle structure */ |
||||
typedef struct |
||||
{ |
||||
USBD_CompositeClassTypeDef ClassType; |
||||
uint32_t ClassId; |
||||
uint32_t Active; |
||||
uint32_t NumEps; |
||||
USBD_EPTypeDef Eps[USBD_MAX_CLASS_ENDPOINTS]; |
||||
uint8_t *EpAdd; |
||||
uint32_t NumIf; |
||||
uint8_t Ifs[USBD_MAX_CLASS_INTERFACES]; |
||||
uint32_t CurrPcktSze; |
||||
} USBD_CompositeElementTypeDef; |
||||
#endif /* USE_USBD_COMPOSITE */ |
||||
|
||||
/* USB Device handle structure */ |
||||
typedef struct _USBD_HandleTypeDef |
||||
{ |
||||
uint8_t id; |
||||
uint32_t dev_config; |
||||
uint32_t dev_default_config; |
||||
uint32_t dev_config_status; |
||||
USBD_SpeedTypeDef dev_speed; |
||||
USBD_EndpointTypeDef ep_in[16]; |
||||
USBD_EndpointTypeDef ep_out[16]; |
||||
__IO uint32_t ep0_state; |
||||
uint32_t ep0_data_len; |
||||
__IO uint8_t dev_state; |
||||
__IO uint8_t dev_old_state; |
||||
uint8_t dev_address; |
||||
uint8_t dev_connection_status; |
||||
uint8_t dev_test_mode; |
||||
uint32_t dev_remote_wakeup; |
||||
uint8_t ConfIdx; |
||||
|
||||
USBD_SetupReqTypedef request; |
||||
USBD_DescriptorsTypeDef *pDesc; |
||||
USBD_ClassTypeDef *pClass[USBD_MAX_SUPPORTED_CLASS]; |
||||
void *pClassData; |
||||
void *pClassDataCmsit[USBD_MAX_SUPPORTED_CLASS]; |
||||
void *pUserData[USBD_MAX_SUPPORTED_CLASS]; |
||||
void *pData; |
||||
void *pBosDesc; |
||||
void *pConfDesc; |
||||
uint32_t classId; |
||||
uint32_t NumClasses; |
||||
#ifdef USE_USBD_COMPOSITE |
||||
USBD_CompositeElementTypeDef tclasslist[USBD_MAX_SUPPORTED_CLASS]; |
||||
#endif /* USE_USBD_COMPOSITE */ |
||||
} USBD_HandleTypeDef; |
||||
|
||||
/* USB Device endpoint direction */ |
||||
typedef enum |
||||
{ |
||||
OUT = 0x00, |
||||
IN = 0x80, |
||||
} USBD_EPDirectionTypeDef; |
||||
|
||||
typedef enum |
||||
{ |
||||
NETWORK_CONNECTION = 0x00, |
||||
RESPONSE_AVAILABLE = 0x01, |
||||
CONNECTION_SPEED_CHANGE = 0x2A |
||||
} USBD_CDC_NotifCodeTypeDef; |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
|
||||
/** @defgroup USBD_DEF_Exported_Macros
|
||||
* @{ |
||||
*/ |
||||
__STATIC_INLINE uint16_t SWAPBYTE(uint8_t *addr) |
||||
{ |
||||
uint16_t _SwapVal, _Byte1, _Byte2; |
||||
uint8_t *_pbuff = addr; |
||||
|
||||
_Byte1 = *(uint8_t *)_pbuff; |
||||
_pbuff++; |
||||
_Byte2 = *(uint8_t *)_pbuff; |
||||
|
||||
_SwapVal = (_Byte2 << 8) | _Byte1; |
||||
|
||||
return _SwapVal; |
||||
} |
||||
|
||||
#ifndef LOBYTE |
||||
#define LOBYTE(x) ((uint8_t)((x) & 0x00FFU)) |
||||
#endif /* LOBYTE */ |
||||
|
||||
#ifndef HIBYTE |
||||
#define HIBYTE(x) ((uint8_t)(((x) & 0xFF00U) >> 8U)) |
||||
#endif /* HIBYTE */ |
||||
|
||||
#ifndef MIN |
||||
#define MIN(a, b) (((a) < (b)) ? (a) : (b)) |
||||
#endif /* MIN */ |
||||
|
||||
#ifndef MAX |
||||
#define MAX(a, b) (((a) > (b)) ? (a) : (b)) |
||||
#endif /* MAX */ |
||||
|
||||
#if defined ( __GNUC__ ) |
||||
#ifndef __weak |
||||
#define __weak __attribute__((weak)) |
||||
#endif /* __weak */ |
||||
#ifndef __packed |
||||
#define __packed __attribute__((__packed__)) |
||||
#endif /* __packed */ |
||||
#endif /* __GNUC__ */ |
||||
|
||||
|
||||
/* 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 */ |
||||
|
||||
#if defined ( __GNUC__ ) && !defined (__CC_ARM) /* GNU Compiler */ |
||||
#ifndef __ALIGN_END |
||||
#define __ALIGN_END __attribute__ ((aligned (4U))) |
||||
#endif /* __ALIGN_END */ |
||||
#ifndef __ALIGN_BEGIN |
||||
#define __ALIGN_BEGIN |
||||
#endif /* __ALIGN_BEGIN */ |
||||
#else |
||||
#ifndef __ALIGN_END |
||||
#define __ALIGN_END |
||||
#endif /* __ALIGN_END */ |
||||
#ifndef __ALIGN_BEGIN |
||||
#if defined (__CC_ARM) /* ARM Compiler */ |
||||
#define __ALIGN_BEGIN __align(4U) |
||||
#elif defined (__ICCARM__) /* IAR Compiler */ |
||||
#define __ALIGN_BEGIN |
||||
#endif /* __CC_ARM */ |
||||
#endif /* __ALIGN_BEGIN */ |
||||
#endif /* __GNUC__ */ |
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBD_DEF_Exported_Variables
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBD_DEF_Exported_FunctionsPrototype
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* __USBD_DEF_H */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
@ -0,0 +1,113 @@
|
||||
/**
|
||||
****************************************************************************** |
||||
* @file usbd_ioreq.h |
||||
* @author MCD Application Team |
||||
* @brief Header file for the usbd_ioreq.c file |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* Copyright (c) 2015 STMicroelectronics. |
||||
* All rights reserved. |
||||
* |
||||
* This software is licensed under terms that can be found in the LICENSE file |
||||
* in the root directory of this software component. |
||||
* If no LICENSE file comes with this software, it is provided AS-IS. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __USBD_IOREQ_H |
||||
#define __USBD_IOREQ_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbd_def.h" |
||||
#include "usbd_core.h" |
||||
|
||||
/** @addtogroup STM32_USB_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_StatusTypeDef USBD_CtlSendData(USBD_HandleTypeDef *pdev, |
||||
uint8_t *pbuf, uint32_t len); |
||||
|
||||
USBD_StatusTypeDef USBD_CtlContinueSendData(USBD_HandleTypeDef *pdev, |
||||
uint8_t *pbuf, uint32_t len); |
||||
|
||||
USBD_StatusTypeDef USBD_CtlPrepareRx(USBD_HandleTypeDef *pdev, |
||||
uint8_t *pbuf, uint32_t len); |
||||
|
||||
USBD_StatusTypeDef USBD_CtlContinueRx(USBD_HandleTypeDef *pdev, |
||||
uint8_t *pbuf, uint32_t len); |
||||
|
||||
USBD_StatusTypeDef USBD_CtlSendStatus(USBD_HandleTypeDef *pdev); |
||||
USBD_StatusTypeDef USBD_CtlReceiveStatus(USBD_HandleTypeDef *pdev); |
||||
|
||||
uint32_t USBD_GetRxCount(USBD_HandleTypeDef *pdev, uint8_t ep_addr); |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* __USBD_IOREQ_H */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,224 @@
|
||||
/**
|
||||
****************************************************************************** |
||||
* @file usbd_ioreq.c |
||||
* @author MCD Application Team |
||||
* @brief This file provides the IO requests APIs for control endpoints. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* Copyright (c) 2015 STMicroelectronics. |
||||
* All rights reserved. |
||||
* |
||||
* This software is licensed under terms that can be found in the LICENSE file |
||||
* in the root directory of this software component. |
||||
* If no LICENSE file comes with this software, it is provided AS-IS. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbd_ioreq.h" |
||||
|
||||
/** @addtogroup STM32_USB_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_StatusTypeDef USBD_CtlSendData(USBD_HandleTypeDef *pdev, |
||||
uint8_t *pbuf, uint32_t len) |
||||
{ |
||||
/* Set EP0 State */ |
||||
pdev->ep0_state = USBD_EP0_DATA_IN; |
||||
pdev->ep_in[0].total_length = len; |
||||
|
||||
#ifdef USBD_AVOID_PACKET_SPLIT_MPS |
||||
pdev->ep_in[0].rem_length = 0U; |
||||
#else |
||||
pdev->ep_in[0].rem_length = len; |
||||
#endif /* USBD_AVOID_PACKET_SPLIT_MPS */ |
||||
|
||||
/* Start the transfer */ |
||||
(void)USBD_LL_Transmit(pdev, 0x00U, pbuf, len); |
||||
|
||||
return USBD_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @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_StatusTypeDef USBD_CtlContinueSendData(USBD_HandleTypeDef *pdev, |
||||
uint8_t *pbuf, uint32_t len) |
||||
{ |
||||
/* Start the next transfer */ |
||||
(void)USBD_LL_Transmit(pdev, 0x00U, pbuf, len); |
||||
|
||||
return USBD_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_CtlPrepareRx |
||||
* receive data on the ctl pipe |
||||
* @param pdev: device instance |
||||
* @param buff: pointer to data buffer |
||||
* @param len: length of data to be received |
||||
* @retval status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_CtlPrepareRx(USBD_HandleTypeDef *pdev, |
||||
uint8_t *pbuf, uint32_t len) |
||||
{ |
||||
/* Set EP0 State */ |
||||
pdev->ep0_state = USBD_EP0_DATA_OUT; |
||||
pdev->ep_out[0].total_length = len; |
||||
|
||||
#ifdef USBD_AVOID_PACKET_SPLIT_MPS |
||||
pdev->ep_out[0].rem_length = 0U; |
||||
#else |
||||
pdev->ep_out[0].rem_length = len; |
||||
#endif /* USBD_AVOID_PACKET_SPLIT_MPS */ |
||||
|
||||
/* Start the transfer */ |
||||
(void)USBD_LL_PrepareReceive(pdev, 0U, pbuf, len); |
||||
|
||||
return USBD_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_CtlContinueRx |
||||
* continue receive data on the ctl pipe |
||||
* @param pdev: device instance |
||||
* @param buff: pointer to data buffer |
||||
* @param len: length of data to be received |
||||
* @retval status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_CtlContinueRx(USBD_HandleTypeDef *pdev, |
||||
uint8_t *pbuf, uint32_t len) |
||||
{ |
||||
(void)USBD_LL_PrepareReceive(pdev, 0U, pbuf, len); |
||||
|
||||
return USBD_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_CtlSendStatus |
||||
* send zero lzngth packet on the ctl pipe |
||||
* @param pdev: device instance |
||||
* @retval status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_CtlSendStatus(USBD_HandleTypeDef *pdev) |
||||
{ |
||||
/* Set EP0 State */ |
||||
pdev->ep0_state = USBD_EP0_STATUS_IN; |
||||
|
||||
/* Start the transfer */ |
||||
(void)USBD_LL_Transmit(pdev, 0x00U, NULL, 0U); |
||||
|
||||
return USBD_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_CtlReceiveStatus |
||||
* receive zero lzngth packet on the ctl pipe |
||||
* @param pdev: device instance |
||||
* @retval status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_CtlReceiveStatus(USBD_HandleTypeDef *pdev) |
||||
{ |
||||
/* Set EP0 State */ |
||||
pdev->ep0_state = USBD_EP0_STATUS_OUT; |
||||
|
||||
/* Start the transfer */ |
||||
(void)USBD_LL_PrepareReceive(pdev, 0U, NULL, 0U); |
||||
|
||||
return USBD_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_GetRxCount |
||||
* returns the received data length |
||||
* @param pdev: device instance |
||||
* @param ep_addr: endpoint address |
||||
* @retval Rx Data blength |
||||
*/ |
||||
uint32_t USBD_GetRxCount(USBD_HandleTypeDef *pdev, uint8_t ep_addr) |
||||
{ |
||||
return USBD_LL_GetRxDataSize(pdev, ep_addr); |
||||
} |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
@ -0,0 +1,86 @@
|
||||
This software component is provided to you as part of a software package and |
||||
applicable license terms are in the Package_license file. If you received this |
||||
software component outside of a package or without applicable license terms, |
||||
the terms of the SLA0044 license shall apply and are fully reproduced below: |
||||
|
||||
SLA0044 Rev5/February 2018 |
||||
|
||||
Software license agreement |
||||
|
||||
ULTIMATE LIBERTY SOFTWARE LICENSE AGREEMENT |
||||
|
||||
BY INSTALLING, COPYING, DOWNLOADING, ACCESSING OR OTHERWISE USING THIS SOFTWARE |
||||
OR ANY PART THEREOF (AND THE RELATED DOCUMENTATION) FROM STMICROELECTRONICS |
||||
INTERNATIONAL N.V, SWISS BRANCH AND/OR ITS AFFILIATED COMPANIES |
||||
(STMICROELECTRONICS), THE RECIPIENT, ON BEHALF OF HIMSELF OR HERSELF, OR ON |
||||
BEHALF OF ANY ENTITY BY WHICH SUCH RECIPIENT IS EMPLOYED AND/OR ENGAGED AGREES |
||||
TO BE BOUND BY THIS SOFTWARE LICENSE AGREEMENT. |
||||
|
||||
Under STMicroelectronics’ intellectual property rights, the redistribution, |
||||
reproduction and use in source and binary forms of the software or any part |
||||
thereof, with or without modification, are permitted provided that the following |
||||
conditions are met: |
||||
|
||||
1. Redistribution of source code (modified or not) must retain any copyright |
||||
notice, this list of conditions and the disclaimer set forth below as items 10 |
||||
and 11. |
||||
|
||||
2. Redistributions in binary form, except as embedded into microcontroller or |
||||
microprocessor device manufactured by or for STMicroelectronics or a software |
||||
update for such device, must reproduce any copyright notice provided with the |
||||
binary code, this list of conditions, and the disclaimer set forth below as |
||||
items 10 and 11, in documentation and/or other materials provided with the |
||||
distribution. |
||||
|
||||
3. Neither the name of STMicroelectronics nor the names of other contributors to |
||||
this software may be used to endorse or promote products derived from this |
||||
software or part thereof without specific written permission. |
||||
|
||||
4. This software or any part thereof, including modifications and/or derivative |
||||
works of this software, must be used and execute solely and exclusively on or in |
||||
combination with a microcontroller or microprocessor device manufactured by or |
||||
for STMicroelectronics. |
||||
|
||||
5. No use, reproduction or redistribution of this software partially or totally |
||||
may be done in any manner that would subject this software to any Open Source |
||||
Terms. “Open Source Terms” shall mean any open source license which requires as |
||||
part of distribution of software that the source code of such software is |
||||
distributed therewith or otherwise made available, or open source license that |
||||
substantially complies with the Open Source definition specified at |
||||
www.opensource.org and any other comparable open source license such as for |
||||
example GNU General Public License (GPL), Eclipse Public License (EPL), Apache |
||||
Software License, BSD license or MIT license. |
||||
|
||||
6. STMicroelectronics has no obligation to provide any maintenance, support or |
||||
updates for the software. |
||||
|
||||
7. The software is and will remain the exclusive property of STMicroelectronics |
||||
and its licensors. The recipient will not take any action that jeopardizes |
||||
STMicroelectronics and its licensors' proprietary rights or acquire any rights |
||||
in the software, except the limited rights specified hereunder. |
||||
|
||||
8. The recipient shall comply with all applicable laws and regulations affecting |
||||
the use of the software or any part thereof including any applicable export |
||||
control law or regulation. |
||||
|
||||
9. Redistribution and use of this software or any part thereof other than as |
||||
permitted under this license is void and will automatically terminate your |
||||
rights under this license. |
||||
|
||||
10. THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" AND |
||||
ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
||||
IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
||||
NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY RIGHTS, WHICH ARE |
||||
DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT SHALL |
||||
STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, |
||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE |
||||
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
||||
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
11. EXCEPT AS EXPRESSLY PERMITTED HEREUNDER, NO LICENSE OR OTHER RIGHTS, WHETHER |
||||
EXPRESS OR IMPLIED, ARE GRANTED UNDER ANY PATENT OR OTHER INTELLECTUAL PROPERTY |
||||
RIGHTS OF STMICROELECTRONICS OR ANY THIRD PARTY. |
||||
|
@ -1,448 +0,0 @@
|
||||
/**
|
||||
****************************************************************************** |
||||
* @file usbh_cdc.h |
||||
* @author MCD Application Team |
||||
* @brief This file contains all the prototypes for the usbh_cdc.c |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics. |
||||
* All rights reserved.</center></h2> |
||||
* |
||||
* This software component is licensed by ST under Ultimate Liberty license |
||||
* SLA0044, the "License"; You may not use this file except in compliance with |
||||
* the License. You may obtain a copy of the License at: |
||||
* www.st.com/SLA0044 |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive ----------------------------------------------*/ |
||||
#ifndef __USBH_CDC_H |
||||
#define __USBH_CDC_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbh_core.h" |
||||
|
||||
|
||||
/** @addtogroup USBH_LIB
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @addtogroup USBH_CLASS
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @addtogroup USBH_CDC_CLASS
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup USBH_CDC_CORE
|
||||
* @brief This file is the Header file for usbh_core.c |
||||
* @{ |
||||
*/ |
||||
|
||||
|
||||
|
||||
|
||||
/*Communication Class codes*/ |
||||
#define USB_CDC_CLASS 0x02U |
||||
#define COMMUNICATION_INTERFACE_CLASS_CODE 0x02U |
||||
|
||||
/*Data Interface Class Codes*/ |
||||
#define DATA_INTERFACE_CLASS_CODE 0x0AU |
||||
|
||||
/*Communication sub class codes*/ |
||||
#define RESERVED 0x00U |
||||
#define DIRECT_LINE_CONTROL_MODEL 0x01U |
||||
#define ABSTRACT_CONTROL_MODEL 0x02U |
||||
#define TELEPHONE_CONTROL_MODEL 0x03U |
||||
#define MULTICHANNEL_CONTROL_MODEL 0x04U |
||||
#define CAPI_CONTROL_MODEL 0x05U |
||||
#define ETHERNET_NETWORKING_CONTROL_MODEL 0x06U |
||||
#define ATM_NETWORKING_CONTROL_MODEL 0x07U |
||||
|
||||
|
||||
/*Communication Interface Class Control Protocol Codes*/ |
||||
#define NO_CLASS_SPECIFIC_PROTOCOL_CODE 0x00U |
||||
#define COMMON_AT_COMMAND 0x01U |
||||
#define VENDOR_SPECIFIC 0xFFU |
||||
|
||||
|
||||
#define CS_INTERFACE 0x24U |
||||
#define CDC_PAGE_SIZE_64 0x40U |
||||
|
||||
/*Class-Specific Request Codes*/ |
||||
#define CDC_SEND_ENCAPSULATED_COMMAND 0x00U |
||||
#define CDC_GET_ENCAPSULATED_RESPONSE 0x01U |
||||
#define CDC_SET_COMM_FEATURE 0x02U |
||||
#define CDC_GET_COMM_FEATURE 0x03U |
||||
#define CDC_CLEAR_COMM_FEATURE 0x04U |
||||
|
||||
#define CDC_SET_AUX_LINE_STATE 0x10U |
||||
#define CDC_SET_HOOK_STATE 0x11U |
||||
#define CDC_PULSE_SETUP 0x12U |
||||
#define CDC_SEND_PULSE 0x13U |
||||
#define CDC_SET_PULSE_TIME 0x14U |
||||
#define CDC_RING_AUX_JACK 0x15U |
||||
|
||||
#define CDC_SET_LINE_CODING 0x20U |
||||
#define CDC_GET_LINE_CODING 0x21U |
||||
#define CDC_SET_CONTROL_LINE_STATE 0x22U |
||||
#define CDC_SEND_BREAK 0x23U |
||||
|
||||
#define CDC_SET_RINGER_PARMS 0x30U |
||||
#define CDC_GET_RINGER_PARMS 0x31U |
||||
#define CDC_SET_OPERATION_PARMS 0x32U |
||||
#define CDC_GET_OPERATION_PARMS 0x33U |
||||
#define CDC_SET_LINE_PARMS 0x34U |
||||
#define CDC_GET_LINE_PARMS 0x35U |
||||
#define CDC_DIAL_DIGITS 0x36U |
||||
#define CDC_SET_UNIT_PARAMETER 0x37U |
||||
#define CDC_GET_UNIT_PARAMETER 0x38U |
||||
#define CDC_CLEAR_UNIT_PARAMETER 0x39U |
||||
#define CDC_GET_PROFILE 0x3AU |
||||
|
||||
#define CDC_SET_ETHERNET_MULTICAST_FILTERS 0x40U |
||||
#define CDC_SET_ETHERNET_POWER_MANAGEMENT_PATTERN FILTER 0x41U |
||||
#define CDC_GET_ETHERNET_POWER_MANAGEMENT_PATTERN FILTER 0x42U |
||||
#define CDC_SET_ETHERNET_PACKET_FILTER 0x43U |
||||
#define CDC_GET_ETHERNET_STATISTIC 0x44U |
||||
|
||||
#define CDC_SET_ATM_DATA_FORMAT 0x50U |
||||
#define CDC_GET_ATM_DEVICE_STATISTICS 0x51U |
||||
#define CDC_SET_ATM_DEFAULT_VC 0x52U |
||||
#define CDC_GET_ATM_VC_STATISTICS 0x53U |
||||
|
||||
|
||||
/* wValue for SetControlLineState*/ |
||||
#define CDC_ACTIVATE_CARRIER_SIGNAL_RTS 0x0002U |
||||
#define CDC_DEACTIVATE_CARRIER_SIGNAL_RTS 0x0000U |
||||
#define CDC_ACTIVATE_SIGNAL_DTR 0x0001U |
||||
#define CDC_DEACTIVATE_SIGNAL_DTR 0x0000U |
||||
|
||||
#define LINE_CODING_STRUCTURE_SIZE 0x07U |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBH_CDC_CORE_Exported_Types
|
||||
* @{ |
||||
*/ |
||||
|
||||
/* States for CDC State Machine */ |
||||
typedef enum |
||||
{ |
||||
CDC_IDLE = 0U, |
||||
CDC_SEND_DATA, |
||||
CDC_SEND_DATA_WAIT, |
||||
CDC_RECEIVE_DATA, |
||||
CDC_RECEIVE_DATA_WAIT, |
||||
} |
||||
CDC_DataStateTypeDef; |
||||
|
||||
typedef enum |
||||
{ |
||||
CDC_IDLE_STATE = 0U, |
||||
CDC_SET_LINE_CODING_STATE, |
||||
CDC_GET_LAST_LINE_CODING_STATE, |
||||
CDC_TRANSFER_DATA, |
||||
CDC_ERROR_STATE, |
||||
} |
||||
CDC_StateTypeDef; |
||||
|
||||
|
||||
/*Line coding structure*/ |
||||
typedef union _CDC_LineCodingStructure |
||||
{ |
||||
uint8_t Array[LINE_CODING_STRUCTURE_SIZE]; |
||||
|
||||
struct |
||||
{ |
||||
|
||||
uint32_t dwDTERate; /*Data terminal rate, in bits per second*/ |
||||
uint8_t bCharFormat; /*Stop bits
|
||||
0 - 1 Stop bit |
||||
1 - 1.5 Stop bits |
||||
2 - 2 Stop bits*/ |
||||
uint8_t bParityType; /* Parity
|
||||
0 - None |
||||
1 - Odd |
||||
2 - Even |
||||
3 - Mark |
||||
4 - Space*/ |
||||
uint8_t bDataBits; /* Data bits (5, 6, 7, 8 or 16). */ |
||||
} b; |
||||
} |
||||
CDC_LineCodingTypeDef; |
||||
|
||||
|
||||
|
||||
/* Header Functional Descriptor
|
||||
-------------------------------------------------------------------------------- |
||||
Offset| field | Size | Value | Description |
||||
------|---------------------|-------|------------|------------------------------ |
||||
0 | bFunctionLength | 1 | number | Size of this descriptor. |
||||
1 | bDescriptorType | 1 | Constant | CS_INTERFACE (0x24) |
||||
2 | bDescriptorSubtype | 1 | Constant | Identifier (ID) of functional |
||||
| | | | descriptor. |
||||
3 | bcdCDC | 2 | | |
||||
| | | Number | USB Class Definitions for |
||||
| | | | Communication Devices Specification |
||||
| | | | release number in binary-coded |
||||
| | | | decimal |
||||
------|---------------------|-------|------------|------------------------------ |
||||
*/ |
||||
typedef struct _FunctionalDescriptorHeader |
||||
{ |
||||
uint8_t bLength; /*Size of this descriptor.*/ |
||||
uint8_t bDescriptorType; /*CS_INTERFACE (0x24)*/ |
||||
uint8_t bDescriptorSubType; /* Header functional descriptor subtype as*/ |
||||
uint16_t bcdCDC; /* USB Class Definitions for Communication
|
||||
Devices Specification release number in |
||||
binary-coded decimal. */ |
||||
} |
||||
CDC_HeaderFuncDesc_TypeDef; |
||||
/* Call Management Functional Descriptor
|
||||
-------------------------------------------------------------------------------- |
||||
Offset| field | Size | Value | Description |
||||
------|---------------------|-------|------------|------------------------------ |
||||
0 | bFunctionLength | 1 | number | Size of this descriptor. |
||||
1 | bDescriptorType | 1 | Constant | CS_INTERFACE (0x24) |
||||
2 | bDescriptorSubtype | 1 | Constant | Call Management functional |
||||
| | | | descriptor subtype. |
||||
3 | bmCapabilities | 1 | Bitmap | The capabilities that this configuration |
||||
| | | | supports: |
||||
| | | | D7..D2: RESERVED (Reset to zero) |
||||
| | | | D1: 0 - Device sends/receives call |
||||
| | | | management information only over |
||||
| | | | the Communication Class |
||||
| | | | interface. |
||||
| | | | 1 - Device can send/receive call |
||||
| \ | | management information over a |
||||
| | | | Data Class interface. |
||||
| | | | D0: 0 - Device does not handle call |
||||
| | | | management itself. |
||||
| | | | 1 - Device handles call |
||||
| | | | management itself. |
||||
| | | | The previous bits, in combination, identify |
||||
| | | | which call management scenario is used. If bit |
||||
| | | | D0 is reset to 0, then the value of bit D1 is |
||||
| | | | ignored. In this case, bit D1 is reset to zero for |
||||
| | | | future compatibility. |
||||
4 | bDataInterface | 1 | Number | Interface number of Data Class interface |
||||
| | | | optionally used for call management. |
||||
------|---------------------|-------|------------|------------------------------ |
||||
*/ |
||||
typedef struct _CallMgmtFunctionalDescriptor |
||||
{ |
||||
uint8_t bLength; /*Size of this functional descriptor, in bytes.*/ |
||||
uint8_t bDescriptorType; /*CS_INTERFACE (0x24)*/ |
||||
uint8_t bDescriptorSubType; /* Call Management functional descriptor subtype*/ |
||||
uint8_t bmCapabilities; /* bmCapabilities: D0+D1 */ |
||||
uint8_t bDataInterface; /*bDataInterface: 1*/ |
||||
} |
||||
CDC_CallMgmtFuncDesc_TypeDef; |
||||
/* Abstract Control Management Functional Descriptor
|
||||
-------------------------------------------------------------------------------- |
||||
Offset| field | Size | Value | Description |
||||
------|---------------------|-------|------------|------------------------------ |
||||
0 | bFunctionLength | 1 | number | Size of functional descriptor, in bytes. |
||||
1 | bDescriptorType | 1 | Constant | CS_INTERFACE (0x24) |
||||
2 | bDescriptorSubtype | 1 | Constant | Abstract Control Management |
||||
| | | | functional descriptor subtype. |
||||
3 | bmCapabilities | 1 | Bitmap | The capabilities that this configuration |
||||
| | | | supports ((A bit value of zero means that the |
||||
| | | | request is not supported.) ) |
||||
D7..D4: RESERVED (Reset to zero) |
||||
| | | | D3: 1 - Device supports the notification |
||||
| | | | Network_Connection. |
||||
| | | | D2: 1 - Device supports the request |
||||
| | | | Send_Break |
||||
| | | | D1: 1 - Device supports the request |
||||
| \ | | combination of Set_Line_Coding, |
||||
| | | | Set_Control_Line_State, Get_Line_Coding, and the |
||||
notification Serial_State. |
||||
| | | | D0: 1 - Device supports the request |
||||
| | | | combination of Set_Comm_Feature, |
||||
| | | | Clear_Comm_Feature, and Get_Comm_Feature. |
||||
| | | | The previous bits, in combination, identify |
||||
| | | | which requests/notifications are supported by |
||||
| | | | a Communication Class interface with the |
||||
| | | | SubClass code of Abstract Control Model. |
||||
------|---------------------|-------|------------|------------------------------ |
||||
*/ |
||||
typedef struct _AbstractCntrlMgmtFunctionalDescriptor |
||||
{ |
||||
uint8_t bLength; /*Size of this functional descriptor, in bytes.*/ |
||||
uint8_t bDescriptorType; /*CS_INTERFACE (0x24)*/ |
||||
uint8_t bDescriptorSubType; /* Abstract Control Management functional
|
||||
descriptor subtype*/ |
||||
uint8_t bmCapabilities; /* The capabilities that this configuration supports */ |
||||
} |
||||
CDC_AbstCntrlMgmtFuncDesc_TypeDef; |
||||
/* Union Functional Descriptor
|
||||
-------------------------------------------------------------------------------- |
||||
Offset| field | Size | Value | Description |
||||
------|---------------------|-------|------------|------------------------------ |
||||
0 | bFunctionLength | 1 | number | Size of this descriptor. |
||||
1 | bDescriptorType | 1 | Constant | CS_INTERFACE (0x24) |
||||
2 | bDescriptorSubtype | 1 | Constant | Union functional |
||||
| | | | descriptor subtype. |
||||
3 | bMasterInterface | 1 | Constant | The interface number of the |
||||
| | | | Communication or Data Class interface |
||||
4 | bSlaveInterface0 | 1 | Number | nterface number of first slave or associated |
||||
| | | | interface in the union. |
||||
------|---------------------|-------|------------|------------------------------ |
||||
*/ |
||||
typedef struct _UnionFunctionalDescriptor |
||||
{ |
||||
uint8_t bLength; /*Size of this functional descriptor, in bytes*/ |
||||
uint8_t bDescriptorType; /*CS_INTERFACE (0x24)*/ |
||||
uint8_t bDescriptorSubType; /* Union functional descriptor SubType*/ |
||||
uint8_t bMasterInterface; /* The interface number of the Communication or
|
||||
Data Class interface,*/ |
||||
uint8_t bSlaveInterface0; /*Interface number of first slave*/ |
||||
} |
||||
CDC_UnionFuncDesc_TypeDef; |
||||
|
||||
typedef struct _USBH_CDCInterfaceDesc |
||||
{ |
||||
CDC_HeaderFuncDesc_TypeDef CDC_HeaderFuncDesc; |
||||
CDC_CallMgmtFuncDesc_TypeDef CDC_CallMgmtFuncDesc; |
||||
CDC_AbstCntrlMgmtFuncDesc_TypeDef CDC_AbstCntrlMgmtFuncDesc; |
||||
CDC_UnionFuncDesc_TypeDef CDC_UnionFuncDesc; |
||||
} |
||||
CDC_InterfaceDesc_Typedef; |
||||
|
||||
|
||||
/* Structure for CDC process */ |
||||
typedef struct |
||||
{ |
||||
uint8_t NotifPipe; |
||||
uint8_t NotifEp; |
||||
uint8_t buff[8]; |
||||
uint16_t NotifEpSize; |
||||
} |
||||
CDC_CommItfTypedef ; |
||||
|
||||
typedef struct |
||||
{ |
||||
uint8_t InPipe; |
||||
uint8_t OutPipe; |
||||
uint8_t OutEp; |
||||
uint8_t InEp; |
||||
uint8_t buff[8]; |
||||
uint16_t OutEpSize; |
||||
uint16_t InEpSize; |
||||
} |
||||
CDC_DataItfTypedef ; |
||||
|
||||
/* Structure for CDC process */ |
||||
typedef struct _CDC_Process |
||||
{ |
||||
CDC_CommItfTypedef CommItf; |
||||
CDC_DataItfTypedef DataItf; |
||||
uint8_t *pTxData; |
||||
uint8_t *pRxData; |
||||
uint32_t TxDataLength; |
||||
uint32_t RxDataLength; |
||||
CDC_InterfaceDesc_Typedef CDC_Desc; |
||||
CDC_LineCodingTypeDef LineCoding; |
||||
CDC_LineCodingTypeDef *pUserLineCoding; |
||||
CDC_StateTypeDef state; |
||||
CDC_DataStateTypeDef data_tx_state; |
||||
CDC_DataStateTypeDef data_rx_state; |
||||
uint8_t Rx_Poll; |
||||
} |
||||
CDC_HandleTypeDef; |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBH_CDC_CORE_Exported_Defines
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBH_CDC_CORE_Exported_Macros
|
||||
* @{ |
||||
*/ |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBH_CDC_CORE_Exported_Variables
|
||||
* @{ |
||||
*/ |
||||
extern USBH_ClassTypeDef CDC_Class; |
||||
#define USBH_CDC_CLASS &CDC_Class |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBH_CDC_CORE_Exported_FunctionsPrototype
|
||||
* @{ |
||||
*/ |
||||
|
||||
USBH_StatusTypeDef USBH_CDC_SetLineCoding(USBH_HandleTypeDef *phost, |
||||
CDC_LineCodingTypeDef *linecoding); |
||||
|
||||
USBH_StatusTypeDef USBH_CDC_GetLineCoding(USBH_HandleTypeDef *phost, |
||||
CDC_LineCodingTypeDef *linecoding); |
||||
|
||||
USBH_StatusTypeDef USBH_CDC_Transmit(USBH_HandleTypeDef *phost, |
||||
uint8_t *pbuff, |
||||
uint32_t length); |
||||
|
||||
USBH_StatusTypeDef USBH_CDC_Receive(USBH_HandleTypeDef *phost, |
||||
uint8_t *pbuff, |
||||
uint32_t length); |
||||
|
||||
|
||||
uint16_t USBH_CDC_GetLastReceivedDataSize(USBH_HandleTypeDef *phost); |
||||
|
||||
USBH_StatusTypeDef USBH_CDC_Stop(USBH_HandleTypeDef *phost); |
||||
|
||||
void USBH_CDC_LineCodingChanged(USBH_HandleTypeDef *phost); |
||||
|
||||
void USBH_CDC_TransmitCallback(USBH_HandleTypeDef *phost); |
||||
|
||||
void USBH_CDC_ReceiveCallback(USBH_HandleTypeDef *phost); |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* __USBH_CDC_H */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
||||
|
@ -1,837 +0,0 @@
|
||||
/**
|
||||
****************************************************************************** |
||||
* @file usbh_cdc.c |
||||
* @author MCD Application Team |
||||
* @brief This file is the CDC Layer Handlers for USB Host CDC class. |
||||
* |
||||
* @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 |
||||
* |
||||
* @endverbatim |
||||
* |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics. |
||||
* All rights reserved.</center></h2> |
||||
* |
||||
* This software component is licensed by ST under Ultimate Liberty license |
||||
* SLA0044, the "License"; You may not use this file except in compliance with |
||||
* the License. You may obtain a copy of the License at: |
||||
* www.st.com/SLA0044 |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* BSPDependencies
|
||||
- "stm32xxxxx_{eval}{discovery}{nucleo_144}.c" |
||||
- "stm32xxxxx_{eval}{discovery}_io.c" |
||||
- "stm32xxxxx_{eval}{discovery}{adafruit}_sd.c" |
||||
- "stm32xxxxx_{eval}{discovery}{adafruit}_lcd.c" |
||||
- "stm32xxxxx_{eval}{discovery}_sdram.c" |
||||
EndBSPDependencies */ |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbh_cdc.h" |
||||
|
||||
/** @addtogroup USBH_LIB
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @addtogroup USBH_CLASS
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @addtogroup USBH_CDC_CLASS
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup USBH_CDC_CORE
|
||||
* @brief This file includes CDC Layer Handlers for USB Host CDC class. |
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup USBH_CDC_CORE_Private_TypesDefinitions
|
||||
* @{ |
||||
*/ |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/** @defgroup USBH_CDC_CORE_Private_Defines
|
||||
* @{ |
||||
*/ |
||||
#define USBH_CDC_BUFFER_SIZE 1024 |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/** @defgroup USBH_CDC_CORE_Private_Macros
|
||||
* @{ |
||||
*/ |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/** @defgroup USBH_CDC_CORE_Private_Variables
|
||||
* @{ |
||||
*/ |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/** @defgroup USBH_CDC_CORE_Private_FunctionPrototypes
|
||||
* @{ |
||||
*/ |
||||
|
||||
static USBH_StatusTypeDef USBH_CDC_InterfaceInit(USBH_HandleTypeDef *phost); |
||||
|
||||
static USBH_StatusTypeDef USBH_CDC_InterfaceDeInit(USBH_HandleTypeDef *phost); |
||||
|
||||
static USBH_StatusTypeDef USBH_CDC_Process(USBH_HandleTypeDef *phost); |
||||
|
||||
static USBH_StatusTypeDef USBH_CDC_SOFProcess(USBH_HandleTypeDef *phost); |
||||
|
||||
static USBH_StatusTypeDef USBH_CDC_ClassRequest(USBH_HandleTypeDef *phost); |
||||
|
||||
static USBH_StatusTypeDef GetLineCoding(USBH_HandleTypeDef *phost, |
||||
CDC_LineCodingTypeDef *linecoding); |
||||
|
||||
static USBH_StatusTypeDef SetLineCoding(USBH_HandleTypeDef *phost, |
||||
CDC_LineCodingTypeDef *linecoding); |
||||
|
||||
static void CDC_ProcessTransmission(USBH_HandleTypeDef *phost); |
||||
|
||||
static void CDC_ProcessReception(USBH_HandleTypeDef *phost); |
||||
|
||||
USBH_ClassTypeDef CDC_Class = |
||||
{ |
||||
"CDC", |
||||
USB_CDC_CLASS, |
||||
USBH_CDC_InterfaceInit, |
||||
USBH_CDC_InterfaceDeInit, |
||||
USBH_CDC_ClassRequest, |
||||
USBH_CDC_Process, |
||||
USBH_CDC_SOFProcess, |
||||
NULL, |
||||
}; |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/** @defgroup USBH_CDC_CORE_Private_Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief USBH_CDC_InterfaceInit |
||||
* The function init the CDC class. |
||||
* @param phost: Host handle |
||||
* @retval USBH Status |
||||
*/ |
||||
static USBH_StatusTypeDef USBH_CDC_InterfaceInit(USBH_HandleTypeDef *phost) |
||||
{ |
||||
|
||||
USBH_StatusTypeDef status; |
||||
uint8_t interface; |
||||
CDC_HandleTypeDef *CDC_Handle; |
||||
|
||||
interface = USBH_FindInterface(phost, COMMUNICATION_INTERFACE_CLASS_CODE, |
||||
ABSTRACT_CONTROL_MODEL, COMMON_AT_COMMAND); |
||||
|
||||
if ((interface == 0xFFU) || (interface >= USBH_MAX_NUM_INTERFACES)) /* No Valid Interface */ |
||||
{ |
||||
USBH_DbgLog("Cannot Find the interface for Communication Interface Class.", phost->pActiveClass->Name); |
||||
return USBH_FAIL; |
||||
} |
||||
|
||||
status = USBH_SelectInterface(phost, interface); |
||||
|
||||
if (status != USBH_OK) |
||||
{ |
||||
return USBH_FAIL; |
||||
} |
||||
|
||||
phost->pActiveClass->pData = (CDC_HandleTypeDef *)USBH_malloc(sizeof(CDC_HandleTypeDef)); |
||||
CDC_Handle = (CDC_HandleTypeDef *) phost->pActiveClass->pData; |
||||
|
||||
if (CDC_Handle == NULL) |
||||
{ |
||||
USBH_DbgLog("Cannot allocate memory for CDC Handle"); |
||||
return USBH_FAIL; |
||||
} |
||||
|
||||
/* Initialize cdc handler */ |
||||
(void)USBH_memset(CDC_Handle, 0, sizeof(CDC_HandleTypeDef)); |
||||
|
||||
/*Collect the notification endpoint address and length*/ |
||||
if ((phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[0].bEndpointAddress & 0x80U) != 0U) |
||||
{ |
||||
CDC_Handle->CommItf.NotifEp = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[0].bEndpointAddress; |
||||
CDC_Handle->CommItf.NotifEpSize = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[0].wMaxPacketSize; |
||||
} |
||||
|
||||
/*Allocate the length for host channel number in*/ |
||||
CDC_Handle->CommItf.NotifPipe = USBH_AllocPipe(phost, CDC_Handle->CommItf.NotifEp); |
||||
|
||||
/* Open pipe for Notification endpoint */ |
||||
(void)USBH_OpenPipe(phost, CDC_Handle->CommItf.NotifPipe, CDC_Handle->CommItf.NotifEp, |
||||
phost->device.address, phost->device.speed, USB_EP_TYPE_INTR, |
||||
CDC_Handle->CommItf.NotifEpSize); |
||||
|
||||
(void)USBH_LL_SetToggle(phost, CDC_Handle->CommItf.NotifPipe, 0U); |
||||
|
||||
interface = USBH_FindInterface(phost, DATA_INTERFACE_CLASS_CODE, |
||||
RESERVED, NO_CLASS_SPECIFIC_PROTOCOL_CODE); |
||||
|
||||
if ((interface == 0xFFU) || (interface >= USBH_MAX_NUM_INTERFACES)) /* No Valid Interface */ |
||||
{ |
||||
USBH_DbgLog("Cannot Find the interface for Data Interface Class.", phost->pActiveClass->Name); |
||||
return USBH_FAIL; |
||||
} |
||||
|
||||
/*Collect the class specific endpoint address and length*/ |
||||
if ((phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[0].bEndpointAddress & 0x80U) != 0U) |
||||
{ |
||||
CDC_Handle->DataItf.InEp = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[0].bEndpointAddress; |
||||
CDC_Handle->DataItf.InEpSize = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[0].wMaxPacketSize; |
||||
} |
||||
else |
||||
{ |
||||
CDC_Handle->DataItf.OutEp = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[0].bEndpointAddress; |
||||
CDC_Handle->DataItf.OutEpSize = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[0].wMaxPacketSize; |
||||
} |
||||
|
||||
if ((phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[1].bEndpointAddress & 0x80U) != 0U) |
||||
{ |
||||
CDC_Handle->DataItf.InEp = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[1].bEndpointAddress; |
||||
CDC_Handle->DataItf.InEpSize = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[1].wMaxPacketSize; |
||||
} |
||||
else |
||||
{ |
||||
CDC_Handle->DataItf.OutEp = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[1].bEndpointAddress; |
||||
CDC_Handle->DataItf.OutEpSize = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[1].wMaxPacketSize; |
||||
} |
||||
|
||||
/*Allocate the length for host channel number out*/ |
||||
CDC_Handle->DataItf.OutPipe = USBH_AllocPipe(phost, CDC_Handle->DataItf.OutEp); |
||||
|
||||
/*Allocate the length for host channel number in*/ |
||||
CDC_Handle->DataItf.InPipe = USBH_AllocPipe(phost, CDC_Handle->DataItf.InEp); |
||||
|
||||
/* Open channel for OUT endpoint */ |
||||
(void)USBH_OpenPipe(phost, CDC_Handle->DataItf.OutPipe, CDC_Handle->DataItf.OutEp, |
||||
phost->device.address, phost->device.speed, USB_EP_TYPE_BULK, |
||||
CDC_Handle->DataItf.OutEpSize); |
||||
|
||||
/* Open channel for IN endpoint */ |
||||
(void)USBH_OpenPipe(phost, CDC_Handle->DataItf.InPipe, CDC_Handle->DataItf.InEp, |
||||
phost->device.address, phost->device.speed, USB_EP_TYPE_BULK, |
||||
CDC_Handle->DataItf.InEpSize); |
||||
|
||||
CDC_Handle->state = CDC_IDLE_STATE; |
||||
|
||||
(void)USBH_LL_SetToggle(phost, CDC_Handle->DataItf.OutPipe, 0U); |
||||
(void)USBH_LL_SetToggle(phost, CDC_Handle->DataItf.InPipe, 0U); |
||||
|
||||
return USBH_OK; |
||||
} |
||||
|
||||
|
||||
|
||||
/**
|
||||
* @brief USBH_CDC_InterfaceDeInit |
||||
* The function DeInit the Pipes used for the CDC class. |
||||
* @param phost: Host handle |
||||
* @retval USBH Status |
||||
*/ |
||||
static USBH_StatusTypeDef USBH_CDC_InterfaceDeInit(USBH_HandleTypeDef *phost) |
||||
{ |
||||
CDC_HandleTypeDef *CDC_Handle = (CDC_HandleTypeDef *) phost->pActiveClass->pData; |
||||
|
||||
if ((CDC_Handle->CommItf.NotifPipe) != 0U) |
||||
{ |
||||
(void)USBH_ClosePipe(phost, CDC_Handle->CommItf.NotifPipe); |
||||
(void)USBH_FreePipe(phost, CDC_Handle->CommItf.NotifPipe); |
||||
CDC_Handle->CommItf.NotifPipe = 0U; /* Reset the Channel as Free */ |
||||
} |
||||
|
||||
if ((CDC_Handle->DataItf.InPipe) != 0U) |
||||
{ |
||||
(void)USBH_ClosePipe(phost, CDC_Handle->DataItf.InPipe); |
||||
(void)USBH_FreePipe(phost, CDC_Handle->DataItf.InPipe); |
||||
CDC_Handle->DataItf.InPipe = 0U; /* Reset the Channel as Free */ |
||||
} |
||||
|
||||
if ((CDC_Handle->DataItf.OutPipe) != 0U) |
||||
{ |
||||
(void)USBH_ClosePipe(phost, CDC_Handle->DataItf.OutPipe); |
||||
(void)USBH_FreePipe(phost, CDC_Handle->DataItf.OutPipe); |
||||
CDC_Handle->DataItf.OutPipe = 0U; /* Reset the Channel as Free */ |
||||
} |
||||
|
||||
if ((phost->pActiveClass->pData) != NULL) |
||||
{ |
||||
USBH_free(phost->pActiveClass->pData); |
||||
phost->pActiveClass->pData = 0U; |
||||
} |
||||
|
||||
return USBH_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBH_CDC_ClassRequest |
||||
* The function is responsible for handling Standard requests |
||||
* for CDC class. |
||||
* @param phost: Host handle |
||||
* @retval USBH Status |
||||
*/ |
||||
static USBH_StatusTypeDef USBH_CDC_ClassRequest(USBH_HandleTypeDef *phost) |
||||
{ |
||||
USBH_StatusTypeDef status; |
||||
CDC_HandleTypeDef *CDC_Handle = (CDC_HandleTypeDef *) phost->pActiveClass->pData; |
||||
|
||||
/* Issue the get line coding request */ |
||||
status = GetLineCoding(phost, &CDC_Handle->LineCoding); |
||||
if (status == USBH_OK) |
||||
{ |
||||
phost->pUser(phost, HOST_USER_CLASS_ACTIVE); |
||||
} |
||||
else if (status == USBH_NOT_SUPPORTED) |
||||
{ |
||||
USBH_ErrLog("Control error: CDC: Device Get Line Coding configuration failed"); |
||||
} |
||||
else |
||||
{ |
||||
/* .. */ |
||||
} |
||||
|
||||
return status; |
||||
} |
||||
|
||||
|
||||
/**
|
||||
* @brief USBH_CDC_Process |
||||
* The function is for managing state machine for CDC data transfers |
||||
* @param phost: Host handle |
||||
* @retval USBH Status |
||||
*/ |
||||
static USBH_StatusTypeDef USBH_CDC_Process(USBH_HandleTypeDef *phost) |
||||
{ |
||||
USBH_StatusTypeDef status = USBH_BUSY; |
||||
USBH_StatusTypeDef req_status = USBH_OK; |
||||
CDC_HandleTypeDef *CDC_Handle = (CDC_HandleTypeDef *) phost->pActiveClass->pData; |
||||
|
||||
switch (CDC_Handle->state) |
||||
{ |
||||
|
||||
case CDC_IDLE_STATE: |
||||
status = USBH_OK; |
||||
break; |
||||
|
||||
case CDC_SET_LINE_CODING_STATE: |
||||
req_status = SetLineCoding(phost, CDC_Handle->pUserLineCoding); |
||||
|
||||
if (req_status == USBH_OK) |
||||
{ |
||||
CDC_Handle->state = CDC_GET_LAST_LINE_CODING_STATE; |
||||
} |
||||
|
||||
else |
||||
{ |
||||
if (req_status != USBH_BUSY) |
||||
{ |
||||
CDC_Handle->state = CDC_ERROR_STATE; |
||||
} |
||||
} |
||||
break; |
||||
|
||||
|
||||
case CDC_GET_LAST_LINE_CODING_STATE: |
||||
req_status = GetLineCoding(phost, &(CDC_Handle->LineCoding)); |
||||
|
||||
if (req_status == USBH_OK) |
||||
{ |
||||
CDC_Handle->state = CDC_IDLE_STATE; |
||||
|
||||
if ((CDC_Handle->LineCoding.b.bCharFormat == CDC_Handle->pUserLineCoding->b.bCharFormat) && |
||||
(CDC_Handle->LineCoding.b.bDataBits == CDC_Handle->pUserLineCoding->b.bDataBits) && |
||||
(CDC_Handle->LineCoding.b.bParityType == CDC_Handle->pUserLineCoding->b.bParityType) && |
||||
(CDC_Handle->LineCoding.b.dwDTERate == CDC_Handle->pUserLineCoding->b.dwDTERate)) |
||||
{ |
||||
USBH_CDC_LineCodingChanged(phost); |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
if (req_status != USBH_BUSY) |
||||
{ |
||||
CDC_Handle->state = CDC_ERROR_STATE; |
||||
} |
||||
} |
||||
break; |
||||
|
||||
case CDC_TRANSFER_DATA: |
||||
CDC_ProcessTransmission(phost); |
||||
CDC_ProcessReception(phost); |
||||
break; |
||||
|
||||
case CDC_ERROR_STATE: |
||||
req_status = USBH_ClrFeature(phost, 0x00U); |
||||
|
||||
if (req_status == USBH_OK) |
||||
{ |
||||
/*Change the state to waiting*/ |
||||
CDC_Handle->state = CDC_IDLE_STATE; |
||||
} |
||||
break; |
||||
|
||||
default: |
||||
break; |
||||
|
||||
} |
||||
|
||||
return status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBH_CDC_SOFProcess |
||||
* The function is for managing SOF callback |
||||
* @param phost: Host handle |
||||
* @retval USBH Status |
||||
*/ |
||||
static USBH_StatusTypeDef USBH_CDC_SOFProcess(USBH_HandleTypeDef *phost) |
||||
{ |
||||
/* Prevent unused argument(s) compilation warning */ |
||||
UNUSED(phost); |
||||
|
||||
return USBH_OK; |
||||
} |
||||
|
||||
|
||||
/**
|
||||
* @brief USBH_CDC_Stop |
||||
* Stop current CDC Transmission |
||||
* @param phost: Host handle |
||||
* @retval USBH Status |
||||
*/ |
||||
USBH_StatusTypeDef USBH_CDC_Stop(USBH_HandleTypeDef *phost) |
||||
{ |
||||
CDC_HandleTypeDef *CDC_Handle = (CDC_HandleTypeDef *) phost->pActiveClass->pData; |
||||
|
||||
if (phost->gState == HOST_CLASS) |
||||
{ |
||||
CDC_Handle->state = CDC_IDLE_STATE; |
||||
|
||||
(void)USBH_ClosePipe(phost, CDC_Handle->CommItf.NotifPipe); |
||||
(void)USBH_ClosePipe(phost, CDC_Handle->DataItf.InPipe); |
||||
(void)USBH_ClosePipe(phost, CDC_Handle->DataItf.OutPipe); |
||||
} |
||||
return USBH_OK; |
||||
} |
||||
/**
|
||||
* @brief This request allows the host to find out the currently |
||||
* configured line coding. |
||||
* @param pdev: Selected device |
||||
* @retval USBH_StatusTypeDef : USB ctl xfer status |
||||
*/ |
||||
static USBH_StatusTypeDef GetLineCoding(USBH_HandleTypeDef *phost, CDC_LineCodingTypeDef *linecoding) |
||||
{ |
||||
|
||||
phost->Control.setup.b.bmRequestType = USB_D2H | USB_REQ_TYPE_CLASS | \
|
||||
USB_REQ_RECIPIENT_INTERFACE; |
||||
|
||||
phost->Control.setup.b.bRequest = CDC_GET_LINE_CODING; |
||||
phost->Control.setup.b.wValue.w = 0U; |
||||
phost->Control.setup.b.wIndex.w = 0U; |
||||
phost->Control.setup.b.wLength.w = LINE_CODING_STRUCTURE_SIZE; |
||||
|
||||
return USBH_CtlReq(phost, linecoding->Array, LINE_CODING_STRUCTURE_SIZE); |
||||
} |
||||
|
||||
|
||||
/**
|
||||
* @brief This request allows the host to specify typical asynchronous |
||||
* line-character formatting properties |
||||
* This request applies to asynchronous byte stream data class interfaces |
||||
* and endpoints |
||||
* @param pdev: Selected device |
||||
* @retval USBH_StatusTypeDef : USB ctl xfer status |
||||
*/ |
||||
static USBH_StatusTypeDef SetLineCoding(USBH_HandleTypeDef *phost, |
||||
CDC_LineCodingTypeDef *linecoding) |
||||
{ |
||||
phost->Control.setup.b.bmRequestType = USB_H2D | USB_REQ_TYPE_CLASS | |
||||
USB_REQ_RECIPIENT_INTERFACE; |
||||
|
||||
phost->Control.setup.b.bRequest = CDC_SET_LINE_CODING; |
||||
phost->Control.setup.b.wValue.w = 0U; |
||||
|
||||
phost->Control.setup.b.wIndex.w = 0U; |
||||
|
||||
phost->Control.setup.b.wLength.w = LINE_CODING_STRUCTURE_SIZE; |
||||
|
||||
return USBH_CtlReq(phost, linecoding->Array, LINE_CODING_STRUCTURE_SIZE); |
||||
} |
||||
|
||||
/**
|
||||
* @brief This function prepares the state before issuing the class specific commands |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
USBH_StatusTypeDef USBH_CDC_SetLineCoding(USBH_HandleTypeDef *phost, |
||||
CDC_LineCodingTypeDef *linecoding) |
||||
{ |
||||
CDC_HandleTypeDef *CDC_Handle = (CDC_HandleTypeDef *) phost->pActiveClass->pData; |
||||
|
||||
if (phost->gState == HOST_CLASS) |
||||
{ |
||||
CDC_Handle->state = CDC_SET_LINE_CODING_STATE; |
||||
CDC_Handle->pUserLineCoding = linecoding; |
||||
|
||||
#if (USBH_USE_OS == 1U) |
||||
phost->os_msg = (uint32_t)USBH_CLASS_EVENT; |
||||
#if (osCMSIS < 0x20000U) |
||||
(void)osMessagePut(phost->os_event, phost->os_msg, 0U); |
||||
#else |
||||
(void)osMessageQueuePut(phost->os_event, &phost->os_msg, 0U, 0U); |
||||
#endif |
||||
#endif |
||||
} |
||||
|
||||
return USBH_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief This function prepares the state before issuing the class specific commands |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
USBH_StatusTypeDef USBH_CDC_GetLineCoding(USBH_HandleTypeDef *phost, |
||||
CDC_LineCodingTypeDef *linecoding) |
||||
{ |
||||
CDC_HandleTypeDef *CDC_Handle = (CDC_HandleTypeDef *) phost->pActiveClass->pData; |
||||
|
||||
if ((phost->gState == HOST_CLASS) || (phost->gState == HOST_CLASS_REQUEST)) |
||||
{ |
||||
*linecoding = CDC_Handle->LineCoding; |
||||
return USBH_OK; |
||||
} |
||||
else |
||||
{ |
||||
return USBH_FAIL; |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief This function return last received data size |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
uint16_t USBH_CDC_GetLastReceivedDataSize(USBH_HandleTypeDef *phost) |
||||
{ |
||||
uint32_t dataSize; |
||||
CDC_HandleTypeDef *CDC_Handle = (CDC_HandleTypeDef *) phost->pActiveClass->pData; |
||||
|
||||
if (phost->gState == HOST_CLASS) |
||||
{ |
||||
dataSize = USBH_LL_GetLastXferSize(phost, CDC_Handle->DataItf.InPipe); |
||||
} |
||||
else |
||||
{ |
||||
dataSize = 0U; |
||||
} |
||||
|
||||
return (uint16_t)dataSize; |
||||
} |
||||
|
||||
/**
|
||||
* @brief This function prepares the state before issuing the class specific commands |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
USBH_StatusTypeDef USBH_CDC_Transmit(USBH_HandleTypeDef *phost, uint8_t *pbuff, uint32_t length) |
||||
{ |
||||
USBH_StatusTypeDef Status = USBH_BUSY; |
||||
CDC_HandleTypeDef *CDC_Handle = (CDC_HandleTypeDef *) phost->pActiveClass->pData; |
||||
|
||||
if ((CDC_Handle->state == CDC_IDLE_STATE) || (CDC_Handle->state == CDC_TRANSFER_DATA)) |
||||
{ |
||||
CDC_Handle->pTxData = pbuff; |
||||
CDC_Handle->TxDataLength = length; |
||||
CDC_Handle->state = CDC_TRANSFER_DATA; |
||||
CDC_Handle->data_tx_state = CDC_SEND_DATA; |
||||
Status = USBH_OK; |
||||
|
||||
#if (USBH_USE_OS == 1U) |
||||
phost->os_msg = (uint32_t)USBH_CLASS_EVENT; |
||||
#if (osCMSIS < 0x20000U) |
||||
(void)osMessagePut(phost->os_event, phost->os_msg, 0U); |
||||
#else |
||||
(void)osMessageQueuePut(phost->os_event, &phost->os_msg, 0U, 0U); |
||||
#endif |
||||
#endif |
||||
} |
||||
return Status; |
||||
} |
||||
|
||||
|
||||
/**
|
||||
* @brief This function prepares the state before issuing the class specific commands |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
USBH_StatusTypeDef USBH_CDC_Receive(USBH_HandleTypeDef *phost, uint8_t *pbuff, uint32_t length) |
||||
{ |
||||
USBH_StatusTypeDef Status = USBH_BUSY; |
||||
CDC_HandleTypeDef *CDC_Handle = (CDC_HandleTypeDef *) phost->pActiveClass->pData; |
||||
|
||||
if ((CDC_Handle->state == CDC_IDLE_STATE) || (CDC_Handle->state == CDC_TRANSFER_DATA)) |
||||
{ |
||||
CDC_Handle->pRxData = pbuff; |
||||
CDC_Handle->RxDataLength = length; |
||||
CDC_Handle->state = CDC_TRANSFER_DATA; |
||||
CDC_Handle->data_rx_state = CDC_RECEIVE_DATA; |
||||
Status = USBH_OK; |
||||
|
||||
#if (USBH_USE_OS == 1U) |
||||
phost->os_msg = (uint32_t)USBH_CLASS_EVENT; |
||||
#if (osCMSIS < 0x20000U) |
||||
(void)osMessagePut(phost->os_event, phost->os_msg, 0U); |
||||
#else |
||||
(void)osMessageQueuePut(phost->os_event, &phost->os_msg, 0U, 0U); |
||||
#endif |
||||
#endif |
||||
} |
||||
return Status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief The function is responsible for sending data to the device |
||||
* @param pdev: Selected device |
||||
* @retval None |
||||
*/ |
||||
static void CDC_ProcessTransmission(USBH_HandleTypeDef *phost) |
||||
{ |
||||
CDC_HandleTypeDef *CDC_Handle = (CDC_HandleTypeDef *) phost->pActiveClass->pData; |
||||
USBH_URBStateTypeDef URB_Status = USBH_URB_IDLE; |
||||
|
||||
switch (CDC_Handle->data_tx_state) |
||||
{ |
||||
case CDC_SEND_DATA: |
||||
if (CDC_Handle->TxDataLength > CDC_Handle->DataItf.OutEpSize) |
||||
{ |
||||
(void)USBH_BulkSendData(phost, |
||||
CDC_Handle->pTxData, |
||||
CDC_Handle->DataItf.OutEpSize, |
||||
CDC_Handle->DataItf.OutPipe, |
||||
1U); |
||||
} |
||||
else |
||||
{ |
||||
(void)USBH_BulkSendData(phost, |
||||
CDC_Handle->pTxData, |
||||
(uint16_t)CDC_Handle->TxDataLength, |
||||
CDC_Handle->DataItf.OutPipe, |
||||
1U); |
||||
} |
||||
|
||||
CDC_Handle->data_tx_state = CDC_SEND_DATA_WAIT; |
||||
break; |
||||
|
||||
case CDC_SEND_DATA_WAIT: |
||||
|
||||
URB_Status = USBH_LL_GetURBState(phost, CDC_Handle->DataItf.OutPipe); |
||||
|
||||
/* Check the status done for transmission */ |
||||
if (URB_Status == USBH_URB_DONE) |
||||
{ |
||||
if (CDC_Handle->TxDataLength > CDC_Handle->DataItf.OutEpSize) |
||||
{ |
||||
CDC_Handle->TxDataLength -= CDC_Handle->DataItf.OutEpSize; |
||||
CDC_Handle->pTxData += CDC_Handle->DataItf.OutEpSize; |
||||
} |
||||
else |
||||
{ |
||||
CDC_Handle->TxDataLength = 0U; |
||||
} |
||||
|
||||
if (CDC_Handle->TxDataLength > 0U) |
||||
{ |
||||
CDC_Handle->data_tx_state = CDC_SEND_DATA; |
||||
} |
||||
else |
||||
{ |
||||
CDC_Handle->data_tx_state = CDC_IDLE; |
||||
USBH_CDC_TransmitCallback(phost); |
||||
} |
||||
|
||||
#if (USBH_USE_OS == 1U) |
||||
phost->os_msg = (uint32_t)USBH_CLASS_EVENT; |
||||
#if (osCMSIS < 0x20000U) |
||||
(void)osMessagePut(phost->os_event, phost->os_msg, 0U); |
||||
#else |
||||
(void)osMessageQueuePut(phost->os_event, &phost->os_msg, 0U, 0U); |
||||
#endif |
||||
#endif |
||||
} |
||||
else |
||||
{ |
||||
if (URB_Status == USBH_URB_NOTREADY) |
||||
{ |
||||
CDC_Handle->data_tx_state = CDC_SEND_DATA; |
||||
|
||||
#if (USBH_USE_OS == 1U) |
||||
phost->os_msg = (uint32_t)USBH_CLASS_EVENT; |
||||
#if (osCMSIS < 0x20000U) |
||||
(void)osMessagePut(phost->os_event, phost->os_msg, 0U); |
||||
#else |
||||
(void)osMessageQueuePut(phost->os_event, &phost->os_msg, 0U, 0U); |
||||
#endif |
||||
#endif |
||||
} |
||||
} |
||||
break; |
||||
|
||||
default: |
||||
break; |
||||
} |
||||
} |
||||
/**
|
||||
* @brief This function responsible for reception of data from the device |
||||
* @param pdev: Selected device |
||||
* @retval None |
||||
*/ |
||||
|
||||
static void CDC_ProcessReception(USBH_HandleTypeDef *phost) |
||||
{ |
||||
CDC_HandleTypeDef *CDC_Handle = (CDC_HandleTypeDef *) phost->pActiveClass->pData; |
||||
USBH_URBStateTypeDef URB_Status = USBH_URB_IDLE; |
||||
uint32_t length; |
||||
|
||||
switch (CDC_Handle->data_rx_state) |
||||
{ |
||||
|
||||
case CDC_RECEIVE_DATA: |
||||
|
||||
(void)USBH_BulkReceiveData(phost, |
||||
CDC_Handle->pRxData, |
||||
CDC_Handle->DataItf.InEpSize, |
||||
CDC_Handle->DataItf.InPipe); |
||||
|
||||
CDC_Handle->data_rx_state = CDC_RECEIVE_DATA_WAIT; |
||||
|
||||
break; |
||||
|
||||
case CDC_RECEIVE_DATA_WAIT: |
||||
|
||||
URB_Status = USBH_LL_GetURBState(phost, CDC_Handle->DataItf.InPipe); |
||||
|
||||
/*Check the status done for reception*/ |
||||
if (URB_Status == USBH_URB_DONE) |
||||
{ |
||||
length = USBH_LL_GetLastXferSize(phost, CDC_Handle->DataItf.InPipe); |
||||
|
||||
if (((CDC_Handle->RxDataLength - length) > 0U) && (length > CDC_Handle->DataItf.InEpSize)) |
||||
{ |
||||
CDC_Handle->RxDataLength -= length ; |
||||
CDC_Handle->pRxData += length; |
||||
CDC_Handle->data_rx_state = CDC_RECEIVE_DATA; |
||||
} |
||||
else |
||||
{ |
||||
CDC_Handle->data_rx_state = CDC_IDLE; |
||||
USBH_CDC_ReceiveCallback(phost); |
||||
} |
||||
|
||||
#if (USBH_USE_OS == 1U) |
||||
phost->os_msg = (uint32_t)USBH_CLASS_EVENT; |
||||
#if (osCMSIS < 0x20000U) |
||||
(void)osMessagePut(phost->os_event, phost->os_msg, 0U); |
||||
#else |
||||
(void)osMessageQueuePut(phost->os_event, &phost->os_msg, 0U, 0U); |
||||
#endif |
||||
#endif |
||||
} |
||||
break; |
||||
|
||||
default: |
||||
break; |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief The function informs user that data have been received |
||||
* @param pdev: Selected device |
||||
* @retval None |
||||
*/ |
||||
__weak void USBH_CDC_TransmitCallback(USBH_HandleTypeDef *phost) |
||||
{ |
||||
/* Prevent unused argument(s) compilation warning */ |
||||
UNUSED(phost); |
||||
} |
||||
|
||||
/**
|
||||
* @brief The function informs user that data have been sent |
||||
* @param pdev: Selected device |
||||
* @retval None |
||||
*/ |
||||
__weak void USBH_CDC_ReceiveCallback(USBH_HandleTypeDef *phost) |
||||
{ |
||||
/* Prevent unused argument(s) compilation warning */ |
||||
UNUSED(phost); |
||||
} |
||||
|
||||
/**
|
||||
* @brief The function informs user that Settings have been changed |
||||
* @param pdev: Selected device |
||||
* @retval None |
||||
*/ |
||||
__weak void USBH_CDC_LineCodingChanged(USBH_HandleTypeDef *phost) |
||||
{ |
||||
/* Prevent unused argument(s) compilation warning */ |
||||
UNUSED(phost); |
||||
} |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -1,192 +0,0 @@
|
||||
/**
|
||||
****************************************************************************** |
||||
* @file usbh_core.h |
||||
* @author MCD Application Team |
||||
* @brief Header file for usbh_core.c |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics. |
||||
* All rights reserved.</center></h2> |
||||
* |
||||
* This software component is licensed by ST under Ultimate Liberty license |
||||
* SLA0044, the "License"; You may not use this file except in compliance with |
||||
* the License. You may obtain a copy of the License at: |
||||
* www.st.com/SLA0044 |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
/* Define to prevent recursive ----------------------------------------------*/ |
||||
#ifndef __USBH_CORE_H |
||||
#define __USBH_CORE_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbh_conf.h" |
||||
#include "usbh_def.h" |
||||
#include "usbh_ioreq.h" |
||||
#include "usbh_pipes.h" |
||||
#include "usbh_ctlreq.h" |
||||
|
||||
/** @addtogroup USBH_LIB
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @addtogroup USBH_LIB_CORE
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup USBH_CORE
|
||||
* @brief This file is the Header file for usbh_core.c |
||||
* @{ |
||||
*/ |
||||
|
||||
|
||||
/** @defgroup USBH_CORE_Exported_Defines
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
#define HOST_USER_SELECT_CONFIGURATION 0x01U |
||||
#define HOST_USER_CLASS_ACTIVE 0x02U |
||||
#define HOST_USER_CLASS_SELECTED 0x03U |
||||
#define HOST_USER_CONNECTION 0x04U |
||||
#define HOST_USER_DISCONNECTION 0x05U |
||||
#define HOST_USER_UNRECOVERED_ERROR 0x06U |
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
|
||||
/** @defgroup USBH_CORE_Exported_Macros
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBH_CORE_Exported_Variables
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBH_CORE_Exported_FunctionsPrototype
|
||||
* @{ |
||||
*/ |
||||
|
||||
|
||||
USBH_StatusTypeDef USBH_Init(USBH_HandleTypeDef *phost, void (*pUsrFunc)(USBH_HandleTypeDef *phost, uint8_t id), uint8_t id); |
||||
USBH_StatusTypeDef USBH_DeInit(USBH_HandleTypeDef *phost); |
||||
USBH_StatusTypeDef USBH_RegisterClass(USBH_HandleTypeDef *phost, USBH_ClassTypeDef *pclass); |
||||
USBH_StatusTypeDef USBH_SelectInterface(USBH_HandleTypeDef *phost, uint8_t interface); |
||||
uint8_t USBH_FindInterface(USBH_HandleTypeDef *phost, |
||||
uint8_t Class, |
||||
uint8_t SubClass, |
||||
uint8_t Protocol); |
||||
uint8_t USBH_GetActiveClass(USBH_HandleTypeDef *phost); |
||||
|
||||
uint8_t USBH_FindInterfaceIndex(USBH_HandleTypeDef *phost, |
||||
uint8_t interface_number, |
||||
uint8_t alt_settings); |
||||
|
||||
uint8_t USBH_IsPortEnabled(USBH_HandleTypeDef *phost); |
||||
|
||||
USBH_StatusTypeDef USBH_Start(USBH_HandleTypeDef *phost); |
||||
USBH_StatusTypeDef USBH_Stop(USBH_HandleTypeDef *phost); |
||||
USBH_StatusTypeDef USBH_Process(USBH_HandleTypeDef *phost); |
||||
USBH_StatusTypeDef USBH_ReEnumerate(USBH_HandleTypeDef *phost); |
||||
|
||||
/* USBH Low Level Driver */ |
||||
USBH_StatusTypeDef USBH_LL_Init(USBH_HandleTypeDef *phost); |
||||
USBH_StatusTypeDef USBH_LL_DeInit(USBH_HandleTypeDef *phost); |
||||
USBH_StatusTypeDef USBH_LL_Start(USBH_HandleTypeDef *phost); |
||||
USBH_StatusTypeDef USBH_LL_Stop(USBH_HandleTypeDef *phost); |
||||
|
||||
USBH_StatusTypeDef USBH_LL_Connect(USBH_HandleTypeDef *phost); |
||||
USBH_StatusTypeDef USBH_LL_Disconnect(USBH_HandleTypeDef *phost); |
||||
USBH_SpeedTypeDef USBH_LL_GetSpeed(USBH_HandleTypeDef *phost); |
||||
USBH_StatusTypeDef USBH_LL_ResetPort(USBH_HandleTypeDef *phost); |
||||
uint32_t USBH_LL_GetLastXferSize(USBH_HandleTypeDef *phost, |
||||
uint8_t pipe); |
||||
|
||||
USBH_StatusTypeDef USBH_LL_DriverVBUS(USBH_HandleTypeDef *phost, |
||||
uint8_t state); |
||||
|
||||
USBH_StatusTypeDef USBH_LL_OpenPipe(USBH_HandleTypeDef *phost, |
||||
uint8_t pipe, |
||||
uint8_t epnum, |
||||
uint8_t dev_address, |
||||
uint8_t speed, |
||||
uint8_t ep_type, |
||||
uint16_t mps); |
||||
|
||||
USBH_StatusTypeDef USBH_LL_ClosePipe(USBH_HandleTypeDef *phost, |
||||
uint8_t pipe); |
||||
|
||||
USBH_StatusTypeDef USBH_LL_SubmitURB(USBH_HandleTypeDef *phost, |
||||
uint8_t pipe, |
||||
uint8_t direction, |
||||
uint8_t ep_type, |
||||
uint8_t token, |
||||
uint8_t *pbuff, |
||||
uint16_t length, |
||||
uint8_t do_ping); |
||||
|
||||
USBH_URBStateTypeDef USBH_LL_GetURBState(USBH_HandleTypeDef *phost, |
||||
uint8_t pipe); |
||||
|
||||
#if (USBH_USE_OS == 1U) |
||||
USBH_StatusTypeDef USBH_LL_NotifyURBChange(USBH_HandleTypeDef *phost); |
||||
#endif |
||||
|
||||
USBH_StatusTypeDef USBH_LL_SetToggle(USBH_HandleTypeDef *phost, |
||||
uint8_t pipe, uint8_t toggle); |
||||
|
||||
uint8_t USBH_LL_GetToggle(USBH_HandleTypeDef *phost, uint8_t pipe); |
||||
|
||||
void USBH_LL_PortDisabled(USBH_HandleTypeDef *phost); |
||||
void USBH_LL_PortEnabled(USBH_HandleTypeDef *phost); |
||||
|
||||
/* USBH Time base */ |
||||
void USBH_LL_SetTimer(USBH_HandleTypeDef *phost, uint32_t time); |
||||
void USBH_LL_IncTimer(USBH_HandleTypeDef *phost); |
||||
|
||||
void USBH_Delay(uint32_t Delay); |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* __USBH_CORE_H */ |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
||||
|
||||
|
||||
|
@ -1,141 +0,0 @@
|
||||
/**
|
||||
****************************************************************************** |
||||
* @file usbh_ctlreq.h |
||||
* @author MCD Application Team |
||||
* @brief Header file for usbh_ctlreq.c |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics. |
||||
* All rights reserved.</center></h2> |
||||
* |
||||
* This software component is licensed by ST under Ultimate Liberty license |
||||
* SLA0044, the "License"; You may not use this file except in compliance with |
||||
* the License. You may obtain a copy of the License at: |
||||
* www.st.com/SLA0044 |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive ----------------------------------------------*/ |
||||
#ifndef __USBH_CTLREQ_H |
||||
#define __USBH_CTLREQ_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbh_core.h" |
||||
|
||||
/** @addtogroup USBH_LIB
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @addtogroup USBH_LIB_CORE
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup USBH_CTLREQ
|
||||
* @brief This file is the |
||||
* @{ |
||||
*/ |
||||
|
||||
|
||||
/** @defgroup USBH_CTLREQ_Exported_Defines
|
||||
* @{ |
||||
*/ |
||||
/*Standard Feature Selector for clear feature command*/ |
||||
#define FEATURE_SELECTOR_ENDPOINT 0x00U |
||||
#define FEATURE_SELECTOR_DEVICE 0x01U |
||||
#define FEATURE_SELECTOR_REMOTEWAKEUP 0X01U |
||||
|
||||
|
||||
#define INTERFACE_DESC_TYPE 0x04U |
||||
#define ENDPOINT_DESC_TYPE 0x05U |
||||
#define INTERFACE_DESC_SIZE 0x09U |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/** @defgroup USBH_CTLREQ_Exported_Types
|
||||
* @{ |
||||
*/ |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/** @defgroup USBH_CTLREQ_Exported_Macros
|
||||
* @{ |
||||
*/ |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBH_CTLREQ_Exported_Variables
|
||||
* @{ |
||||
*/ |
||||
extern uint8_t USBH_CfgDesc[512]; |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBH_CTLREQ_Exported_FunctionsPrototype
|
||||
* @{ |
||||
*/ |
||||
USBH_StatusTypeDef USBH_CtlReq(USBH_HandleTypeDef *phost, uint8_t *buff, |
||||
uint16_t length); |
||||
|
||||
USBH_StatusTypeDef USBH_GetDescriptor(USBH_HandleTypeDef *phost, |
||||
uint8_t req_type, uint16_t value_idx, |
||||
uint8_t *buff, uint16_t length); |
||||
|
||||
USBH_StatusTypeDef USBH_Get_DevDesc(USBH_HandleTypeDef *phost, uint8_t length); |
||||
|
||||
USBH_StatusTypeDef USBH_Get_StringDesc(USBH_HandleTypeDef *phost, |
||||
uint8_t string_index, uint8_t *buff, |
||||
uint16_t length); |
||||
|
||||
USBH_StatusTypeDef USBH_SetCfg(USBH_HandleTypeDef *phost, uint16_t cfg_idx); |
||||
|
||||
USBH_StatusTypeDef USBH_Get_CfgDesc(USBH_HandleTypeDef *phost, uint16_t length); |
||||
|
||||
USBH_StatusTypeDef USBH_SetAddress(USBH_HandleTypeDef *phost, |
||||
uint8_t DeviceAddress); |
||||
|
||||
USBH_StatusTypeDef USBH_SetInterface(USBH_HandleTypeDef *phost, uint8_t ep_num, |
||||
uint8_t altSetting); |
||||
|
||||
USBH_StatusTypeDef USBH_SetFeature(USBH_HandleTypeDef *phost, uint8_t wValue); |
||||
|
||||
USBH_StatusTypeDef USBH_ClrFeature(USBH_HandleTypeDef *phost, uint8_t ep_num); |
||||
|
||||
USBH_DescHeader_t *USBH_GetNextDesc(uint8_t *pbuf, uint16_t *ptr); |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* __USBH_CTLREQ_H */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
||||
|
||||
|
@ -1,512 +0,0 @@
|
||||
/**
|
||||
****************************************************************************** |
||||
* @file usbh_def.h |
||||
* @author MCD Application Team |
||||
* @brief Definitions used in the USB host library |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics. |
||||
* All rights reserved.</center></h2> |
||||
* |
||||
* This software component is licensed by ST under Ultimate Liberty license |
||||
* SLA0044, the "License"; You may not use this file except in compliance with |
||||
* the License. You may obtain a copy of the License at: |
||||
* www.st.com/SLA0044 |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive ----------------------------------------------*/ |
||||
#ifndef USBH_DEF_H |
||||
#define USBH_DEF_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbh_conf.h" |
||||
|
||||
/** @addtogroup USBH_LIB
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @addtogroup USBH_LIB_CORE
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup USBH_DEF
|
||||
* @brief This file is includes USB descriptors |
||||
* @{ |
||||
*/ |
||||
|
||||
#ifndef NULL |
||||
#define NULL 0U |
||||
#endif |
||||
|
||||
#ifndef FALSE |
||||
#define FALSE 0U |
||||
#endif |
||||
|
||||
#ifndef TRUE |
||||
#define TRUE 1U |
||||
#endif |
||||
|
||||
#ifndef USBH_DEV_RESET_TIMEOUT |
||||
#define USBH_DEV_RESET_TIMEOUT 1000U |
||||
#endif |
||||
|
||||
#define ValBit(VAR,POS) (VAR & (1 << POS)) |
||||
#define SetBit(VAR,POS) (VAR |= (1 << POS)) |
||||
#define ClrBit(VAR,POS) (VAR &= ((1 << POS)^255)) |
||||
|
||||
#ifndef MIN |
||||
#define MIN(a, b) (((a) < (b)) ? (a) : (b)) |
||||
#endif |
||||
|
||||
#ifndef MAX |
||||
#define MAX(a, b) (((a) > (b)) ? (a) : (b)) |
||||
#endif |
||||
|
||||
#define LE16(addr) (((uint16_t)(addr)[0]) | \ |
||||
((uint16_t)(((uint32_t)(addr)[1]) << 8))) |
||||
|
||||
#define LE24(addr) (((uint32_t)(addr)[0]) | \ |
||||
(((uint32_t)(addr)[1]) << 8) | \
|
||||
(((uint32_t)(addr)[2]) << 16)) |
||||
|
||||
#define LE32(addr) (((uint32_t)(addr)[0]) | \ |
||||
(((uint32_t)(addr)[1]) << 8) | \
|
||||
(((uint32_t)(addr)[2]) << 16) | \
|
||||
(((uint32_t)(addr)[3]) << 24)) |
||||
|
||||
#define LE64(addr) (((uint64_t)(addr)[0]) | \ |
||||
(((uint64_t)(addr)[1]) << 8) | \
|
||||
(((uint64_t)(addr)[2]) << 16) | \
|
||||
(((uint64_t)(addr)[3]) << 24) | \
|
||||
(((uint64_t)(addr)[4]) << 32) | \
|
||||
(((uint64_t)(addr)[5]) << 40) | \
|
||||
(((uint64_t)(addr)[6]) << 48) | \
|
||||
(((uint64_t)(addr)[7]) << 56)) |
||||
|
||||
#define LE16S(addr) ((int16_t)(LE16((addr)))) |
||||
#define LE24S(addr) ((int32_t)(LE24((addr)))) |
||||
#define LE32S(addr) ((int32_t)(LE32((addr)))) |
||||
#define LE64S(addr) ((int64_t)(LE64((addr)))) |
||||
|
||||
#ifndef USBH_MAX_DATA_BUFFER |
||||
#define USBH_MAX_DATA_BUFFER 0x400U |
||||
#endif |
||||
|
||||
#define USBH_MAX_EP_PACKET_SIZE 0x400U |
||||
|
||||
#define USB_LEN_DESC_HDR 0x02U |
||||
#define USB_LEN_DEV_DESC 0x12U |
||||
#define USB_LEN_CFG_DESC 0x09U |
||||
#define USB_LEN_IF_DESC 0x09U |
||||
#define USB_LEN_EP_DESC 0x07U |
||||
#define USB_LEN_OTG_DESC 0x03U |
||||
#define USB_LEN_SETUP_PKT 0x08U |
||||
|
||||
/* bmRequestType :D7 Data Phase Transfer Direction */ |
||||
#define USB_REQ_DIR_MASK 0x80U |
||||
#define USB_H2D 0x00U |
||||
#define USB_D2H 0x80U |
||||
|
||||
/* bmRequestType D6..5 Type */ |
||||
#define USB_REQ_TYPE_STANDARD 0x00U |
||||
#define USB_REQ_TYPE_CLASS 0x20U |
||||
#define USB_REQ_TYPE_VENDOR 0x40U |
||||
#define USB_REQ_TYPE_RESERVED 0x60U |
||||
|
||||
/* bmRequestType D4..0 Recipient */ |
||||
#define USB_REQ_RECIPIENT_DEVICE 0x00U |
||||
#define USB_REQ_RECIPIENT_INTERFACE 0x01U |
||||
#define USB_REQ_RECIPIENT_ENDPOINT 0x02U |
||||
#define USB_REQ_RECIPIENT_OTHER 0x03U |
||||
|
||||
/* Table 9-4. Standard Request Codes */ |
||||
/* bRequest , Value */ |
||||
#define USB_REQ_GET_STATUS 0x00U |
||||
#define USB_REQ_CLEAR_FEATURE 0x01U |
||||
#define USB_REQ_SET_FEATURE 0x03U |
||||
#define USB_REQ_SET_ADDRESS 0x05U |
||||
#define USB_REQ_GET_DESCRIPTOR 0x06U |
||||
#define USB_REQ_SET_DESCRIPTOR 0x07U |
||||
#define USB_REQ_GET_CONFIGURATION 0x08U |
||||
#define USB_REQ_SET_CONFIGURATION 0x09U |
||||
#define USB_REQ_GET_INTERFACE 0x0AU |
||||
#define USB_REQ_SET_INTERFACE 0x0BU |
||||
#define USB_REQ_SYNCH_FRAME 0x0CU |
||||
|
||||
/* Table 9-5. Descriptor Types of USB Specifications */ |
||||
#define USB_DESC_TYPE_DEVICE 0x01U |
||||
#define USB_DESC_TYPE_CONFIGURATION 0x02U |
||||
#define USB_DESC_TYPE_STRING 0x03U |
||||
#define USB_DESC_TYPE_INTERFACE 0x04U |
||||
#define USB_DESC_TYPE_ENDPOINT 0x05U |
||||
#define USB_DESC_TYPE_DEVICE_QUALIFIER 0x06U |
||||
#define USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION 0x07U |
||||
#define USB_DESC_TYPE_INTERFACE_POWER 0x08U |
||||
#define USB_DESC_TYPE_HID 0x21U |
||||
#define USB_DESC_TYPE_HID_REPORT 0x22U |
||||
|
||||
|
||||
#define USB_DEVICE_DESC_SIZE 0x12U |
||||
#define USB_CONFIGURATION_DESC_SIZE 0x09U |
||||
#define USB_HID_DESC_SIZE 0x09U |
||||
#define USB_INTERFACE_DESC_SIZE 0x09U |
||||
#define USB_ENDPOINT_DESC_SIZE 0x07U |
||||
|
||||
/* Descriptor Type and Descriptor Index */ |
||||
/* Use the following values when calling the function USBH_GetDescriptor */ |
||||
#define USB_DESC_DEVICE ((USB_DESC_TYPE_DEVICE << 8) & 0xFF00U) |
||||
#define USB_DESC_CONFIGURATION ((USB_DESC_TYPE_CONFIGURATION << 8) & 0xFF00U) |
||||
#define USB_DESC_STRING ((USB_DESC_TYPE_STRING << 8) & 0xFF00U) |
||||
#define USB_DESC_INTERFACE ((USB_DESC_TYPE_INTERFACE << 8) & 0xFF00U) |
||||
#define USB_DESC_ENDPOINT ((USB_DESC_TYPE_INTERFACE << 8) & 0xFF00U) |
||||
#define USB_DESC_DEVICE_QUALIFIER ((USB_DESC_TYPE_DEVICE_QUALIFIER << 8) & 0xFF00U) |
||||
#define USB_DESC_OTHER_SPEED_CONFIGURATION ((USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION << 8) & 0xFF00U) |
||||
#define USB_DESC_INTERFACE_POWER ((USB_DESC_TYPE_INTERFACE_POWER << 8) & 0xFF00U) |
||||
#define USB_DESC_HID_REPORT ((USB_DESC_TYPE_HID_REPORT << 8) & 0xFF00U) |
||||
#define USB_DESC_HID ((USB_DESC_TYPE_HID << 8) & 0xFF00U) |
||||
|
||||
|
||||
#define USB_EP_TYPE_CTRL 0x00U |
||||
#define USB_EP_TYPE_ISOC 0x01U |
||||
#define USB_EP_TYPE_BULK 0x02U |
||||
#define USB_EP_TYPE_INTR 0x03U |
||||
|
||||
#define USB_EP_DIR_OUT 0x00U |
||||
#define USB_EP_DIR_IN 0x80U |
||||
#define USB_EP_DIR_MSK 0x80U |
||||
|
||||
#ifndef USBH_MAX_PIPES_NBR |
||||
#define USBH_MAX_PIPES_NBR 16U |
||||
#endif /* USBH_MAX_PIPES_NBR */ |
||||
|
||||
#define USBH_DEVICE_ADDRESS_DEFAULT 0x00U |
||||
#define USBH_DEVICE_ADDRESS 0x01U |
||||
|
||||
#define USBH_MAX_ERROR_COUNT 0x02U |
||||
|
||||
#if (USBH_USE_OS == 1U) |
||||
#define MSGQUEUE_OBJECTS 0x10U |
||||
#endif |
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
#define USBH_CONFIGURATION_DESCRIPTOR_SIZE (USB_CONFIGURATION_DESC_SIZE \ |
||||
+ USB_INTERFACE_DESC_SIZE\
|
||||
+ (USBH_MAX_NUM_ENDPOINTS * USB_ENDPOINT_DESC_SIZE)) |
||||
|
||||
|
||||
#define CONFIG_DESC_wTOTAL_LENGTH (ConfigurationDescriptorData.ConfigDescfield.\ |
||||
ConfigurationDescriptor.wTotalLength) |
||||
|
||||
|
||||
typedef union |
||||
{ |
||||
uint16_t w; |
||||
struct BW |
||||
{ |
||||
uint8_t msb; |
||||
uint8_t lsb; |
||||
} |
||||
bw; |
||||
} |
||||
uint16_t_uint8_t; |
||||
|
||||
|
||||
typedef union _USB_Setup |
||||
{ |
||||
uint32_t d8[2]; |
||||
|
||||
struct _SetupPkt_Struc |
||||
{ |
||||
uint8_t bmRequestType; |
||||
uint8_t bRequest; |
||||
uint16_t_uint8_t wValue; |
||||
uint16_t_uint8_t wIndex; |
||||
uint16_t_uint8_t wLength; |
||||
} b; |
||||
} |
||||
USB_Setup_TypeDef; |
||||
|
||||
typedef struct _DescHeader |
||||
{ |
||||
uint8_t bLength; |
||||
uint8_t bDescriptorType; |
||||
} |
||||
USBH_DescHeader_t; |
||||
|
||||
typedef struct _DeviceDescriptor |
||||
{ |
||||
uint8_t bLength; |
||||
uint8_t bDescriptorType; |
||||
uint16_t bcdUSB; /* USB Specification Number which device complies too */ |
||||
uint8_t bDeviceClass; |
||||
uint8_t bDeviceSubClass; |
||||
uint8_t bDeviceProtocol; |
||||
/* If equal to Zero, each interface specifies its own class
|
||||
code if equal to 0xFF, the class code is vendor specified. |
||||
Otherwise field is valid Class Code.*/ |
||||
uint8_t bMaxPacketSize; |
||||
uint16_t idVendor; /* Vendor ID (Assigned by USB Org) */ |
||||
uint16_t idProduct; /* Product ID (Assigned by Manufacturer) */ |
||||
uint16_t bcdDevice; /* Device Release Number */ |
||||
uint8_t iManufacturer; /* Index of Manufacturer String Descriptor */ |
||||
uint8_t iProduct; /* Index of Product String Descriptor */ |
||||
uint8_t iSerialNumber; /* Index of Serial Number String Descriptor */ |
||||
uint8_t bNumConfigurations; /* Number of Possible Configurations */ |
||||
} |
||||
USBH_DevDescTypeDef; |
||||
|
||||
typedef struct _EndpointDescriptor |
||||
{ |
||||
uint8_t bLength; |
||||
uint8_t bDescriptorType; |
||||
uint8_t bEndpointAddress; /* indicates what endpoint this descriptor is describing */ |
||||
uint8_t bmAttributes; /* specifies the transfer type. */ |
||||
uint16_t wMaxPacketSize; /* Maximum Packet Size this endpoint is capable of sending or receiving */ |
||||
uint8_t bInterval; /* is used to specify the polling interval of certain transfers. */ |
||||
} |
||||
USBH_EpDescTypeDef; |
||||
|
||||
typedef struct _InterfaceDescriptor |
||||
{ |
||||
uint8_t bLength; |
||||
uint8_t bDescriptorType; |
||||
uint8_t bInterfaceNumber; |
||||
uint8_t bAlternateSetting; /* Value used to select alternative setting */ |
||||
uint8_t bNumEndpoints; /* Number of Endpoints used for this interface */ |
||||
uint8_t bInterfaceClass; /* Class Code (Assigned by USB Org) */ |
||||
uint8_t bInterfaceSubClass; /* Subclass Code (Assigned by USB Org) */ |
||||
uint8_t bInterfaceProtocol; /* Protocol Code */ |
||||
uint8_t iInterface; /* Index of String Descriptor Describing this interface */ |
||||
USBH_EpDescTypeDef Ep_Desc[USBH_MAX_NUM_ENDPOINTS]; |
||||
} |
||||
USBH_InterfaceDescTypeDef; |
||||
|
||||
|
||||
typedef struct _ConfigurationDescriptor |
||||
{ |
||||
uint8_t bLength; |
||||
uint8_t bDescriptorType; |
||||
uint16_t wTotalLength; /* Total Length of Data Returned */ |
||||
uint8_t bNumInterfaces; /* Number of Interfaces */ |
||||
uint8_t bConfigurationValue; /* Value to use as an argument to select this configuration*/ |
||||
uint8_t iConfiguration; /*Index of String Descriptor Describing this configuration */ |
||||
uint8_t bmAttributes; /* D7 Bus Powered , D6 Self Powered, D5 Remote Wakeup , D4..0 Reserved (0)*/ |
||||
uint8_t bMaxPower; /*Maximum Power Consumption */ |
||||
USBH_InterfaceDescTypeDef Itf_Desc[USBH_MAX_NUM_INTERFACES]; |
||||
} |
||||
USBH_CfgDescTypeDef; |
||||
|
||||
|
||||
/* Following USB Host status */ |
||||
typedef enum |
||||
{ |
||||
USBH_OK = 0, |
||||
USBH_BUSY, |
||||
USBH_FAIL, |
||||
USBH_NOT_SUPPORTED, |
||||
USBH_UNRECOVERED_ERROR, |
||||
USBH_ERROR_SPEED_UNKNOWN, |
||||
} USBH_StatusTypeDef; |
||||
|
||||
|
||||
/** @defgroup USBH_CORE_Exported_Types
|
||||
* @{ |
||||
*/ |
||||
|
||||
typedef enum |
||||
{ |
||||
USBH_SPEED_HIGH = 0U, |
||||
USBH_SPEED_FULL = 1U, |
||||
USBH_SPEED_LOW = 2U, |
||||
|
||||
} USBH_SpeedTypeDef; |
||||
|
||||
/* Following states are used for gState */ |
||||
typedef enum |
||||
{ |
||||
HOST_IDLE = 0U, |
||||
HOST_DEV_WAIT_FOR_ATTACHMENT, |
||||
HOST_DEV_ATTACHED, |
||||
HOST_DEV_DISCONNECTED, |
||||
HOST_DETECT_DEVICE_SPEED, |
||||
HOST_ENUMERATION, |
||||
HOST_CLASS_REQUEST, |
||||
HOST_INPUT, |
||||
HOST_SET_CONFIGURATION, |
||||
HOST_SET_WAKEUP_FEATURE, |
||||
HOST_CHECK_CLASS, |
||||
HOST_CLASS, |
||||
HOST_SUSPENDED, |
||||
HOST_ABORT_STATE, |
||||
} HOST_StateTypeDef; |
||||
|
||||
/* Following states are used for EnumerationState */ |
||||
typedef enum |
||||
{ |
||||
ENUM_IDLE = 0U, |
||||
ENUM_GET_FULL_DEV_DESC, |
||||
ENUM_SET_ADDR, |
||||
ENUM_GET_CFG_DESC, |
||||
ENUM_GET_FULL_CFG_DESC, |
||||
ENUM_GET_MFC_STRING_DESC, |
||||
ENUM_GET_PRODUCT_STRING_DESC, |
||||
ENUM_GET_SERIALNUM_STRING_DESC, |
||||
} ENUM_StateTypeDef; |
||||
|
||||
/* Following states are used for CtrlXferStateMachine */ |
||||
typedef enum |
||||
{ |
||||
CTRL_IDLE = 0U, |
||||
CTRL_SETUP, |
||||
CTRL_SETUP_WAIT, |
||||
CTRL_DATA_IN, |
||||
CTRL_DATA_IN_WAIT, |
||||
CTRL_DATA_OUT, |
||||
CTRL_DATA_OUT_WAIT, |
||||
CTRL_STATUS_IN, |
||||
CTRL_STATUS_IN_WAIT, |
||||
CTRL_STATUS_OUT, |
||||
CTRL_STATUS_OUT_WAIT, |
||||
CTRL_ERROR, |
||||
CTRL_STALLED, |
||||
CTRL_COMPLETE |
||||
} CTRL_StateTypeDef; |
||||
|
||||
|
||||
/* Following states are used for RequestState */ |
||||
typedef enum |
||||
{ |
||||
CMD_IDLE = 0U, |
||||
CMD_SEND, |
||||
CMD_WAIT |
||||
} CMD_StateTypeDef; |
||||
|
||||
typedef enum |
||||
{ |
||||
USBH_URB_IDLE = 0U, |
||||
USBH_URB_DONE, |
||||
USBH_URB_NOTREADY, |
||||
USBH_URB_NYET, |
||||
USBH_URB_ERROR, |
||||
USBH_URB_STALL |
||||
} USBH_URBStateTypeDef; |
||||
|
||||
typedef enum |
||||
{ |
||||
USBH_PORT_EVENT = 1U, |
||||
USBH_URB_EVENT, |
||||
USBH_CONTROL_EVENT, |
||||
USBH_CLASS_EVENT, |
||||
USBH_STATE_CHANGED_EVENT, |
||||
} |
||||
USBH_OSEventTypeDef; |
||||
|
||||
/* Control request structure */ |
||||
typedef struct |
||||
{ |
||||
uint8_t pipe_in; |
||||
uint8_t pipe_out; |
||||
uint8_t pipe_size; |
||||
uint8_t *buff; |
||||
uint16_t length; |
||||
uint16_t timer; |
||||
USB_Setup_TypeDef setup; |
||||
CTRL_StateTypeDef state; |
||||
uint8_t errorcount; |
||||
|
||||
} USBH_CtrlTypeDef; |
||||
|
||||
/* Attached device structure */ |
||||
typedef struct |
||||
{ |
||||
uint8_t CfgDesc_Raw[USBH_MAX_SIZE_CONFIGURATION]; |
||||
uint8_t Data[USBH_MAX_DATA_BUFFER]; |
||||
uint8_t address; |
||||
uint8_t speed; |
||||
uint8_t EnumCnt; |
||||
uint8_t RstCnt; |
||||
__IO uint8_t is_connected; |
||||
__IO uint8_t is_disconnected; |
||||
__IO uint8_t is_ReEnumerated; |
||||
uint8_t PortEnabled; |
||||
uint8_t current_interface; |
||||
USBH_DevDescTypeDef DevDesc; |
||||
USBH_CfgDescTypeDef CfgDesc; |
||||
} USBH_DeviceTypeDef; |
||||
|
||||
struct _USBH_HandleTypeDef; |
||||
|
||||
/* USB Host Class structure */ |
||||
typedef struct |
||||
{ |
||||
const char *Name; |
||||
uint8_t ClassCode; |
||||
USBH_StatusTypeDef(*Init)(struct _USBH_HandleTypeDef *phost); |
||||
USBH_StatusTypeDef(*DeInit)(struct _USBH_HandleTypeDef *phost); |
||||
USBH_StatusTypeDef(*Requests)(struct _USBH_HandleTypeDef *phost); |
||||
USBH_StatusTypeDef(*BgndProcess)(struct _USBH_HandleTypeDef *phost); |
||||
USBH_StatusTypeDef(*SOFProcess)(struct _USBH_HandleTypeDef *phost); |
||||
void *pData; |
||||
} USBH_ClassTypeDef; |
||||
|
||||
/* USB Host handle structure */ |
||||
typedef struct _USBH_HandleTypeDef |
||||
{ |
||||
__IO HOST_StateTypeDef gState; /* Host State Machine Value */ |
||||
ENUM_StateTypeDef EnumState; /* Enumeration state Machine */ |
||||
CMD_StateTypeDef RequestState; |
||||
USBH_CtrlTypeDef Control; |
||||
USBH_DeviceTypeDef device; |
||||
USBH_ClassTypeDef *pClass[USBH_MAX_NUM_SUPPORTED_CLASS]; |
||||
USBH_ClassTypeDef *pActiveClass; |
||||
uint32_t ClassNumber; |
||||
uint32_t Pipes[16]; |
||||
__IO uint32_t Timer; |
||||
uint32_t Timeout; |
||||
uint8_t id; |
||||
void *pData; |
||||
void (* pUser)(struct _USBH_HandleTypeDef *pHandle, uint8_t id); |
||||
|
||||
#if (USBH_USE_OS == 1U) |
||||
#if osCMSIS < 0x20000 |
||||
osMessageQId os_event; |
||||
osThreadId thread; |
||||
#else |
||||
osMessageQueueId_t os_event; |
||||
osThreadId_t thread; |
||||
#endif |
||||
uint32_t os_msg; |
||||
#endif |
||||
|
||||
} USBH_HandleTypeDef; |
||||
|
||||
|
||||
#if defined ( __GNUC__ ) |
||||
#ifndef __weak |
||||
#define __weak __attribute__((weak)) |
||||
#endif /* __weak */ |
||||
#ifndef __packed |
||||
#define __packed __attribute__((__packed__)) |
||||
#endif /* __packed */ |
||||
#endif /* __GNUC__ */ |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* USBH_DEF_H */ |
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
||||
|
@ -1,160 +0,0 @@
|
||||
/**
|
||||
****************************************************************************** |
||||
* @file usbh_ioreq.h |
||||
* @author MCD Application Team |
||||
* @brief Header file for usbh_ioreq.c |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics. |
||||
* All rights reserved.</center></h2> |
||||
* |
||||
* This software component is licensed by ST under Ultimate Liberty license |
||||
* SLA0044, the "License"; You may not use this file except in compliance with |
||||
* the License. You may obtain a copy of the License at: |
||||
* www.st.com/SLA0044 |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive ----------------------------------------------*/ |
||||
#ifndef __USBH_IOREQ_H |
||||
#define __USBH_IOREQ_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbh_conf.h" |
||||
#include "usbh_core.h" |
||||
|
||||
/** @addtogroup USBH_LIB
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @addtogroup USBH_LIB_CORE
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup USBH_IOREQ
|
||||
* @brief This file is the header file for usbh_ioreq.c |
||||
* @{ |
||||
*/ |
||||
|
||||
|
||||
/** @defgroup USBH_IOREQ_Exported_Defines
|
||||
* @{ |
||||
*/ |
||||
|
||||
#define USBH_PID_SETUP 0U |
||||
#define USBH_PID_DATA 1U |
||||
|
||||
#define USBH_EP_CONTROL 0U |
||||
#define USBH_EP_ISO 1U |
||||
#define USBH_EP_BULK 2U |
||||
#define USBH_EP_INTERRUPT 3U |
||||
|
||||
#define USBH_SETUP_PKT_SIZE 8U |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/** @defgroup USBH_IOREQ_Exported_Types
|
||||
* @{ |
||||
*/ |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/** @defgroup USBH_IOREQ_Exported_Macros
|
||||
* @{ |
||||
*/ |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBH_IOREQ_Exported_Variables
|
||||
* @{ |
||||
*/ |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBH_IOREQ_Exported_FunctionsPrototype
|
||||
* @{ |
||||
*/ |
||||
USBH_StatusTypeDef USBH_CtlSendSetup(USBH_HandleTypeDef *phost, |
||||
uint8_t *buff, |
||||
uint8_t pipe_num); |
||||
|
||||
USBH_StatusTypeDef USBH_CtlSendData(USBH_HandleTypeDef *phost, |
||||
uint8_t *buff, |
||||
uint16_t length, |
||||
uint8_t pipe_num, |
||||
uint8_t do_ping); |
||||
|
||||
USBH_StatusTypeDef USBH_CtlReceiveData(USBH_HandleTypeDef *phost, |
||||
uint8_t *buff, |
||||
uint16_t length, |
||||
uint8_t pipe_num); |
||||
|
||||
USBH_StatusTypeDef USBH_BulkReceiveData(USBH_HandleTypeDef *phost, |
||||
uint8_t *buff, |
||||
uint16_t length, |
||||
uint8_t pipe_num); |
||||
|
||||
USBH_StatusTypeDef USBH_BulkSendData(USBH_HandleTypeDef *phost, |
||||
uint8_t *buff, |
||||
uint16_t length, |
||||
uint8_t pipe_num, |
||||
uint8_t do_ping); |
||||
|
||||
USBH_StatusTypeDef USBH_InterruptReceiveData(USBH_HandleTypeDef *phost, |
||||
uint8_t *buff, |
||||
uint8_t length, |
||||
uint8_t pipe_num); |
||||
|
||||
USBH_StatusTypeDef USBH_InterruptSendData(USBH_HandleTypeDef *phost, |
||||
uint8_t *buff, |
||||
uint8_t length, |
||||
uint8_t pipe_num); |
||||
|
||||
|
||||
USBH_StatusTypeDef USBH_IsocReceiveData(USBH_HandleTypeDef *phost, |
||||
uint8_t *buff, |
||||
uint32_t length, |
||||
uint8_t pipe_num); |
||||
|
||||
|
||||
USBH_StatusTypeDef USBH_IsocSendData(USBH_HandleTypeDef *phost, |
||||
uint8_t *buff, |
||||
uint32_t length, |
||||
uint8_t pipe_num); |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* __USBH_IOREQ_H */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
||||
|
||||
|
@ -1,123 +0,0 @@
|
||||
/**
|
||||
****************************************************************************** |
||||
* @file usbh_pipes.h |
||||
* @author MCD Application Team |
||||
* @brief Header file for usbh_pipes.c |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics. |
||||
* All rights reserved.</center></h2> |
||||
* |
||||
* This software component is licensed by ST under Ultimate Liberty license |
||||
* SLA0044, the "License"; You may not use this file except in compliance with |
||||
* the License. You may obtain a copy of the License at: |
||||
* www.st.com/SLA0044 |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive ----------------------------------------------*/ |
||||
#ifndef __USBH_PIPES_H |
||||
#define __USBH_PIPES_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbh_core.h" |
||||
|
||||
/** @addtogroup USBH_LIB
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @addtogroup USBH_LIB_CORE
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup USBH_PIPES
|
||||
* @brief This file is the header file for usbh_pipes.c |
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup USBH_PIPES_Exported_Defines
|
||||
* @{ |
||||
*/ |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBH_PIPES_Exported_Types
|
||||
* @{ |
||||
*/ |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/** @defgroup USBH_PIPES_Exported_Macros
|
||||
* @{ |
||||
*/ |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBH_PIPES_Exported_Variables
|
||||
* @{ |
||||
*/ |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBH_PIPES_Exported_FunctionsPrototype
|
||||
* @{ |
||||
*/ |
||||
|
||||
USBH_StatusTypeDef USBH_OpenPipe(USBH_HandleTypeDef *phost, |
||||
uint8_t pipe_num, |
||||
uint8_t epnum, |
||||
uint8_t dev_address, |
||||
uint8_t speed, |
||||
uint8_t ep_type, |
||||
uint16_t mps); |
||||
|
||||
USBH_StatusTypeDef USBH_ClosePipe(USBH_HandleTypeDef *phost, |
||||
uint8_t pipe_num); |
||||
|
||||
uint8_t USBH_AllocPipe(USBH_HandleTypeDef *phost, |
||||
uint8_t ep_addr); |
||||
|
||||
USBH_StatusTypeDef USBH_FreePipe(USBH_HandleTypeDef *phost, |
||||
uint8_t idx); |
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* __USBH_PIPES_H */ |
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,350 +0,0 @@
|
||||
/**
|
||||
****************************************************************************** |
||||
* @file usbh_ioreq.c |
||||
* @author MCD Application Team |
||||
* @brief This file handles the issuing of the USB transactions |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics. |
||||
* All rights reserved.</center></h2> |
||||
* |
||||
* This software component is licensed by ST under Ultimate Liberty license |
||||
* SLA0044, the "License"; You may not use this file except in compliance with |
||||
* the License. You may obtain a copy of the License at: |
||||
* www.st.com/SLA0044 |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbh_ioreq.h" |
||||
|
||||
/** @addtogroup USBH_LIB
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @addtogroup USBH_LIB_CORE
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup USBH_IOREQ
|
||||
* @brief This file handles the standard protocol processing (USB v2.0) |
||||
* @{ |
||||
*/ |
||||
|
||||
|
||||
/** @defgroup USBH_IOREQ_Private_Defines
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/** @defgroup USBH_IOREQ_Private_TypesDefinitions
|
||||
* @{ |
||||
*/ |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
|
||||
/** @defgroup USBH_IOREQ_Private_Macros
|
||||
* @{ |
||||
*/ |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/** @defgroup USBH_IOREQ_Private_Variables
|
||||
* @{ |
||||
*/ |
||||
/**
|
||||
* @} |
||||
*/ |
||||
/** @defgroup USBH_IOREQ_Private_FunctionPrototypes
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/** @defgroup USBH_IOREQ_Private_Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
|
||||
|
||||
/**
|
||||
* @brief USBH_CtlSendSetup |
||||
* Sends the Setup Packet to the Device |
||||
* @param phost: Host Handle |
||||
* @param buff: Buffer pointer from which the Data will be send to Device |
||||
* @param pipe_num: Pipe Number |
||||
* @retval USBH Status |
||||
*/ |
||||
USBH_StatusTypeDef USBH_CtlSendSetup(USBH_HandleTypeDef *phost, |
||||
uint8_t *buff, |
||||
uint8_t pipe_num) |
||||
{ |
||||
|
||||
(void)USBH_LL_SubmitURB(phost, /* Driver handle */ |
||||
pipe_num, /* Pipe index */ |
||||
0U, /* Direction : OUT */ |
||||
USBH_EP_CONTROL, /* EP type */ |
||||
USBH_PID_SETUP, /* Type setup */ |
||||
buff, /* data buffer */ |
||||
USBH_SETUP_PKT_SIZE, /* data length */ |
||||
0U); |
||||
return USBH_OK; |
||||
} |
||||
|
||||
|
||||
/**
|
||||
* @brief USBH_CtlSendData |
||||
* Sends a data Packet to the Device |
||||
* @param phost: Host Handle |
||||
* @param buff: Buffer pointer from which the Data will be sent to Device |
||||
* @param length: Length of the data to be sent |
||||
* @param pipe_num: Pipe Number |
||||
* @retval USBH Status |
||||
*/ |
||||
USBH_StatusTypeDef USBH_CtlSendData(USBH_HandleTypeDef *phost, |
||||
uint8_t *buff, |
||||
uint16_t length, |
||||
uint8_t pipe_num, |
||||
uint8_t do_ping) |
||||
{ |
||||
if (phost->device.speed != USBH_SPEED_HIGH) |
||||
{ |
||||
do_ping = 0U; |
||||
} |
||||
|
||||
(void)USBH_LL_SubmitURB(phost, /* Driver handle */ |
||||
pipe_num, /* Pipe index */ |
||||
0U, /* Direction : OUT */ |
||||
USBH_EP_CONTROL, /* EP type */ |
||||
USBH_PID_DATA, /* Type Data */ |
||||
buff, /* data buffer */ |
||||
length, /* data length */ |
||||
do_ping); /* do ping (HS Only)*/ |
||||
|
||||
return USBH_OK; |
||||
} |
||||
|
||||
|
||||
/**
|
||||
* @brief USBH_CtlReceiveData |
||||
* Receives the Device Response to the Setup Packet |
||||
* @param phost: Host Handle |
||||
* @param buff: Buffer pointer in which the response needs to be copied |
||||
* @param length: Length of the data to be received |
||||
* @param pipe_num: Pipe Number |
||||
* @retval USBH Status. |
||||
*/ |
||||
USBH_StatusTypeDef USBH_CtlReceiveData(USBH_HandleTypeDef *phost, |
||||
uint8_t *buff, |
||||
uint16_t length, |
||||
uint8_t pipe_num) |
||||
{ |
||||
(void)USBH_LL_SubmitURB(phost, /* Driver handle */ |
||||
pipe_num, /* Pipe index */ |
||||
1U, /* Direction : IN */ |
||||
USBH_EP_CONTROL, /* EP type */ |
||||
USBH_PID_DATA, /* Type Data */ |
||||
buff, /* data buffer */ |
||||
length, /* data length */ |
||||
0U); |
||||
return USBH_OK; |
||||
|
||||
} |
||||
|
||||
|
||||
/**
|
||||
* @brief USBH_BulkSendData |
||||
* Sends the Bulk Packet to the device |
||||
* @param phost: Host Handle |
||||
* @param buff: Buffer pointer from which the Data will be sent to Device |
||||
* @param length: Length of the data to be sent |
||||
* @param pipe_num: Pipe Number |
||||
* @retval USBH Status |
||||
*/ |
||||
USBH_StatusTypeDef USBH_BulkSendData(USBH_HandleTypeDef *phost, |
||||
uint8_t *buff, |
||||
uint16_t length, |
||||
uint8_t pipe_num, |
||||
uint8_t do_ping) |
||||
{ |
||||
if (phost->device.speed != USBH_SPEED_HIGH) |
||||
{ |
||||
do_ping = 0U; |
||||
} |
||||
|
||||
(void)USBH_LL_SubmitURB(phost, /* Driver handle */ |
||||
pipe_num, /* Pipe index */ |
||||
0U, /* Direction : IN */ |
||||
USBH_EP_BULK, /* EP type */ |
||||
USBH_PID_DATA, /* Type Data */ |
||||
buff, /* data buffer */ |
||||
length, /* data length */ |
||||
do_ping); /* do ping (HS Only)*/ |
||||
return USBH_OK; |
||||
} |
||||
|
||||
|
||||
/**
|
||||
* @brief USBH_BulkReceiveData |
||||
* Receives IN bulk packet from device |
||||
* @param phost: Host Handle |
||||
* @param buff: Buffer pointer in which the received data packet to be copied |
||||
* @param length: Length of the data to be received |
||||
* @param pipe_num: Pipe Number |
||||
* @retval USBH Status. |
||||
*/ |
||||
USBH_StatusTypeDef USBH_BulkReceiveData(USBH_HandleTypeDef *phost, |
||||
uint8_t *buff, |
||||
uint16_t length, |
||||
uint8_t pipe_num) |
||||
{ |
||||
(void)USBH_LL_SubmitURB(phost, /* Driver handle */ |
||||
pipe_num, /* Pipe index */ |
||||
1U, /* Direction : IN */ |
||||
USBH_EP_BULK, /* EP type */ |
||||
USBH_PID_DATA, /* Type Data */ |
||||
buff, /* data buffer */ |
||||
length, /* data length */ |
||||
0U); |
||||
return USBH_OK; |
||||
} |
||||
|
||||
|
||||
/**
|
||||
* @brief USBH_InterruptReceiveData |
||||
* Receives the Device Response to the Interrupt IN token |
||||
* @param phost: Host Handle |
||||
* @param buff: Buffer pointer in which the response needs to be copied |
||||
* @param length: Length of the data to be received |
||||
* @param pipe_num: Pipe Number |
||||
* @retval USBH Status. |
||||
*/ |
||||
USBH_StatusTypeDef USBH_InterruptReceiveData(USBH_HandleTypeDef *phost, |
||||
uint8_t *buff, |
||||
uint8_t length, |
||||
uint8_t pipe_num) |
||||
{ |
||||
(void)USBH_LL_SubmitURB(phost, /* Driver handle */ |
||||
pipe_num, /* Pipe index */ |
||||
1U, /* Direction : IN */ |
||||
USBH_EP_INTERRUPT, /* EP type */ |
||||
USBH_PID_DATA, /* Type Data */ |
||||
buff, /* data buffer */ |
||||
(uint16_t)length, /* data length */ |
||||
0U); |
||||
|
||||
return USBH_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBH_InterruptSendData |
||||
* Sends the data on Interrupt OUT Endpoint |
||||
* @param phost: Host Handle |
||||
* @param buff: Buffer pointer from where the data needs to be copied |
||||
* @param length: Length of the data to be sent |
||||
* @param pipe_num: Pipe Number |
||||
* @retval USBH Status. |
||||
*/ |
||||
USBH_StatusTypeDef USBH_InterruptSendData(USBH_HandleTypeDef *phost, |
||||
uint8_t *buff, |
||||
uint8_t length, |
||||
uint8_t pipe_num) |
||||
{ |
||||
(void)USBH_LL_SubmitURB(phost, /* Driver handle */ |
||||
pipe_num, /* Pipe index */ |
||||
0U, /* Direction : OUT */ |
||||
USBH_EP_INTERRUPT, /* EP type */ |
||||
USBH_PID_DATA, /* Type Data */ |
||||
buff, /* data buffer */ |
||||
(uint16_t)length, /* data length */ |
||||
0U); |
||||
|
||||
return USBH_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBH_IsocReceiveData |
||||
* Receives the Device Response to the Isochronous IN token |
||||
* @param phost: Host Handle |
||||
* @param buff: Buffer pointer in which the response needs to be copied |
||||
* @param length: Length of the data to be received |
||||
* @param pipe_num: Pipe Number |
||||
* @retval USBH Status. |
||||
*/ |
||||
USBH_StatusTypeDef USBH_IsocReceiveData(USBH_HandleTypeDef *phost, |
||||
uint8_t *buff, |
||||
uint32_t length, |
||||
uint8_t pipe_num) |
||||
{ |
||||
(void)USBH_LL_SubmitURB(phost, /* Driver handle */ |
||||
pipe_num, /* Pipe index */ |
||||
1U, /* Direction : IN */ |
||||
USBH_EP_ISO, /* EP type */ |
||||
USBH_PID_DATA, /* Type Data */ |
||||
buff, /* data buffer */ |
||||
(uint16_t)length, /* data length */ |
||||
0U); |
||||
|
||||
|
||||
return USBH_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBH_IsocSendData |
||||
* Sends the data on Isochronous OUT Endpoint |
||||
* @param phost: Host Handle |
||||
* @param buff: Buffer pointer from where the data needs to be copied |
||||
* @param length: Length of the data to be sent |
||||
* @param pipe_num: Pipe Number |
||||
* @retval USBH Status. |
||||
*/ |
||||
USBH_StatusTypeDef USBH_IsocSendData(USBH_HandleTypeDef *phost, |
||||
uint8_t *buff, |
||||
uint32_t length, |
||||
uint8_t pipe_num) |
||||
{ |
||||
(void)USBH_LL_SubmitURB(phost, /* Driver handle */ |
||||
pipe_num, /* Pipe index */ |
||||
0U, /* Direction : OUT */ |
||||
USBH_EP_ISO, /* EP type */ |
||||
USBH_PID_DATA, /* Type Data */ |
||||
buff, /* data buffer */ |
||||
(uint16_t)length, /* data length */ |
||||
0U); |
||||
|
||||
return USBH_OK; |
||||
} |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
||||
|
||||
|
||||
|
@ -1,188 +0,0 @@
|
||||
/**
|
||||
****************************************************************************** |
||||
* @file usbh_pipes.c |
||||
* @author MCD Application Team |
||||
* @brief This file implements functions for opening and closing Pipes |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics. |
||||
* All rights reserved.</center></h2> |
||||
* |
||||
* This software component is licensed by ST under Ultimate Liberty license |
||||
* SLA0044, the "License"; You may not use this file except in compliance with |
||||
* the License. You may obtain a copy of the License at: |
||||
* www.st.com/SLA0044 |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbh_pipes.h" |
||||
|
||||
/** @addtogroup USBH_LIB
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @addtogroup USBH_LIB_CORE
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup USBH_PIPES
|
||||
* @brief This file includes opening and closing Pipes |
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup USBH_PIPES_Private_Defines
|
||||
* @{ |
||||
*/ |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBH_PIPES_Private_TypesDefinitions
|
||||
* @{ |
||||
*/ |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/** @defgroup USBH_PIPES_Private_Macros
|
||||
* @{ |
||||
*/ |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/** @defgroup USBH_PIPES_Private_Variables
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/** @defgroup USBH_PIPES_Private_Functions
|
||||
* @{ |
||||
*/ |
||||
static uint16_t USBH_GetFreePipe(USBH_HandleTypeDef *phost); |
||||
|
||||
|
||||
/**
|
||||
* @brief USBH_Open_Pipe |
||||
* Open a pipe |
||||
* @param phost: Host Handle |
||||
* @param pipe_num: Pipe Number |
||||
* @param dev_address: USB Device address allocated to attached device |
||||
* @param speed : USB device speed (Full/Low) |
||||
* @param ep_type: end point type (Bulk/int/ctl) |
||||
* @param mps: max pkt size |
||||
* @retval USBH Status |
||||
*/ |
||||
USBH_StatusTypeDef USBH_OpenPipe(USBH_HandleTypeDef *phost, uint8_t pipe_num, |
||||
uint8_t epnum, uint8_t dev_address, |
||||
uint8_t speed, uint8_t ep_type, uint16_t mps) |
||||
{ |
||||
(void)USBH_LL_OpenPipe(phost, pipe_num, epnum, dev_address, speed, ep_type, mps); |
||||
|
||||
return USBH_OK; |
||||
} |
||||
|
||||
|
||||
/**
|
||||
* @brief USBH_ClosePipe |
||||
* Close a pipe |
||||
* @param phost: Host Handle |
||||
* @param pipe_num: Pipe Number |
||||
* @retval USBH Status |
||||
*/ |
||||
USBH_StatusTypeDef USBH_ClosePipe(USBH_HandleTypeDef *phost, uint8_t pipe_num) |
||||
{ |
||||
(void)USBH_LL_ClosePipe(phost, pipe_num); |
||||
|
||||
return USBH_OK; |
||||
} |
||||
|
||||
|
||||
/**
|
||||
* @brief USBH_Alloc_Pipe |
||||
* Allocate a new Pipe |
||||
* @param phost: Host Handle |
||||
* @param ep_addr: End point for which the Pipe to be allocated |
||||
* @retval Pipe number |
||||
*/ |
||||
uint8_t USBH_AllocPipe(USBH_HandleTypeDef *phost, uint8_t ep_addr) |
||||
{ |
||||
uint16_t pipe; |
||||
|
||||
pipe = USBH_GetFreePipe(phost); |
||||
|
||||
if (pipe != 0xFFFFU) |
||||
{ |
||||
phost->Pipes[pipe & 0xFU] = (uint32_t)(0x8000U | ep_addr); |
||||
} |
||||
|
||||
return (uint8_t)pipe; |
||||
} |
||||
|
||||
|
||||
/**
|
||||
* @brief USBH_Free_Pipe |
||||
* Free the USB Pipe |
||||
* @param phost: Host Handle |
||||
* @param idx: Pipe number to be freed |
||||
* @retval USBH Status |
||||
*/ |
||||
USBH_StatusTypeDef USBH_FreePipe(USBH_HandleTypeDef *phost, uint8_t idx) |
||||
{ |
||||
if (idx < USBH_MAX_PIPES_NBR) |
||||
{ |
||||
phost->Pipes[idx] &= 0x7FFFU; |
||||
} |
||||
|
||||
return USBH_OK; |
||||
} |
||||
|
||||
|
||||
/**
|
||||
* @brief USBH_GetFreePipe |
||||
* @param phost: Host Handle |
||||
* Get a free Pipe number for allocation to a device endpoint |
||||
* @retval idx: Free Pipe number |
||||
*/ |
||||
static uint16_t USBH_GetFreePipe(USBH_HandleTypeDef *phost) |
||||
{ |
||||
uint8_t idx = 0U; |
||||
|
||||
for (idx = 0U ; idx < USBH_MAX_PIPES_NBR ; idx++) |
||||
{ |
||||
if ((phost->Pipes[idx] & 0x8000U) == 0U) |
||||
{ |
||||
return (uint16_t)idx; |
||||
} |
||||
} |
||||
|
||||
return 0xFFFFU; |
||||
} |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
||||
|
||||
|
@ -1 +1 @@
|
||||
Subproject commit 2b21d11c561fcc5d7ca82a6fb21180c10b0f016b |
||||
Subproject commit 6aaa013284b2712761200fffd02de09a4610e808 |
@ -0,0 +1,209 @@
|
||||
cmake_minimum_required(VERSION 3.10) |
||||
|
||||
project(eez-flow-template-stm32f469i-disco) |
||||
|
||||
set (CMAKE_CXX_STANDARD 17) |
||||
|
||||
if(MSVC) |
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4 /wd4100 /wd4214 /wd4200 /wd4244 /wd4456 /wd4457 /wd4458 /wd4459 /wd4245 /wd4389 /wd4706 /wd4611 /wd4310") |
||||
endif() |
||||
|
||||
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/") |
||||
|
||||
if(${CMAKE_SYSTEM_NAME} STREQUAL "Emscripten") |
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wunused-const-variable -Wno-nested-anon-types -Wno-dollar-in-identifier-extension -O2 --no-entry") |
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_CXX_FLAGS} -s DEMANGLE_SUPPORT=1 -s FORCE_FILESYSTEM=1 -s ALLOW_MEMORY_GROWTH=1 -s INITIAL_MEMORY=83886080 -s LLD_REPORT_UNDEFINED -s ASSERTIONS=1 -s EXPORTED_RUNTIME_METHODS=allocateUTF8,AsciiToString,UTF8ToString --bind -lidbfs.js") |
||||
#set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --preload-file ../../images/eez.png") |
||||
add_definitions(-DEMCC_DEBUG) |
||||
endif() |
||||
|
||||
add_definitions(-DSKIP_TOUCH_CALIBRATION) |
||||
|
||||
add_definitions(-DFIRMWARE_VERSION_MAJOR=0) |
||||
add_definitions(-DFIRMWARE_VERSION_MINOR=1) |
||||
|
||||
if(${CMAKE_SYSTEM_NAME} STREQUAL "Emscripten") |
||||
else() |
||||
set(SDL2_BUILDING_LIBRARY 1) |
||||
find_package(SDL2 REQUIRED) |
||||
find_package(SDL2_image REQUIRED) |
||||
include_directories(SYSTEM ${SDL2_INCLUDE_DIRS}) |
||||
include_directories(SYSTEM ${SDL2IMAGE_INCLUDE_DIR}) |
||||
endif() |
||||
|
||||
if (UNIX) |
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpermissive -pedantic") |
||||
endif (UNIX) |
||||
|
||||
add_definitions(-DDEBUG) |
||||
|
||||
add_definitions(-DEEZ_PLATFORM_SIMULATOR) |
||||
|
||||
if(WIN32) |
||||
ENABLE_LANGUAGE(RC) |
||||
add_definitions(-D_CRT_SECURE_NO_WARNINGS) |
||||
add_definitions(-DEEZ_PLATFORM_SIMULATOR_WIN32) |
||||
endif() |
||||
|
||||
if (UNIX) |
||||
add_definitions(-DEEZ_PLATFORM_SIMULATOR_UNIX) |
||||
endif() |
||||
|
||||
if(${CMAKE_SYSTEM_NAME} STREQUAL "Emscripten") |
||||
add_definitions(-DEEZ_PLATFORM_SIMULATOR_EMSCRIPTEN) |
||||
endif() |
||||
|
||||
include_directories( |
||||
../Middlewares |
||||
../Middlewares/eez/libs/agg |
||||
../Middlewares/eez/libs/libscpi/inc |
||||
../Middlewares/eez/platform/simulator |
||||
../Src/scpi |
||||
../Src/conf |
||||
) |
||||
|
||||
set(src_files) |
||||
set(header_files) |
||||
|
||||
|
||||
################################################################################ |
||||
# EEZ Framework files |
||||
file(GLOB_RECURSE src_eez |
||||
../Middlewares/eez/*.cpp |
||||
../Middlewares/eez/*.c |
||||
) |
||||
file(GLOB_RECURSE header_eez |
||||
../Middlewares/eez/*.h |
||||
) |
||||
|
||||
# exclude STM32 platform specific files |
||||
set (EXCLUDE_DIR "../Middlewares/eez/platform/stm32") |
||||
foreach (TMP_PATH ${src_eez}) |
||||
string (FIND ${TMP_PATH} ${EXCLUDE_DIR} EXCLUDE_DIR_FOUND) |
||||
if (NOT ${EXCLUDE_DIR_FOUND} EQUAL -1) |
||||
list (REMOVE_ITEM src_eez ${TMP_PATH}) |
||||
endif () |
||||
endforeach(TMP_PATH) |
||||
foreach (TMP_PATH ${header_eez}) |
||||
string (FIND ${TMP_PATH} ${EXCLUDE_DIR} EXCLUDE_DIR_FOUND) |
||||
if (NOT ${EXCLUDE_DIR_FOUND} EQUAL -1) |
||||
list (REMOVE_ITEM header_eez ${TMP_PATH}) |
||||
endif () |
||||
endforeach(TMP_PATH) |
||||
|
||||
list (APPEND src_files ${src_eez}) |
||||
list (APPEND header_files ${header_eez}) |
||||
|
||||
source_group(TREE "../../../Middlewares/eez" PREFIX "eez" FILES ${src_eez} ${header_eez}) |
||||
|
||||
if(MSVC) |
||||
set(libscpi_src_files ${src_files}) |
||||
list(FILTER libscpi_src_files INCLUDE REGEX "${CMAKE_CURRENT_SOURCE_DIR}/../Middlewares/eez/libs/libscpi") |
||||
set_source_files_properties(${libscpi_src_files} PROPERTIES COMPILE_FLAGS /W0) |
||||
endif() |
||||
|
||||
################################################################################ |
||||
|
||||
|
||||
################################################################################ |
||||
file(GLOB_RECURSE src_custom |
||||
*.cpp |
||||
*.c |
||||
) |
||||
file(GLOB_RECURSE header_custom |
||||
*.h |
||||
) |
||||
|
||||
# exclude STM32 platform specific files |
||||
set (EXCLUDE_DIR "build") |
||||
foreach (TMP_PATH ${src_custom}) |
||||
string (FIND ${TMP_PATH} ${EXCLUDE_DIR} EXCLUDE_DIR_FOUND) |
||||
if (NOT ${EXCLUDE_DIR_FOUND} EQUAL -1) |
||||
list (REMOVE_ITEM src_custom ${TMP_PATH}) |
||||
endif () |
||||
endforeach(TMP_PATH) |
||||
foreach (TMP_PATH ${header_custom}) |
||||
string (FIND ${TMP_PATH} ${EXCLUDE_DIR} EXCLUDE_DIR_FOUND) |
||||
if (NOT ${EXCLUDE_DIR_FOUND} EQUAL -1) |
||||
list (REMOVE_ITEM header_custom ${TMP_PATH}) |
||||
endif () |
||||
endforeach(TMP_PATH) |
||||
|
||||
list (APPEND src_files ${src_custom}) |
||||
list (APPEND header_files ${header_custom}) |
||||
|
||||
source_group(TREE "../../../Src" PREFIX "Src" FILES ${src_custom} ${header_custom}) |
||||
|
||||
################################################################################ |
||||
|
||||
|
||||
if(WIN32) |
||||
set(src_win32_specific |
||||
../Src/platform/simulator/win32/icon.rc |
||||
) |
||||
list (APPEND src_files ${src_win32_specific}) |
||||
source_group("win32" FILES ${src_win32_specific}) |
||||
|
||||
set(SOURCES Src/platform/simulator/win32/icon.rc ${src_files}) |
||||
endif() |
||||
|
||||
add_executable(eez-flow-template-stm32f469i-disco ${src_files} ${header_files}) |
||||
|
||||
if(MSVC) |
||||
target_compile_options(eez-flow-template-stm32f469i-disco PRIVATE "/MP") |
||||
endif() |
||||
|
||||
if (UNIX AND NOT(${CMAKE_SYSTEM_NAME} STREQUAL "Emscripten")) |
||||
set(THREADS_PREFER_PTHREAD_FLAG ON) |
||||
find_package(Threads REQUIRED) |
||||
target_link_libraries(eez-flow-template-stm32f469i-disco Threads::Threads bsd) |
||||
endif () |
||||
|
||||
target_link_libraries(eez-flow-template-stm32f469i-disco ${SDL2_LIBRARIES} ${SDL2_IMAGE_LIBRARIES}) |
||||
|
||||
if(WIN32) |
||||
target_link_libraries(eez-flow-template-stm32f469i-disco wsock32 ws2_32) |
||||
|
||||
add_custom_command(TARGET eez-flow-template-stm32f469i-disco POST_BUILD |
||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different |
||||
"${PROJECT_SOURCE_DIR}/../../SDL2-2.0.14/lib/x86/SDL2.dll" |
||||
$<TARGET_FILE_DIR:eez-flow-template-stm32f469i-disco>) |
||||
|
||||
add_custom_command(TARGET eez-flow-template-stm32f469i-disco POST_BUILD |
||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different |
||||
"${PROJECT_SOURCE_DIR}/../../SDL2_image-2.0.4/lib/x86/libjpeg-9.dll" |
||||
$<TARGET_FILE_DIR:eez-flow-template-stm32f469i-disco>) |
||||
|
||||
add_custom_command(TARGET eez-flow-template-stm32f469i-disco POST_BUILD |
||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different |
||||
"${PROJECT_SOURCE_DIR}/../../SDL2_image-2.0.4/lib/x86/libpng16-16.dll" |
||||
$<TARGET_FILE_DIR:eez-flow-template-stm32f469i-disco>) |
||||
|
||||
add_custom_command(TARGET eez-flow-template-stm32f469i-disco POST_BUILD |
||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different |
||||
"${PROJECT_SOURCE_DIR}/../../SDL2_image-2.0.4/lib/x86/libtiff-5.dll" |
||||
$<TARGET_FILE_DIR:eez-flow-template-stm32f469i-disco>) |
||||
|
||||
add_custom_command(TARGET eez-flow-template-stm32f469i-disco POST_BUILD |
||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different |
||||
"${PROJECT_SOURCE_DIR}/../../SDL2_image-2.0.4/lib/x86/libwebp-7.dll" |
||||
$<TARGET_FILE_DIR:eez-flow-template-stm32f469i-disco>) |
||||
|
||||
add_custom_command(TARGET eez-flow-template-stm32f469i-disco POST_BUILD |
||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different |
||||
"${PROJECT_SOURCE_DIR}/../../SDL2_image-2.0.4/lib/x86/SDL2_image.dll" |
||||
$<TARGET_FILE_DIR:eez-flow-template-stm32f469i-disco>) |
||||
|
||||
add_custom_command(TARGET eez-flow-template-stm32f469i-disco POST_BUILD |
||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different |
||||
"${PROJECT_SOURCE_DIR}/../../SDL2_image-2.0.4/lib/x86/zlib1.dll" |
||||
$<TARGET_FILE_DIR:eez-flow-template-stm32f469i-disco>) |
||||
|
||||
endif() |
||||
|
||||
if(${CMAKE_SYSTEM_NAME} STREQUAL "Emscripten") |
||||
add_custom_command(TARGET eez-flow-template-stm32f469i-disco POST_BUILD |
||||
COMMAND ${CMAKE_COMMAND} -E copy_directory |
||||
"${PROJECT_SOURCE_DIR}/platform/simulator/emscripten" |
||||
$<TARGET_FILE_DIR:eez-flow-template-stm32f469i-disco>) |
||||
endif() |
@ -0,0 +1,11 @@
|
||||
set SDL2DIR=..\..\SDL2-2.0.14 |
||||
set SDL2IMAGEDIR=..\..\SDL2_image-2.0.4 |
||||
|
||||
if not exist "build" mkdir "build" |
||||
if not exist "build\win32" mkdir "build\win32" |
||||
|
||||
cd build\win32 |
||||
|
||||
cmake -G "Visual Studio 15 2017" ..\.. |
||||
|
||||
cd ..\.. |
@ -0,0 +1,361 @@
|
||||
# This file is a 'toolchain description file' for CMake. |
||||
# It teaches CMake about the Emscripten compiler, so that CMake can generate makefiles |
||||
# from CMakeLists.txt that invoke emcc. |
||||
|
||||
# At the moment this required minimum version is not exact (i.e. we do not know of a feature that needs CMake 3.0.0 specifically) |
||||
# It is possible that CMake 3.0.0 is too old and will not actually work. If you do find such a case, please report it at Emscripten |
||||
# bug tracker to revise the minimum requirement. See also https://github.com/juj/emsdk/issues/108 |
||||
cmake_minimum_required(VERSION 3.0.0) |
||||
|
||||
# To use this toolchain file with CMake, invoke CMake with the following command line parameters |
||||
# cmake -DCMAKE_TOOLCHAIN_FILE=<EmscriptenRoot>/cmake/Modules/Platform/Emscripten.cmake |
||||
# -DCMAKE_BUILD_TYPE=<Debug|RelWithDebInfo|Release|MinSizeRel> |
||||
# -G "Unix Makefiles" (Linux and OSX) |
||||
# -G "MinGW Makefiles" (Windows) |
||||
# <path/to/CMakeLists.txt> # Note, pass in here ONLY the path to the file, not the filename 'CMakeLists.txt' itself. |
||||
|
||||
# After that, build the generated Makefile with the command 'make'. On Windows, you may download and use 'mingw32-make' instead. |
||||
|
||||
# The following variable describes the target OS we are building to. |
||||
set(CMAKE_SYSTEM_NAME Emscripten) |
||||
set(CMAKE_SYSTEM_VERSION 1) |
||||
|
||||
set(CMAKE_CROSSCOMPILING TRUE) |
||||
|
||||
# Advertise Emscripten as a 32-bit platform (as opposed to CMAKE_SYSTEM_PROCESSOR=x86_64 for 64-bit platform), |
||||
# since some projects (e.g. OpenCV) use this to detect bitness. |
||||
set(CMAKE_SYSTEM_PROCESSOR x86) |
||||
|
||||
# Tell CMake how it should instruct the compiler to generate multiple versions of an outputted .so library: e.g. "libfoo.so, libfoo.so.1, libfoo.so.1.4" etc. |
||||
# This feature is activated if a shared library project has the property SOVERSION defined. |
||||
set(CMAKE_SHARED_LIBRARY_SONAME_C_FLAG "-Wl,-soname,") |
||||
|
||||
# In CMake, CMAKE_HOST_WIN32 is set when we are cross-compiling from Win32 to Emscripten: http://www.cmake.org/cmake/help/v2.8.12/cmake.html#variable:CMAKE_HOST_WIN32 |
||||
# The variable WIN32 is set only when the target arch that will run the code will be WIN32, so unset WIN32 when cross-compiling. |
||||
set(WIN32) |
||||
|
||||
# The same logic as above applies for APPLE and CMAKE_HOST_APPLE, so unset APPLE. |
||||
set(APPLE) |
||||
|
||||
# And for UNIX and CMAKE_HOST_UNIX. However, Emscripten is often able to mimic being a Linux/Unix system, in which case a lot of existing CMakeLists.txt files can be configured for Emscripten while assuming UNIX build, so this is left enabled. |
||||
set(UNIX 1) |
||||
|
||||
# Do a no-op access on the CMAKE_TOOLCHAIN_FILE variable so that CMake will not issue a warning on it being unused. |
||||
if (CMAKE_TOOLCHAIN_FILE) |
||||
endif() |
||||
|
||||
# In order for check_function_exists() detection to work, we must signal it to pass an additional flag, which causes the compilation |
||||
# to abort if linking results in any undefined symbols. The CMake detection mechanism depends on the undefined symbol error to be raised. |
||||
# Disable wasm in cmake checks so that (1) we do not depend on wasm support just for configuration (perhaps the user does not intend |
||||
# to build to wasm; using asm.js only depends on js which we need anyhow), and (2) we don't have issues with a separate .wasm file |
||||
# on the side, async startup, etc.. |
||||
set(CMAKE_REQUIRED_FLAGS "-s WASM=0") |
||||
|
||||
# Locate where the Emscripten compiler resides in relative to this toolchain file. |
||||
if ("${EMSCRIPTEN_ROOT_PATH}" STREQUAL "") |
||||
get_filename_component(GUESS_EMSCRIPTEN_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../" ABSOLUTE) |
||||
if (EXISTS "${GUESS_EMSCRIPTEN_ROOT_PATH}/emranlib") |
||||
set(EMSCRIPTEN_ROOT_PATH "${GUESS_EMSCRIPTEN_ROOT_PATH}") |
||||
endif() |
||||
endif() |
||||
|
||||
# If not found by above search, locate using the EMSCRIPTEN environment variable. |
||||
if ("${EMSCRIPTEN_ROOT_PATH}" STREQUAL "") |
||||
set(EMSCRIPTEN_ROOT_PATH "$ENV{EMSCRIPTEN}") |
||||
endif() |
||||
|
||||
# Abort if not found. |
||||
if ("${EMSCRIPTEN_ROOT_PATH}" STREQUAL "") |
||||
message(FATAL_ERROR "Could not locate the Emscripten compiler toolchain directory! Either set the EMSCRIPTEN environment variable, or pass -DEMSCRIPTEN_ROOT_PATH=xxx to CMake to explicitly specify the location of the compiler!") |
||||
endif() |
||||
|
||||
# Normalize, convert Windows backslashes to forward slashes or CMake will crash. |
||||
get_filename_component(EMSCRIPTEN_ROOT_PATH "${EMSCRIPTEN_ROOT_PATH}" ABSOLUTE) |
||||
|
||||
list(APPEND CMAKE_MODULE_PATH "${EMSCRIPTEN_ROOT_PATH}/cmake/Modules") |
||||
|
||||
list(APPEND CMAKE_FIND_ROOT_PATH "${EMSCRIPTEN_ROOT_PATH}/system") |
||||
|
||||
if (CMAKE_HOST_WIN32) |
||||
set(EMCC_SUFFIX ".bat") |
||||
else() |
||||
set(EMCC_SUFFIX "") |
||||
endif() |
||||
|
||||
# Specify the compilers to use for C and C++ |
||||
if ("${CMAKE_C_COMPILER}" STREQUAL "") |
||||
set(CMAKE_C_COMPILER "${EMSCRIPTEN_ROOT_PATH}/emcc${EMCC_SUFFIX}") |
||||
endif() |
||||
if ("${CMAKE_CXX_COMPILER}" STREQUAL "") |
||||
set(CMAKE_CXX_COMPILER "${EMSCRIPTEN_ROOT_PATH}/em++${EMCC_SUFFIX}") |
||||
endif() |
||||
|
||||
if ("${CMAKE_AR}" STREQUAL "") |
||||
set(CMAKE_AR "${EMSCRIPTEN_ROOT_PATH}/emar${EMCC_SUFFIX}" CACHE FILEPATH "Emscripten ar") |
||||
endif() |
||||
|
||||
if ("${CMAKE_RANLIB}" STREQUAL "") |
||||
set(CMAKE_RANLIB "${EMSCRIPTEN_ROOT_PATH}/emranlib${EMCC_SUFFIX}" CACHE FILEPATH "Emscripten ranlib") |
||||
endif() |
||||
|
||||
# Don't allow CMake to autodetect the compiler, since it does not understand Emscripten. |
||||
# Pass -DEMSCRIPTEN_FORCE_COMPILERS=OFF to disable (sensible mostly only for testing/debugging purposes). |
||||
option(EMSCRIPTEN_FORCE_COMPILERS "Force C/C++ compiler" ON) |
||||
if (EMSCRIPTEN_FORCE_COMPILERS) |
||||
|
||||
# Detect version of the 'emcc' executable. Note that for CMake, we tell it the version of the Clang compiler and not the version of Emscripten, |
||||
# because CMake understands Clang better. |
||||
if (NOT CMAKE_C_COMPILER_VERSION) # Toolchain script is interpreted multiple times, so don't rerun the check if already done before. |
||||
execute_process(COMMAND "${CMAKE_C_COMPILER}" "-v" RESULT_VARIABLE _cmake_compiler_result ERROR_VARIABLE _cmake_compiler_output OUTPUT_QUIET) |
||||
if (NOT _cmake_compiler_result EQUAL 0) |
||||
message(FATAL_ERROR "Failed to fetch compiler version information with command \"'${CMAKE_C_COMPILER}' -v\"! Process returned with error code ${_cmake_compiler_result}.") |
||||
endif() |
||||
if (NOT "${_cmake_compiler_output}" MATCHES "[Ee]mscripten") |
||||
message(FATAL_ERROR "System LLVM compiler cannot be used to build with Emscripten! Check Emscripten's LLVM toolchain location in .emscripten configuration file, and make sure to point CMAKE_C_COMPILER to where emcc is located. (was pointing to \"${CMAKE_C_COMPILER}\")") |
||||
endif() |
||||
string(REGEX MATCH "clang version ([0-9\\.]+)" _dummy_unused "${_cmake_compiler_output}") |
||||
if (NOT CMAKE_MATCH_1) |
||||
message(FATAL_ERROR "Failed to regex parse Clang compiler version from version string: ${_cmake_compiler_output}") |
||||
endif() |
||||
|
||||
set(CMAKE_C_COMPILER_VERSION "${CMAKE_MATCH_1}") |
||||
set(CMAKE_CXX_COMPILER_VERSION "${CMAKE_MATCH_1}") |
||||
if (${CMAKE_C_COMPILER_VERSION} VERSION_LESS 3.9.0) |
||||
message(WARNING "CMAKE_C_COMPILER version looks too old. Was ${CMAKE_C_COMPILER_VERSION}, should be at least 3.9.0.") |
||||
endif() |
||||
endif() |
||||
|
||||
# Capture the Emscripten version to EMSCRIPTEN_VERSION variable. |
||||
if (NOT EMSCRIPTEN_VERSION) |
||||
execute_process(COMMAND "${CMAKE_C_COMPILER}" "-v" RESULT_VARIABLE _cmake_compiler_result ERROR_VARIABLE _cmake_compiler_output OUTPUT_QUIET) |
||||
if (NOT _cmake_compiler_result EQUAL 0) |
||||
message(FATAL_ERROR "Failed to fetch Emscripten version information with command \"'${CMAKE_C_COMPILER}' -v\"! Process returned with error code ${_cmake_compiler_result}.") |
||||
endif() |
||||
string(REGEX MATCH "emcc \\(.*\\) ([0-9\\.]+)" _dummy_unused "${_cmake_compiler_output}") |
||||
if (NOT CMAKE_MATCH_1) |
||||
message(FATAL_ERROR "Failed to regex parse Emscripten compiler version from version string: ${_cmake_compiler_output}") |
||||
endif() |
||||
|
||||
set(EMSCRIPTEN_VERSION "${CMAKE_MATCH_1}") |
||||
endif() |
||||
|
||||
set(CMAKE_C_COMPILER_ID_RUN TRUE) |
||||
set(CMAKE_C_COMPILER_FORCED TRUE) |
||||
set(CMAKE_C_COMPILER_WORKS TRUE) |
||||
set(CMAKE_C_COMPILER_ID Clang) |
||||
set(CMAKE_C_STANDARD_COMPUTED_DEFAULT 11) |
||||
|
||||
set(CMAKE_CXX_COMPILER_ID_RUN TRUE) |
||||
set(CMAKE_CXX_COMPILER_FORCED TRUE) |
||||
set(CMAKE_CXX_COMPILER_WORKS TRUE) |
||||
set(CMAKE_CXX_COMPILER_ID Clang) |
||||
set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT 98) |
||||
|
||||
set(CMAKE_C_PLATFORM_ID "emscripten") |
||||
set(CMAKE_CXX_PLATFORM_ID "emscripten") |
||||
|
||||
if ("${CMAKE_VERSION}" VERSION_LESS "3.8") |
||||
set(CMAKE_C_COMPILE_FEATURES "c_function_prototypes;c_restrict;c_variadic_macros;c_static_assert") |
||||
set(CMAKE_C90_COMPILE_FEATURES "c_function_prototypes") |
||||
set(CMAKE_C99_COMPILE_FEATURES "c_restrict;c_variadic_macros") |
||||
set(CMAKE_C11_COMPILE_FEATURES "c_static_assert") |
||||
|
||||
set(CMAKE_CXX_COMPILE_FEATURES "cxx_template_template_parameters;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") |
||||
set(CMAKE_CXX98_COMPILE_FEATURES "cxx_template_template_parameters") |
||||
set(CMAKE_CXX11_COMPILE_FEATURES "cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") |
||||
set(CMAKE_CXX14_COMPILE_FEATURES "cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") |
||||
else() |
||||
set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert") |
||||
set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes") |
||||
set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros") |
||||
set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert") |
||||
|
||||
set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17") |
||||
set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters") |
||||
set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") |
||||
set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") |
||||
endif() |
||||
endif() |
||||
|
||||
# To find programs to execute during CMake run time with find_program(), e.g. 'git' or so, we allow looking |
||||
# into system paths. |
||||
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) |
||||
|
||||
# Since Emscripten is a cross-compiler, we should never look at the system-provided directories like /usr/include and so on. |
||||
# Therefore only CMAKE_FIND_ROOT_PATH should be used as a find directory. See http://www.cmake.org/cmake/help/v3.0/variable/CMAKE_FIND_ROOT_PATH_MODE_INCLUDE.html |
||||
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) |
||||
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) |
||||
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) |
||||
|
||||
set(CMAKE_SYSTEM_INCLUDE_PATH "${EMSCRIPTEN_ROOT_PATH}/system/include") |
||||
|
||||
# We would prefer to specify a standard set of Clang+Emscripten-friendly common convention for suffix files, especially for CMake executable files, |
||||
# but if these are adjusted, ${CMAKE_ROOT}/Modules/CheckIncludeFile.cmake will fail, since it depends on being able to compile output files with predefined names. |
||||
#SET(CMAKE_LINK_LIBRARY_SUFFIX "") |
||||
#SET(CMAKE_STATIC_LIBRARY_PREFIX "") |
||||
#SET(CMAKE_SHARED_LIBRARY_PREFIX "") |
||||
#SET(CMAKE_FIND_LIBRARY_PREFIXES "") |
||||
#SET(CMAKE_FIND_LIBRARY_SUFFIXES ".bc") |
||||
#SET(CMAKE_SHARED_LIBRARY_SUFFIX ".bc") |
||||
|
||||
option(EMSCRIPTEN_GENERATE_BITCODE_STATIC_LIBRARIES "If set, static library targets generate LLVM bitcode files (.bc). If disabled (default), UNIX ar archives (.a) are generated." OFF) |
||||
if (EMSCRIPTEN_GENERATE_BITCODE_STATIC_LIBRARIES) |
||||
SET(CMAKE_STATIC_LIBRARY_SUFFIX ".bc") |
||||
|
||||
SET(CMAKE_C_CREATE_STATIC_LIBRARY "<CMAKE_C_COMPILER> -o <TARGET> <LINK_FLAGS> <OBJECTS>") |
||||
SET(CMAKE_CXX_CREATE_STATIC_LIBRARY "<CMAKE_CXX_COMPILER> -o <TARGET> <LINK_FLAGS> <OBJECTS>") |
||||
else() |
||||
# Specify the program to use when building static libraries. Force Emscripten-related command line options to clang. |
||||
SET(CMAKE_C_CREATE_STATIC_LIBRARY "<CMAKE_AR> rc <TARGET> <LINK_FLAGS> <OBJECTS>") |
||||
SET(CMAKE_CXX_CREATE_STATIC_LIBRARY "<CMAKE_AR> rc <TARGET> <LINK_FLAGS> <OBJECTS>") |
||||
endif() |
||||
|
||||
SET(CMAKE_EXECUTABLE_SUFFIX ".js") |
||||
|
||||
SET(CMAKE_C_USE_RESPONSE_FILE_FOR_LIBRARIES 1) |
||||
SET(CMAKE_CXX_USE_RESPONSE_FILE_FOR_LIBRARIES 1) |
||||
SET(CMAKE_C_USE_RESPONSE_FILE_FOR_OBJECTS 1) |
||||
SET(CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS 1) |
||||
SET(CMAKE_C_USE_RESPONSE_FILE_FOR_INCLUDES 1) |
||||
SET(CMAKE_CXX_USE_RESPONSE_FILE_FOR_INCLUDES 1) |
||||
|
||||
set(CMAKE_C_RESPONSE_FILE_LINK_FLAG "@") |
||||
set(CMAKE_CXX_RESPONSE_FILE_LINK_FLAG "@") |
||||
|
||||
# Set a global EMSCRIPTEN variable that can be used in client CMakeLists.txt to detect when building using Emscripten. |
||||
set(EMSCRIPTEN 1 CACHE BOOL "If true, we are targeting Emscripten output.") |
||||
|
||||
# Hardwire support for cmake-2.8/Modules/CMakeBackwardsCompatibilityC.cmake without having CMake to try complex things |
||||
# to autodetect these: |
||||
set(CMAKE_SKIP_COMPATIBILITY_TESTS 1) |
||||
set(CMAKE_SIZEOF_CHAR 1) |
||||
set(CMAKE_SIZEOF_UNSIGNED_SHORT 2) |
||||
set(CMAKE_SIZEOF_SHORT 2) |
||||
set(CMAKE_SIZEOF_INT 4) |
||||
set(CMAKE_SIZEOF_UNSIGNED_LONG 4) |
||||
set(CMAKE_SIZEOF_UNSIGNED_INT 4) |
||||
set(CMAKE_SIZEOF_LONG 4) |
||||
set(CMAKE_SIZEOF_VOID_P 4) |
||||
set(CMAKE_SIZEOF_FLOAT 4) |
||||
set(CMAKE_SIZEOF_DOUBLE 8) |
||||
set(CMAKE_C_SIZEOF_DATA_PTR 4) |
||||
set(CMAKE_CXX_SIZEOF_DATA_PTR 4) |
||||
set(CMAKE_HAVE_LIMITS_H 1) |
||||
set(CMAKE_HAVE_UNISTD_H 1) |
||||
set(CMAKE_HAVE_PTHREAD_H 1) |
||||
set(CMAKE_HAVE_SYS_PRCTL_H 1) |
||||
set(CMAKE_WORDS_BIGENDIAN 0) |
||||
set(CMAKE_DL_LIBS) |
||||
|
||||
set(CMAKE_C_FLAGS_RELEASE "-DNDEBUG -O2" CACHE STRING "Emscripten-overridden CMAKE_C_FLAGS_RELEASE") |
||||
set(CMAKE_C_FLAGS_MINSIZEREL "-DNDEBUG -Os" CACHE STRING "Emscripten-overridden CMAKE_C_FLAGS_MINSIZEREL") |
||||
set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2" CACHE STRING "Emscripten-overridden CMAKE_C_FLAGS_RELWITHDEBINFO") |
||||
set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG -O2" CACHE STRING "Emscripten-overridden CMAKE_CXX_FLAGS_RELEASE") |
||||
set(CMAKE_CXX_FLAGS_MINSIZEREL "-DNDEBUG -Os" CACHE STRING "Emscripten-overridden CMAKE_CXX_FLAGS_MINSIZEREL") |
||||
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2" CACHE STRING "Emscripten-overridden CMAKE_CXX_FLAGS_RELWITHDEBINFO") |
||||
|
||||
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "-O2" CACHE STRING "Emscripten-overridden CMAKE_EXE_LINKER_FLAGS_RELEASE") |
||||
set(CMAKE_EXE_LINKER_FLAGS_MINSIZEREL "-Os" CACHE STRING "Emscripten-overridden CMAKE_EXE_LINKER_FLAGS_MINSIZEREL") |
||||
set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "-O2 -g" CACHE STRING "Emscripten-overridden CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO") |
||||
set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "-O2" CACHE STRING "Emscripten-overridden CMAKE_SHARED_LINKER_FLAGS_RELEASE") |
||||
set(CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL "-Os" CACHE STRING "Emscripten-overridden CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL") |
||||
set(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "-O2 -g" CACHE STRING "Emscripten-overridden CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO") |
||||
set(CMAKE_MODULE_LINKER_FLAGS_RELEASE "-O2" CACHE STRING "Emscripten-overridden CMAKE_MODULE_LINKER_FLAGS_RELEASE") |
||||
set(CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL "-Os" CACHE STRING "Emscripten-overridden CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL") |
||||
set(CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO "-O2 -g" CACHE STRING "Emscripten-overridden CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO") |
||||
|
||||
function(em_validate_asmjs_after_build target) |
||||
add_custom_command(TARGET ${target} POST_BUILD COMMAND ${CMAKE_COMMAND} -E echo Validating build output for asm.js... COMMAND "python" ARGS "${EMSCRIPTEN_ROOT_PATH}/tools/validate_asmjs.py" "$<TARGET_FILE:${target}>") |
||||
endfunction() |
||||
|
||||
# A global counter to guarantee unique names for js library files. |
||||
set(link_js_counter 1) |
||||
|
||||
# Internal function: Do not call from user CMakeLists.txt files. Use one of em_link_js_library()/em_link_pre_js()/em_link_post_js() instead. |
||||
function(em_add_tracked_link_flag target flagname) |
||||
|
||||
# User can input list of JS files either as a single list, or as variable arguments to this function, so iterate over varargs, and treat each |
||||
# item in varargs as a list itself, to support both syntax forms. |
||||
foreach(jsFileList ${ARGN}) |
||||
foreach(jsfile ${jsFileList}) |
||||
# If the user edits the JS file, we want to relink the emscripten application, but unfortunately it is not possible to make a link step |
||||
# depend directly on a source file. Instead, we must make a dummy no-op build target on that source file, and make the project depend on |
||||
# that target. |
||||
|
||||
# Sanitate the source .js filename to a good symbol name to use as a dummy filename. |
||||
get_filename_component(jsname "${jsfile}" NAME) |
||||
string(REGEX REPLACE "[/:\\\\.\ ]" "_" dummy_js_target ${jsname}) |
||||
set(dummy_lib_name ${target}_${link_js_counter}_${dummy_js_target}) |
||||
set(dummy_c_name "${CMAKE_BINARY_DIR}/${dummy_js_target}_tracker.c") |
||||
|
||||
# Create a new static library target that with a single dummy .c file. |
||||
add_library(${dummy_lib_name} STATIC ${dummy_c_name}) |
||||
# Make the dummy .c file depend on the .js file we are linking, so that if the .js file is edited, the dummy .c file, and hence the static library will be rebuild (no-op). This causes the main application to be relinked, which is what we want. |
||||
# This approach was recommended by http://www.cmake.org/pipermail/cmake/2010-May/037206.html |
||||
add_custom_command(OUTPUT ${dummy_c_name} COMMAND ${CMAKE_COMMAND} -E touch ${dummy_c_name} DEPENDS ${jsfile}) |
||||
target_link_libraries(${target} ${dummy_lib_name}) |
||||
|
||||
# Link the js-library to the target |
||||
# When a linked library starts with a "-" cmake will just add it to the linker command line as it is. |
||||
# The advantage of doing it this way is that the js-library will also be automatically linked to targets |
||||
# that depend on this target. |
||||
get_filename_component(js_file_absolute_path "${jsfile}" ABSOLUTE ) |
||||
target_link_libraries(${target} "${flagname} \"${js_file_absolute_path}\"") |
||||
|
||||
math(EXPR link_js_counter "${link_js_counter} + 1") |
||||
endforeach() |
||||
endforeach() |
||||
endfunction() |
||||
|
||||
# This function links a (list of ) .js library file(s) to the given CMake project. |
||||
# Example: em_link_js_library(my_executable "lib1.js" "lib2.js") |
||||
# will result in emcc passing --js-library lib1.js --js-library lib2.js to the emscripten linker, as well as |
||||
# tracking the modification timestamp between the linked .js files and the main project, so that editing the .js file |
||||
# will cause the target project to be relinked. |
||||
function(em_link_js_library target) |
||||
em_add_tracked_link_flag(${target} "--js-library" ${ARGN}) |
||||
endfunction() |
||||
|
||||
# This function is identical to em_link_js_library(), except the .js files will be added with '--pre-js file.js' command line flag, |
||||
# which is generally used to add some preamble .js code to a generated output file. |
||||
function(em_link_pre_js target) |
||||
em_add_tracked_link_flag(${target} "--pre-js" ${ARGN}) |
||||
endfunction() |
||||
|
||||
# This function is identical to em_link_js_library(), except the .js files will be added with '--post-js file.js' command line flag, |
||||
# which is generally used to add some postamble .js code to a generated output file. |
||||
function(em_link_post_js target) |
||||
em_add_tracked_link_flag(${target} "--post-js" ${ARGN}) |
||||
endfunction() |
||||
|
||||
# Experimental support for targeting generation of Visual Studio project files (vs-tool) of Emscripten projects for Windows. |
||||
# To use this, pass the combination -G "Visual Studio 10" -DCMAKE_TOOLCHAIN_FILE=Emscripten.cmake |
||||
if ("${CMAKE_GENERATOR}" MATCHES "^Visual Studio.*") |
||||
# By default, CMake generates VS project files with a <GenerateManifest>true</GenerateManifest> directive. |
||||
# This causes VS to attempt to invoke rc.exe during the build, which will fail since app manifests are meaningless for Emscripten. |
||||
# To disable this, add the following linker flag. This flag will not go to emcc, since the Visual Studio CMake generator will swallow it. |
||||
set(EMSCRIPTEN_VS_LINKER_FLAGS "/MANIFEST:NO") |
||||
# CMake is hardcoded to write a ClCompile directive <ObjectFileName>$(IntDir)</ObjectFileName> in all VS project files it generates. |
||||
# This makes VS pass emcc a -o param that points to a directory instead of a file, which causes emcc autogenerate the output filename. |
||||
# CMake is hardcoded to assume all object files have the suffix .obj, so adjust the emcc-autogenerated default suffix name to match. |
||||
set(EMSCRIPTEN_VS_LINKER_FLAGS "${EMSCRIPTEN_VS_LINKER_FLAGS} --default-obj-ext .obj") |
||||
# Also hint CMake that it should not hardcode <ObjectFileName> generation. Requires a custom CMake build for this to work (ignored on others) |
||||
# See http://www.cmake.org/Bug/view.php?id=14673 and https://github.com/juj/CMake |
||||
set(CMAKE_VS_NO_DEFAULT_OBJECTFILENAME 1) |
||||
|
||||
# Apply and cache Emscripten Visual Studio IDE-specific linker flags. |
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${EMSCRIPTEN_VS_LINKER_FLAGS}" CACHE STRING "") |
||||
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${EMSCRIPTEN_VS_LINKER_FLAGS}" CACHE STRING "") |
||||
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${EMSCRIPTEN_VS_LINKER_FLAGS}" CACHE STRING "") |
||||
endif() |
||||
|
||||
if (NOT DEFINED CMAKE_CROSSCOMPILING_EMULATOR) |
||||
find_program(NODE_JS_EXECUTABLE NAMES nodejs node) |
||||
if(NODE_JS_EXECUTABLE) |
||||
set(CMAKE_CROSSCOMPILING_EMULATOR "${NODE_JS_EXECUTABLE}" CACHE FILEPATH "Path to the emulator for the target system.") |
||||
endif() |
||||
endif() |
||||
# No-op on CMAKE_CROSSCOMPILING_EMULATOR so older versions of cmake do not |
||||
# complain about unused CMake variable. |
||||
if(CMAKE_CROSSCOMPILING_EMULATOR) |
||||
endif() |
@ -0,0 +1,200 @@
|
||||
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying |
||||
# file Copyright.txt or https://cmake.org/licensing for details. |
||||
|
||||
#.rst: |
||||
# FindSDL2 |
||||
# ------- |
||||
# |
||||
# Locate SDL2 library |
||||
# |
||||
# This module defines |
||||
# |
||||
# :: |
||||
# |
||||
# SDL2_LIBRARY, the name of the library to link against |
||||
# SDL2_FOUND, if false, do not try to link to SDL |
||||
# SDL2_INCLUDE_DIR, where to find SDL.h |
||||
# SDL2_VERSION_STRING, human-readable string containing the version of SDL |
||||
# |
||||
# |
||||
# |
||||
# This module responds to the flag: |
||||
# |
||||
# :: |
||||
# |
||||
# SDL2_BUILDING_LIBRARY |
||||
# If this is defined, then no SDL2_main will be linked in because |
||||
# only applications need main(). |
||||
# Otherwise, it is assumed you are building an application and this |
||||
# module will attempt to locate and set the proper link flags |
||||
# as part of the returned SDL2_LIBRARY variable. |
||||
# |
||||
# |
||||
# |
||||
# Don't forget to include SDLmain.h and SDLmain.m your project for the |
||||
# OS X framework based version. (Other versions link to -lSDLmain which |
||||
# this module will try to find on your behalf.) Also for OS X, this |
||||
# module will automatically add the -framework Cocoa on your behalf. |
||||
# |
||||
# |
||||
# |
||||
# Additional Note: If you see an empty SDL2_LIBRARY_TEMP in your |
||||
# configuration and no SDL2_LIBRARY, it means CMake did not find your SDL |
||||
# library (SDL.dll, libsdl.so, SDL.framework, etc). Set |
||||
# SDL2_LIBRARY_TEMP to point to your SDL library, and configure again. |
||||
# Similarly, if you see an empty SDLMAIN_LIBRARY, you should set this |
||||
# value as appropriate. These values are used to generate the final |
||||
# SDL2_LIBRARY variable, but when these values are unset, SDL2_LIBRARY |
||||
# does not get created. |
||||
# |
||||
# |
||||
# |
||||
# $SDL2DIR is an environment variable that would correspond to the |
||||
# ./configure --prefix=$SDL2DIR used in building SDL. l.e.galup 9-20-02 |
||||
# |
||||
# Modified by Eric Wing. Added code to assist with automated building |
||||
# by using environmental variables and providing a more |
||||
# controlled/consistent search behavior. Added new modifications to |
||||
# recognize OS X frameworks and additional Unix paths (FreeBSD, etc). |
||||
# Also corrected the header search path to follow "proper" SDL |
||||
# guidelines. Added a search for SDLmain which is needed by some |
||||
# platforms. Added a search for threads which is needed by some |
||||
# platforms. Added needed compile switches for MinGW. |
||||
# |
||||
# On OSX, this will prefer the Framework version (if found) over others. |
||||
# People will have to manually change the cache values of SDL2_LIBRARY to |
||||
# override this selection or set the CMake environment |
||||
# CMAKE_INCLUDE_PATH to modify the search paths. |
||||
# |
||||
# Note that the header path has changed from SDL/SDL.h to just SDL.h |
||||
# This needed to change because "proper" SDL convention is #include |
||||
# "SDL.h", not <SDL/SDL.h>. This is done for portability reasons |
||||
# because not all systems place things in SDL/ (see FreeBSD). |
||||
|
||||
if(NOT SDL2_DIR) |
||||
set(SDL2_DIR "" CACHE PATH "SDL2 directory") |
||||
endif() |
||||
|
||||
find_path(SDL2_INCLUDE_DIR SDL.h |
||||
HINTS |
||||
ENV SDL2DIR |
||||
${SDL2_DIR} |
||||
PATH_SUFFIXES SDL2 |
||||
# path suffixes to search inside ENV{SDL2DIR} |
||||
include/SDL2 include |
||||
) |
||||
|
||||
if(CMAKE_SIZEOF_VOID_P EQUAL 8) |
||||
set(VC_LIB_PATH_SUFFIX lib/x64) |
||||
else() |
||||
set(VC_LIB_PATH_SUFFIX lib/x86) |
||||
endif() |
||||
|
||||
find_library(SDL2_LIBRARY_TEMP |
||||
NAMES SDL2 |
||||
HINTS |
||||
ENV SDL2DIR |
||||
${SDL2_DIR} |
||||
PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX} |
||||
) |
||||
|
||||
# Hide this cache variable from the user, it's an internal implementation |
||||
# detail. The documented library variable for the user is SDL2_LIBRARY |
||||
# which is derived from SDL2_LIBRARY_TEMP further below. |
||||
set_property(CACHE SDL2_LIBRARY_TEMP PROPERTY TYPE INTERNAL) |
||||
|
||||
if(NOT SDL2_BUILDING_LIBRARY) |
||||
if(NOT SDL2_INCLUDE_DIR MATCHES ".framework") |
||||
# Non-OS X framework versions expect you to also dynamically link to |
||||
# SDLmain. This is mainly for Windows and OS X. Other (Unix) platforms |
||||
# seem to provide SDLmain for compatibility even though they don't |
||||
# necessarily need it. |
||||
find_library(SDL2MAIN_LIBRARY |
||||
NAMES SDL2main |
||||
HINTS |
||||
ENV SDL2DIR |
||||
${SDL2_DIR} |
||||
PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX} |
||||
PATHS |
||||
/sw |
||||
/opt/local |
||||
/opt/csw |
||||
/opt |
||||
) |
||||
endif() |
||||
endif() |
||||
|
||||
# SDL may require threads on your system. |
||||
# The Apple build may not need an explicit flag because one of the |
||||
# frameworks may already provide it. |
||||
# But for non-OSX systems, I will use the CMake Threads package. |
||||
if(NOT APPLE) |
||||
find_package(Threads) |
||||
endif() |
||||
|
||||
# MinGW needs an additional link flag, -mwindows |
||||
# It's total link flags should look like -lmingw32 -lSDLmain -lSDL -mwindows |
||||
if(MINGW) |
||||
set(MINGW32_LIBRARY mingw32 "-mwindows" CACHE STRING "link flags for MinGW") |
||||
endif() |
||||
|
||||
if(SDL2_LIBRARY_TEMP) |
||||
# For SDLmain |
||||
if(SDL2MAIN_LIBRARY AND NOT SDL2_BUILDING_LIBRARY) |
||||
list(FIND SDL2_LIBRARY_TEMP "${SDLMAIN_LIBRARY}" _SDL2_MAIN_INDEX) |
||||
if(_SDL2_MAIN_INDEX EQUAL -1) |
||||
set(SDL2_LIBRARY_TEMP "${SDLMAIN_LIBRARY}" ${SDL2_LIBRARY_TEMP}) |
||||
endif() |
||||
unset(_SDL2_MAIN_INDEX) |
||||
endif() |
||||
|
||||
# For OS X, SDL uses Cocoa as a backend so it must link to Cocoa. |
||||
# CMake doesn't display the -framework Cocoa string in the UI even |
||||
# though it actually is there if I modify a pre-used variable. |
||||
# I think it has something to do with the CACHE STRING. |
||||
# So I use a temporary variable until the end so I can set the |
||||
# "real" variable in one-shot. |
||||
if(APPLE) |
||||
set(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} "-framework Cocoa") |
||||
endif() |
||||
|
||||
# For threads, as mentioned Apple doesn't need this. |
||||
# In fact, there seems to be a problem if I used the Threads package |
||||
# and try using this line, so I'm just skipping it entirely for OS X. |
||||
if(NOT APPLE) |
||||
set(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} ${CMAKE_THREAD_LIBS_INIT}) |
||||
endif() |
||||
|
||||
# For MinGW library |
||||
if(MINGW) |
||||
set(SDL2_LIBRARY_TEMP ${MINGW32_LIBRARY} ${SDL2_LIBRARY_TEMP}) |
||||
endif() |
||||
|
||||
# Set the final string here so the GUI reflects the final state. |
||||
set(SDL2_LIBRARY ${SDL2_LIBRARY_TEMP} CACHE STRING "Where the SDL Library can be found") |
||||
endif() |
||||
|
||||
if(SDL2_INCLUDE_DIR AND EXISTS "${SDL2_INCLUDE_DIR}/SDL2_version.h") |
||||
file(STRINGS "${SDL2_INCLUDE_DIR}/SDL2_version.h" SDL2_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL2_MAJOR_VERSION[ \t]+[0-9]+$") |
||||
file(STRINGS "${SDL2_INCLUDE_DIR}/SDL2_version.h" SDL2_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL2_MINOR_VERSION[ \t]+[0-9]+$") |
||||
file(STRINGS "${SDL2_INCLUDE_DIR}/SDL2_version.h" SDL2_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL2_PATCHLEVEL[ \t]+[0-9]+$") |
||||
string(REGEX REPLACE "^#define[ \t]+SDL2_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_MAJOR "${SDL2_VERSION_MAJOR_LINE}") |
||||
string(REGEX REPLACE "^#define[ \t]+SDL2_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_MINOR "${SDL2_VERSION_MINOR_LINE}") |
||||
string(REGEX REPLACE "^#define[ \t]+SDL2_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_PATCH "${SDL2_VERSION_PATCH_LINE}") |
||||
set(SDL2_VERSION_STRING ${SDL2_VERSION_MAJOR}.${SDL2_VERSION_MINOR}.${SDL2_VERSION_PATCH}) |
||||
unset(SDL2_VERSION_MAJOR_LINE) |
||||
unset(SDL2_VERSION_MINOR_LINE) |
||||
unset(SDL2_VERSION_PATCH_LINE) |
||||
unset(SDL2_VERSION_MAJOR) |
||||
unset(SDL2_VERSION_MINOR) |
||||
unset(SDL2_VERSION_PATCH) |
||||
endif() |
||||
|
||||
set(SDL2_LIBRARIES ${SDL2_LIBRARY} ${SDL2MAIN_LIBRARY}) |
||||
set(SDL2_INCLUDE_DIRS ${SDL2_INCLUDE_DIR}) |
||||
|
||||
include(FindPackageHandleStandardArgs) |
||||
|
||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2 |
||||
REQUIRED_VARS SDL2_LIBRARY SDL2_INCLUDE_DIR |
||||
VERSION_VAR SDL2_VERSION_STRING) |
@ -0,0 +1,102 @@
|
||||
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying |
||||
# file Copyright.txt or https://cmake.org/licensing for details. |
||||
|
||||
#.rst: |
||||
# FindSDL2_image |
||||
# ------------- |
||||
# |
||||
# Locate SDL2_image library |
||||
# |
||||
# This module defines: |
||||
# |
||||
# :: |
||||
# |
||||
# SDL2_IMAGE_LIBRARIES, the name of the library to link against |
||||
# SDL2_IMAGE_INCLUDE_DIRS, where to find the headers |
||||
# SDL2_IMAGE_FOUND, if false, do not try to link against |
||||
# SDL2_IMAGE_VERSION_STRING - human-readable string containing the |
||||
# version of SDL2_image |
||||
# |
||||
# |
||||
# |
||||
# For backward compatibility the following variables are also set: |
||||
# |
||||
# :: |
||||
# |
||||
# SDL2IMAGE_LIBRARY (same value as SDL2_IMAGE_LIBRARIES) |
||||
# SDL2IMAGE_INCLUDE_DIR (same value as SDL2_IMAGE_INCLUDE_DIRS) |
||||
# SDL2IMAGE_FOUND (same value as SDL2_IMAGE_FOUND) |
||||
# |
||||
# |
||||
# |
||||
# $SDLDIR is an environment variable that would correspond to the |
||||
# ./configure --prefix=$SDLDIR used in building SDL. |
||||
# |
||||
# Created by Eric Wing. This was influenced by the FindSDL.cmake |
||||
# module, but with modifications to recognize OS X frameworks and |
||||
# additional Unix paths (FreeBSD, etc). |
||||
|
||||
if(NOT SDL2_IMAGE_INCLUDE_DIR AND SDL2IMAGE_INCLUDE_DIR) |
||||
set(SDL2_IMAGE_INCLUDE_DIR ${SDL2IMAGE_INCLUDE_DIR} CACHE PATH "directory cache |
||||
entry initialized from old variable name") |
||||
endif() |
||||
find_path(SDL2_IMAGE_INCLUDE_DIR SDL_image.h |
||||
HINTS |
||||
ENV SDL2IMAGEDIR |
||||
ENV SDL2DIR |
||||
${SDL2_DIR} |
||||
PATH_SUFFIXES SDL2 |
||||
# path suffixes to search inside ENV{SDL2DIR} |
||||
include/SDL2 include |
||||
) |
||||
|
||||
if(CMAKE_SIZEOF_VOID_P EQUAL 8) |
||||
set(VC_LIB_PATH_SUFFIX lib/x64) |
||||
else() |
||||
set(VC_LIB_PATH_SUFFIX lib/x86) |
||||
endif() |
||||
|
||||
if(NOT SDL2_IMAGE_LIBRARY AND SDL2IMAGE_LIBRARY) |
||||
set(SDL2_IMAGE_LIBRARY ${SDL2IMAGE_LIBRARY} CACHE FILEPATH "file cache entry |
||||
initialized from old variable name") |
||||
endif() |
||||
find_library(SDL2_IMAGE_LIBRARY |
||||
NAMES SDL2_image |
||||
HINTS |
||||
ENV SDL2IMAGEDIR |
||||
ENV SDL2DIR |
||||
${SDL2_DIR} |
||||
PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX} |
||||
) |
||||
|
||||
if(SDL2_IMAGE_INCLUDE_DIR AND EXISTS "${SDL2_IMAGE_INCLUDE_DIR}/SDL2_image.h") |
||||
file(STRINGS "${SDL2_IMAGE_INCLUDE_DIR}/SDL2_image.h" SDL2_IMAGE_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL2_IMAGE_MAJOR_VERSION[ \t]+[0-9]+$") |
||||
file(STRINGS "${SDL2_IMAGE_INCLUDE_DIR}/SDL2_image.h" SDL2_IMAGE_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL2_IMAGE_MINOR_VERSION[ \t]+[0-9]+$") |
||||
file(STRINGS "${SDL2_IMAGE_INCLUDE_DIR}/SDL2_image.h" SDL2_IMAGE_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL2_IMAGE_PATCHLEVEL[ \t]+[0-9]+$") |
||||
string(REGEX REPLACE "^#define[ \t]+SDL2_IMAGE_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_IMAGE_VERSION_MAJOR "${SDL2_IMAGE_VERSION_MAJOR_LINE}") |
||||
string(REGEX REPLACE "^#define[ \t]+SDL2_IMAGE_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_IMAGE_VERSION_MINOR "${SDL2_IMAGE_VERSION_MINOR_LINE}") |
||||
string(REGEX REPLACE "^#define[ \t]+SDL2_IMAGE_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_IMAGE_VERSION_PATCH "${SDL2_IMAGE_VERSION_PATCH_LINE}") |
||||
set(SDL2_IMAGE_VERSION_STRING ${SDL2_IMAGE_VERSION_MAJOR}.${SDL2_IMAGE_VERSION_MINOR}.${SDL2_IMAGE_VERSION_PATCH}) |
||||
unset(SDL2_IMAGE_VERSION_MAJOR_LINE) |
||||
unset(SDL2_IMAGE_VERSION_MINOR_LINE) |
||||
unset(SDL2_IMAGE_VERSION_PATCH_LINE) |
||||
unset(SDL2_IMAGE_VERSION_MAJOR) |
||||
unset(SDL2_IMAGE_VERSION_MINOR) |
||||
unset(SDL2_IMAGE_VERSION_PATCH) |
||||
endif() |
||||
|
||||
set(SDL2_IMAGE_LIBRARIES ${SDL2_IMAGE_LIBRARY}) |
||||
set(SDL2_IMAGE_INCLUDE_DIRS ${SDL2_IMAGE_INCLUDE_DIR}) |
||||
|
||||
include(FindPackageHandleStandardArgs) |
||||
|
||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2_image |
||||
REQUIRED_VARS SDL2_IMAGE_LIBRARIES SDL2_IMAGE_INCLUDE_DIRS |
||||
VERSION_VAR SDL2_IMAGE_VERSION_STRING) |
||||
|
||||
# for backward compatibility |
||||
set(SDL2IMAGE_LIBRARY ${SDL2_IMAGE_LIBRARIES}) |
||||
set(SDL2IMAGE_INCLUDE_DIR ${SDL2_IMAGE_INCLUDE_DIRS}) |
||||
set(SDL2IMAGE_FOUND ${SDL2_IMAGE_FOUND}) |
||||
|
||||
mark_as_advanced(SDL2_IMAGE_LIBRARY SDL2_IMAGE_INCLUDE_DIR) |
@ -0,0 +1,175 @@
|
||||
#ifdef EEZ_PLATFORM_STM32 |
||||
#include "main.h" |
||||
//#include "rtc.h"
|
||||
#endif |
||||
|
||||
#if defined(EEZ_PLATFORM_SIMULATOR) |
||||
#include <stdio.h> |
||||
#include <time.h> |
||||
#endif |
||||
|
||||
#include "date_time.h" |
||||
|
||||
namespace date_time { |
||||
|
||||
// leap year calulator expects year argument as years offset from 1970
|
||||
#define LEAP_YEAR(Y) \ |
||||
(((1970 + Y) > 0) && !((1970 + Y) % 4) && (((1970 + Y) % 100) || !((1970 + Y) % 400))) |
||||
|
||||
#define SECONDS_PER_MINUTE 60UL |
||||
#define SECONDS_PER_HOUR (SECONDS_PER_MINUTE * 60) |
||||
#define SECONDS_PER_DAY (SECONDS_PER_HOUR * 24) |
||||
|
||||
// API starts months from 1, this array starts from 0
|
||||
static const uint8_t monthDays[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; |
||||
|
||||
#if defined(EEZ_PLATFORM_SIMULATOR) |
||||
static uint32_t g_offset; |
||||
#endif |
||||
|
||||
DateTime g_dateTime; |
||||
|
||||
uint32_t makeTime(int year, int month, int day, int hour, int minute, int second) { |
||||
// seconds from 1970 till 1 jan 00:00:00 of the given year
|
||||
year -= 1970; |
||||
|
||||
uint32_t seconds = year * 365 * SECONDS_PER_DAY; |
||||
|
||||
for (int i = 0; i < year; i++) { |
||||
if (LEAP_YEAR(i)) { |
||||
seconds += SECONDS_PER_DAY; // add extra days for leap years
|
||||
} |
||||
} |
||||
|
||||
// add days for this year, months start from 1
|
||||
for (int i = 1; i < month; i++) { |
||||
if ((i == 2) && LEAP_YEAR(year)) { |
||||
seconds += SECONDS_PER_DAY * 29; |
||||
} |
||||
else { |
||||
seconds += SECONDS_PER_DAY * monthDays[i - 1]; // monthDay array starts from 0
|
||||
} |
||||
} |
||||
seconds += (day - 1) * SECONDS_PER_DAY; |
||||
seconds += hour * SECONDS_PER_HOUR; |
||||
seconds += minute * SECONDS_PER_MINUTE; |
||||
seconds += second; |
||||
|
||||
return seconds; |
||||
} |
||||
|
||||
void breakTime(uint32_t time, int &resultYear, int &resultMonth, int &resultDay, int &resultHour, |
||||
int &resultMinute, int &resultSecond) { |
||||
// break the given time_t into time components
|
||||
uint8_t year; |
||||
uint8_t month, monthLength; |
||||
uint32_t days; |
||||
|
||||
resultSecond = time % 60; |
||||
time /= 60; // now it is minutes
|
||||
|
||||
resultMinute = time % 60; |
||||
time /= 60; // now it is hours
|
||||
|
||||
resultHour = time % 24; |
||||
time /= 24; // now it is days
|
||||
|
||||
year = 0; |
||||
days = 0; |
||||
while ((unsigned)(days += (LEAP_YEAR(year) ? 366 : 365)) <= time) { |
||||
year++; |
||||
} |
||||
resultYear = year + 1970; // year is offset from 1970
|
||||
|
||||
days -= LEAP_YEAR(year) ? 366 : 365; |
||||
time -= days; // now it is days in this year, starting at 0
|
||||
|
||||
days = 0; |
||||
month = 0; |
||||
monthLength = 0; |
||||
for (month = 0; month < 12; ++month) { |
||||
if (month == 1) { // february
|
||||
if (LEAP_YEAR(year)) { |
||||
monthLength = 29; |
||||
} |
||||
else { |
||||
monthLength = 28; |
||||
} |
||||
} |
||||
else { |
||||
monthLength = monthDays[month]; |
||||
} |
||||
|
||||
if (time >= monthLength) { |
||||
time -= monthLength; |
||||
} |
||||
else { |
||||
break; |
||||
} |
||||
} |
||||
|
||||
resultMonth = month + 1; // jan is month 1
|
||||
resultDay = time + 1; // day of month
|
||||
} |
||||
|
||||
#if defined(EEZ_PLATFORM_SIMULATOR) |
||||
uint32_t nowUtc() { |
||||
time_t now_time_t = time(0); |
||||
struct tm *now_tm = gmtime(&now_time_t); |
||||
return makeTime(1900 + now_tm->tm_year, now_tm->tm_mon + 1, now_tm->tm_mday, |
||||
now_tm->tm_hour, now_tm->tm_min, now_tm->tm_sec); |
||||
} |
||||
#endif |
||||
|
||||
bool readTime(uint8_t &hour, uint8_t &minute, uint8_t &second, uint8_t &subSeconds) { |
||||
#if defined(EEZ_PLATFORM_STM32) |
||||
// RTC_TimeTypeDef time;
|
||||
// HAL_RTC_GetTime(&hrtc, &time, FORMAT_BIN);
|
||||
//
|
||||
// second = time.Seconds;
|
||||
// minute = time.Minutes;
|
||||
// hour = time.Hours;
|
||||
// subSeconds = time.SubSeconds;
|
||||
#endif |
||||
|
||||
#if defined(EEZ_PLATFORM_SIMULATOR) |
||||
int year_, month_, day_, hour_, minute_, second_; |
||||
breakTime(g_offset + nowUtc(), year_, month_, day_, hour_, minute_, second_); |
||||
|
||||
hour = uint8_t(hour_); |
||||
minute = uint8_t(minute_); |
||||
second = uint8_t(second_); |
||||
subSeconds = 0; |
||||
#endif |
||||
|
||||
return true; |
||||
} |
||||
|
||||
bool readDate(uint8_t &year, uint8_t &month, uint8_t &day) { |
||||
#if defined(EEZ_PLATFORM_STM32) |
||||
// RTC_DateTypeDef date;
|
||||
// HAL_RTC_GetDate(&hrtc, &date, FORMAT_BIN);
|
||||
//
|
||||
// day = date.Date;
|
||||
// month = date.Month;
|
||||
// year = date.Year;
|
||||
#endif |
||||
|
||||
#if defined(EEZ_PLATFORM_SIMULATOR) |
||||
int year_, month_, day_, hour_, minute_, second_; |
||||
breakTime(g_offset + nowUtc(), year_, month_, day_, hour_, minute_, second_); |
||||
|
||||
year = uint8_t(year_ - 2000); |
||||
month = uint8_t(month_); |
||||
day = uint8_t(day_); |
||||
#endif |
||||
|
||||
return true; |
||||
} |
||||
|
||||
void tick() { |
||||
readTime(g_dateTime.hour, g_dateTime.minute, g_dateTime.second, g_dateTime.subSecond); |
||||
readDate(g_dateTime.year, g_dateTime.month, g_dateTime.day); |
||||
} |
||||
|
||||
} // date_time
|
@ -0,0 +1,22 @@
|
||||
#pragma once |
||||
|
||||
#include <stdint.h> |
||||
|
||||
namespace date_time { |
||||
|
||||
struct DateTime { |
||||
uint8_t year; |
||||
uint8_t month; |
||||
uint8_t day; |
||||
|
||||
uint8_t hour; |
||||
uint8_t minute; |
||||
uint8_t second; |
||||
uint8_t subSecond; |
||||
}; |
||||
|
||||
extern DateTime g_dateTime; |
||||
|
||||
void tick(); |
||||
|
||||
} |
@ -0,0 +1,27 @@
|
||||
#include <eez/core/debug.h> |
||||
#include <eez/core/os.h> |
||||
#include "firmware.h" |
||||
|
||||
namespace eez { |
||||
namespace debug { |
||||
|
||||
void pushDebugTraceHook(const char *message, size_t messageLength) { |
||||
serialWrite("DEBUG: "); |
||||
osDelay(1); |
||||
serialWrite(message, messageLength); |
||||
} |
||||
|
||||
void pushInfoTraceHook(const char *message, size_t messageLength) { |
||||
serialWrite("INFO: "); |
||||
osDelay(1); |
||||
serialWrite(message, messageLength); |
||||
} |
||||
|
||||
void pushErrorTraceHook(const char *message, size_t messageLength) { |
||||
serialWrite("ERROR: "); |
||||
osDelay(1); |
||||
serialWrite(message, messageLength); |
||||
} |
||||
|
||||
} // namespace debug
|
||||
} // namespace eez
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,189 @@
|
||||
#include <math.h> |
||||
#include <stdio.h> |
||||
#include <string.h> |
||||
|
||||
#ifdef EEZ_PLATFORM_STM32 |
||||
|
||||
#include "main.h" |
||||
#include "tim.h" |
||||
#include "usbd_cdc_if.h" |
||||
#include "usart.h" |
||||
|
||||
#endif |
||||
|
||||
#include <eez/gui/gui.h> |
||||
|
||||
#include <eez/core/memory.h> |
||||
#include <eez/core/alloc.h> |
||||
#include <eez/core/debug.h> |
||||
#include <eez/core/os.h> |
||||
#include <eez/core/sound.h> |
||||
#include <eez/core/util.h> |
||||
|
||||
#include <eez/gui/touch.h> |
||||
#include <eez/gui/thread.h> |
||||
|
||||
#include <eez/flow/flow.h> |
||||
|
||||
#include "date_time.h" |
||||
#include "firmware.h" |
||||
#include "tasks.h" |
||||
#include "gui/hooks.h" |
||||
#include "flow/hooks.h" |
||||
|
||||
TouchScreenCalibrationParams g_touchScreenCalibrationParams; |
||||
|
||||
void LCD_init(); |
||||
|
||||
using namespace eez; |
||||
|
||||
#if defined(__EMSCRIPTEN__) |
||||
EM_PORT_API(void) init() { |
||||
#else |
||||
extern "C" void init() { |
||||
#endif |
||||
LCD_init(); |
||||
|
||||
eez::initAssetsMemory(); |
||||
eez::gui::loadMainAssets(eez::gui::assets, sizeof(eez::gui::assets)); |
||||
eez::initOtherMemory(); |
||||
eez::initAllocHeap(eez::ALLOC_BUFFER, eez::ALLOC_BUFFER_SIZE); |
||||
|
||||
eez::initHighPriorityMessageQueue(); |
||||
eez::startHighPriorityThread(); |
||||
|
||||
eez::initLowPriorityMessageQueue(); |
||||
eez::startLowPriorityThread(); |
||||
|
||||
flow::initHooks(); |
||||
|
||||
//gui::display::g_calcFpsEnabled = true;
|
||||
//gui::display::g_drawFpsGraphEnabled = true;
|
||||
|
||||
#if defined(__EMSCRIPTEN__) |
||||
gui::display::init(); |
||||
#endif |
||||
|
||||
gui::display::turnOn(); |
||||
gui::initHooks(); |
||||
gui::startThread(); |
||||
|
||||
DebugTrace("Firmware init. is done.\n"); |
||||
} |
||||
|
||||
#if defined(__EMSCRIPTEN__) |
||||
EM_PORT_API(void) startFlow() { |
||||
eez::flow::start(eez::gui::g_mainAssets); |
||||
} |
||||
|
||||
// clang-format off
|
||||
void mountFileSystem() { |
||||
EM_ASM( |
||||
FS.mkdir("/eez-flow-template-stm32f469i-disco"); |
||||
FS.mount(IDBFS, {}, "/eez-flow-template-stm32f469i-disco"); |
||||
|
||||
//Module.print("start file sync..");
|
||||
|
||||
//flag to check when data are synchronized
|
||||
Module.syncdone = 0; |
||||
|
||||
FS.syncfs(true, function(err) { |
||||
assert(!err); |
||||
//Module.print("end file sync..");
|
||||
Module.syncdone = 1; |
||||
}); |
||||
, 0); |
||||
} |
||||
// clang-format on
|
||||
|
||||
static int g_started = false; |
||||
extern void eez_system_tick(); |
||||
|
||||
EM_PORT_API(bool) mainLoop() { |
||||
if (!g_started) { |
||||
mountFileSystem(); |
||||
g_started = true; |
||||
} else { |
||||
if (emscripten_run_script_int("Module.syncdone") == 1) { |
||||
eez_system_tick(); |
||||
|
||||
if (eez::flow::isFlowStopped()) { |
||||
return false; |
||||
} |
||||
|
||||
// clang-format off
|
||||
EM_ASM( |
||||
if (Module.syncdone) { |
||||
//Module.print("Start File sync..");
|
||||
Module.syncdone = 0; |
||||
|
||||
FS.syncfs(false, function(err) { |
||||
assert(!err); |
||||
//Module.print("End File sync..");
|
||||
Module.syncdone = 1; |
||||
}); |
||||
} |
||||
, 0); |
||||
// clang-format on
|
||||
} |
||||
} |
||||
|
||||
return true; |
||||
} |
||||
#endif |
||||
|
||||
extern "C" void tick() { |
||||
osDelay(1); |
||||
} |
||||
|
||||
void serialWrite(const char *msg, int msgLen) { |
||||
if (msgLen == -1) { |
||||
msgLen = strlen(msg); |
||||
} |
||||
|
||||
#ifdef EEZ_PLATFORM_STM32 |
||||
CDC_Transmit_FS((uint8_t *)msg, (uint16_t)msgLen); |
||||
#endif |
||||
|
||||
#ifdef EEZ_PLATFORM_SIMULATOR |
||||
printf("%.*s", msgLen, msg); |
||||
#endif |
||||
} |
||||
|
||||
#if defined(EEZ_PLATFORM_SIMULATOR) && !defined(__EMSCRIPTEN__) |
||||
void consoleInputTask(void *); |
||||
EEZ_THREAD_DECLARE(consoleInput, Normal, 1024); |
||||
|
||||
int main() { |
||||
init(); |
||||
|
||||
EEZ_THREAD_CREATE(consoleInput, consoleInputTask); |
||||
|
||||
while (!eez::g_shutdown) { |
||||
tick(); |
||||
} |
||||
} |
||||
|
||||
void consoleInputTask(void *) { |
||||
using namespace eez; |
||||
//sendMessageToLowPriorityThread(SERIAL_LINE_STATE_CHANGED, 1);
|
||||
|
||||
while (1) { |
||||
int ch = getchar(); |
||||
if (ch == EOF) { |
||||
break; |
||||
} |
||||
//Serial.put(ch);
|
||||
} |
||||
} |
||||
#endif // EEZ_PLATFORM_SIMULATOR
|
||||
|
||||
namespace eez { |
||||
|
||||
bool g_shutdown; |
||||
|
||||
void shutdown() { |
||||
g_shutdown = true;
|
||||
} |
||||
|
||||
} // namespace eez
|
@ -0,0 +1,25 @@
|
||||
#pragma once |
||||
|
||||
#include <stdlib.h> |
||||
#include <stdint.h> |
||||
|
||||
struct TouchScreenCalibrationParams { |
||||
int16_t isValid; |
||||
int16_t touchScreenCalTlx; |
||||
int16_t touchScreenCalTly; |
||||
int16_t touchScreenCalBrx; |
||||
int16_t touchScreenCalBry; |
||||
int16_t touchScreenCalTrx; |
||||
int16_t touchScreenCalTry; |
||||
}; |
||||
|
||||
extern TouchScreenCalibrationParams g_touchScreenCalibrationParams; |
||||
|
||||
// Initialize firmware. Called from the freertos.c only once after HW is initialized.
|
||||
extern "C" void init(); |
||||
|
||||
// Called from freertos.c continuously after init() has been called.
|
||||
extern "C" void tick(); |
||||
|
||||
void updateBrightness(); |
||||
void serialWrite(const char *msg, int msgLen = -1); |
@ -0,0 +1,32 @@
|
||||
#include <assert.h> |
||||
|
||||
#include <eez/flow/flow.h> |
||||
#include <eez/flow/hooks.h> |
||||
|
||||
#include "../gui/app_context.h" |
||||
#include "../gui/keypad.h" |
||||
|
||||
namespace eez { |
||||
namespace flow { |
||||
|
||||
void showKeyboard(Value label, Value initialText, Value minChars, Value maxChars, bool isPassword, void(*onOk)(char *), void(*onCancel)()) { |
||||
eez::gui::startTextKeyboard(label.getString(), initialText.getString(), minChars.toInt32(), maxChars.toInt32(), isPassword, onOk, onCancel, nullptr); |
||||
} |
||||
|
||||
void showKeypad(Value label, Value initialValue, Value min, Value max, Unit unit, void(*onOk)(float), void(*onCancel)()) { |
||||
NumericKeypadOptions options; |
||||
options.pageId = PAGE_ID_NUMERIC_KEYPAD; |
||||
options.min = min.toFloat(); |
||||
options.max = max.toFloat(); |
||||
options.editValueUnit = unit; |
||||
|
||||
eez::gui::startNumericKeypad(&g_deviceAppContext, label.getString(), initialValue, options, onOk, nullptr, onCancel); |
||||
} |
||||
|
||||
void initHooks() { |
||||
showKeyboardHook = showKeyboard; |
||||
showKeypadHook = showKeypad; |
||||
} |
||||
|
||||
} // namespace flow
|
||||
} // namespace eez
|
@ -0,0 +1,9 @@
|
||||
#pragma once |
||||
|
||||
namespace eez { |
||||
namespace flow { |
||||
|
||||
void initHooks(); |
||||
|
||||
} // namespace flow
|
||||
} // namespace eez
|
Binary file not shown.
@ -0,0 +1,30 @@
|
||||
#include <eez/gui/gui.h> |
||||
|
||||
#include <eez/core/util.h> |
||||
#include <eez/gui/widgets/input.h> |
||||
|
||||
#include "../firmware.h" |
||||
#include "app_context.h" |
||||
#include "keypad.h" |
||||
|
||||
namespace eez { |
||||
namespace gui { |
||||
|
||||
void action_show_toast_message1() { |
||||
g_deviceAppContext.infoMessage("This is info message\nWith line 2!"); |
||||
} |
||||
|
||||
void action_show_toast_message2() { |
||||
g_deviceAppContext.errorMessage("This is error message\nWith line 2 ...\nand line 3!", true); |
||||
} |
||||
|
||||
void doAction() { |
||||
g_deviceAppContext.infoMessage("It should be fixed now!"); |
||||
} |
||||
|
||||
void action_show_toast_message3() { |
||||
g_deviceAppContext.errorMessageWithAction("Some error occured!\nYou should fix it.", doAction, "Fix"); |
||||
} |
||||
|
||||
} // namespace gui
|
||||
} // namespace eez
|
@ -0,0 +1,56 @@
|
||||
#include <eez/core/sound.h> |
||||
|
||||
#include <eez/gui/gui.h> |
||||
#include <eez/gui/touch_calibration.h> |
||||
|
||||
#include "app_context.h" |
||||
#include "document.h" |
||||
#include "keypad.h" |
||||
|
||||
namespace eez { |
||||
namespace gui { |
||||
|
||||
DeviceAppContext g_deviceAppContext; |
||||
|
||||
void DeviceAppContext::stateManagment() { |
||||
AppContext::stateManagment(); |
||||
|
||||
// if none page is active then show touch screen calibration page or banner
|
||||
if (getActivePageId() == PAGE_ID_NONE) { |
||||
if (!isTouchCalibrated()) { |
||||
enterTouchCalibration(&g_deviceAppContext); |
||||
} else { |
||||
showPage(getMainPageId()); |
||||
} |
||||
} |
||||
|
||||
// play power up tune when banner page shows up
|
||||
static bool g_powerUpPlayed; |
||||
if (!g_powerUpPlayed && getActivePageId() == PAGE_ID_MAIN) { |
||||
sound::playPowerUp(sound::PLAY_POWER_UP_CONDITION_NONE); |
||||
g_powerUpPlayed = true; |
||||
} |
||||
} |
||||
|
||||
int DeviceAppContext::getMainPageId() { |
||||
return PAGE_ID_MAIN; |
||||
} |
||||
|
||||
void DeviceAppContext::pageRenderCustom(int i, WidgetCursor &widgetCursor) { |
||||
if (getActivePageId() == PAGE_ID_TOUCH_CALIBRATION_YES_NO) { |
||||
auto touchEvent = touch::getLastEvent(); |
||||
if (touchEvent.type == EVENT_TYPE_TOUCH_DOWN || touchEvent.type == EVENT_TYPE_TOUCH_MOVE) { |
||||
int x = MIN(MAX(touchEvent.x, 1), display::getDisplayWidth() - 2); |
||||
int y = MIN(MAX(touchEvent.y, 1), display::getDisplayHeight() - 2); |
||||
display::setColor(255, 255, 255); |
||||
display::fillRect(x - 1, y - 1, x + 1, y + 1); |
||||
} |
||||
} |
||||
} |
||||
|
||||
bool DeviceAppContext::isAutoRepeatAction(int action) { |
||||
return action == ACTION_ID_KEYPAD_BACK; |
||||
} |
||||
|
||||
} // namespace gui
|
||||
} // namespace eez
|
@ -0,0 +1,23 @@
|
||||
#pragma once |
||||
|
||||
#include <eez/gui/gui.h> |
||||
|
||||
using namespace eez::gui; |
||||
|
||||
namespace eez { |
||||
namespace gui { |
||||
|
||||
class DeviceAppContext : public AppContext { |
||||
public: |
||||
void stateManagment() override; |
||||
void pageRenderCustom(int i, WidgetCursor &widgetCursor) override; |
||||
bool isAutoRepeatAction(int action) override; |
||||
|
||||
protected: |
||||
int getMainPageId() override; |
||||
}; |
||||
|
||||
extern DeviceAppContext g_deviceAppContext; |
||||
|
||||
} // namespace gui
|
||||
} // namespace eez
|
@ -0,0 +1,45 @@
|
||||
#include <eez/core/alloc.h> |
||||
#include <eez/core/os.h> |
||||
#include <limits.h> |
||||
|
||||
#include <eez/gui/gui.h> |
||||
#include <eez/gui/draw.h> |
||||
|
||||
#include "../date_time.h" |
||||
#include "../firmware.h" |
||||
|
||||
namespace eez { |
||||
namespace gui { |
||||
|
||||
const EnumItem *g_enumDefinitions[] = { nullptr }; |
||||
|
||||
void data_date_year(DataOperationEnum operation, const WidgetCursor &widgetCursor, Value &value) { |
||||
value = date_time::g_dateTime.year + 2000; |
||||
} |
||||
|
||||
void data_date_month(DataOperationEnum operation, const WidgetCursor &widgetCursor, Value &value) { |
||||
value = date_time::g_dateTime.month; |
||||
} |
||||
|
||||
void data_date_day(DataOperationEnum operation, const WidgetCursor &widgetCursor, Value &value) { |
||||
value = date_time::g_dateTime.day; |
||||
} |
||||
|
||||
void data_time_hour(DataOperationEnum operation, const WidgetCursor &widgetCursor, Value &value) { |
||||
value = date_time::g_dateTime.hour; |
||||
} |
||||
|
||||
void data_time_minute(DataOperationEnum operation, const WidgetCursor &widgetCursor, Value &value) { |
||||
value = date_time::g_dateTime.minute; |
||||
} |
||||
|
||||
void data_time_second(DataOperationEnum operation, const WidgetCursor &widgetCursor, Value &value) { |
||||
value = date_time::g_dateTime.second; |
||||
} |
||||
|
||||
void data_time_sub_second(DataOperationEnum operation, const WidgetCursor &widgetCursor, Value &value) { |
||||
value = date_time::g_dateTime.subSecond; |
||||
} |
||||
|
||||
} // namespace gui
|
||||
} // namespace eez
|
@ -0,0 +1,124 @@
|
||||
#include <eez/core/os.h> |
||||
#include <eez/core/eeprom.h> |
||||
|
||||
#include <eez/gui/gui.h> |
||||
#include <eez/gui/keypad.h> |
||||
#include <eez/gui/touch_calibration.h> |
||||
#include <eez/flow/flow.h> |
||||
|
||||
#include "../firmware.h" |
||||
|
||||
#include "app_context.h" |
||||
#include "keypad.h" |
||||
|
||||
#if defined(EEZ_PLATFORM_SIMULATOR) |
||||
#include "../platform/simulator/front_panel.h" |
||||
#endif |
||||
|
||||
#if defined(EEZ_PLATFORM_SIMULATOR) |
||||
|
||||
// for home directory (see getConfFilePath)
|
||||
#ifdef _WIN32 |
||||
#undef INPUT |
||||
#undef OUTPUT |
||||
#include <Shlobj.h> |
||||
#include <Windows.h> |
||||
#include <direct.h> |
||||
#else |
||||
#include <string.h> |
||||
#include <pwd.h> |
||||
#include <sys/stat.h> |
||||
#include <sys/types.h> |
||||
#include <unistd.h> |
||||
#endif |
||||
|
||||
#endif |
||||
|
||||
namespace eez { |
||||
|
||||
#if defined(EEZ_PLATFORM_SIMULATOR) |
||||
|
||||
char *getConfFilePath(const char *file_name) { |
||||
static char file_path[1024]; |
||||
|
||||
*file_path = 0; |
||||
|
||||
#ifdef _WIN32 |
||||
if (SUCCEEDED(SHGetFolderPathA(NULL, CSIDL_PROFILE, NULL, 0, file_path))) { |
||||
stringAppendString(file_path, sizeof(file_path), "\\.eez-flow-template-stm32f469i-disco"); |
||||
_mkdir(file_path); |
||||
stringAppendString(file_path, sizeof(file_path), "\\"); |
||||
} |
||||
#elif defined(__EMSCRIPTEN__) |
||||
stringAppendString(file_path, sizeof(file_path), "/eez-flow-template-stm32f469i-disco/"); |
||||
#else |
||||
const char *home_dir = 0; |
||||
if ((home_dir = getenv("HOME")) == NULL) { |
||||
home_dir = getpwuid(getuid())->pw_dir; |
||||
} |
||||
if (home_dir) { |
||||
stringAppendString(file_path, sizeof(file_path), home_dir); |
||||
stringAppendString(file_path, sizeof(file_path), "/.eez-flow-template-stm32f469i-disco"); |
||||
mkdir(file_path, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); |
||||
stringAppendString(file_path, sizeof(file_path), "/"); |
||||
} |
||||
#endif |
||||
|
||||
char *q = file_path + strlen(file_path); |
||||
const char *p = file_name; |
||||
while (*p) { |
||||
char ch = *p++; |
||||
#ifdef _WIN32 |
||||
if (ch == '/') |
||||
*q++ = '\\'; |
||||
#else |
||||
if (ch == '\\') |
||||
*q++ = '/'; |
||||
#endif |
||||
else |
||||
*q++ = ch; |
||||
} |
||||
*q = 0; |
||||
|
||||
return file_path; |
||||
} |
||||
|
||||
#endif |
||||
|
||||
|
||||
namespace gui { |
||||
|
||||
AppContext *getAppContextFromId(int16_t id) { |
||||
if (id == APP_CONTEXT_ID_DEVICE) { |
||||
return &g_deviceAppContext; |
||||
} |
||||
|
||||
#if defined(EEZ_PLATFORM_SIMULATOR) |
||||
if (id == APP_CONTEXT_ID_SIMULATOR_FRONT_PANEL) { |
||||
return &g_frontPanelAppContext; |
||||
} |
||||
#endif |
||||
|
||||
return nullptr; |
||||
} |
||||
|
||||
static int overrideStyleHook(const WidgetCursor &widgetCursor, int styleId) { |
||||
return styleId; |
||||
} |
||||
|
||||
static bool styleGetSmallerFontHook(font::Font &font) { |
||||
return true; |
||||
} |
||||
|
||||
static int getExtraLongTouchActionHook() { |
||||
return ACTION_ID_NONE; |
||||
} |
||||
|
||||
void initHooks() { |
||||
g_hooks.overrideStyle = overrideStyleHook; |
||||
g_hooks.getExtraLongTouchAction = getExtraLongTouchActionHook; |
||||
g_hooks.styleGetSmallerFont = styleGetSmallerFontHook; |
||||
} |
||||
|
||||
} // namespace gui
|
||||
} // namespace eez
|
@ -0,0 +1,9 @@
|
||||
#pragma once |
||||
|
||||
namespace eez { |
||||
namespace gui { |
||||
|
||||
void initHooks(); |
||||
|
||||
} // namespace gui
|
||||
} // namespace eez
|
@ -0,0 +1,103 @@
|
||||
#include <eez/core/sound.h> |
||||
|
||||
#include <eez/gui/keypad.h> |
||||
#include <eez/gui/widgets/display_data.h> |
||||
#include <eez/gui/widgets/input.h> |
||||
|
||||
#include <eez/flow/flow.h> |
||||
|
||||
#include "app_context.h" |
||||
#include "keypad.h" |
||||
|
||||
namespace eez { |
||||
namespace gui { |
||||
|
||||
static NumericKeypad g_numericKeypad; |
||||
static Keypad g_textKeyboard; |
||||
|
||||
static Keypad *g_activeKeypad; |
||||
|
||||
NumericKeypad *startNumericKeypad( |
||||
AppContext *appContext, |
||||
const char *label, |
||||
const Value &value, |
||||
NumericKeypadOptions &options, |
||||
void(*okFloat)(float), |
||||
void(*okUint32)(uint32_t), |
||||
void(*cancel)() |
||||
) { |
||||
g_activeKeypad = &g_numericKeypad; |
||||
g_numericKeypad.init(appContext, label, value, options, okFloat, okUint32, cancel); |
||||
appContext->pushPage(options.pageId, &g_numericKeypad); |
||||
return &g_numericKeypad; |
||||
} |
||||
|
||||
void startTextKeyboard(const char *label, const char *text, int minChars_, int maxChars_, bool isPassword_, void(*ok)(char *), void(*cancel)(), void(*setDefault)()) { |
||||
g_activeKeypad = &g_textKeyboard; |
||||
g_textKeyboard.start(&g_deviceAppContext, label, text, minChars_, maxChars_, isPassword_, ok, cancel, setDefault); |
||||
g_deviceAppContext.pushPage(PAGE_ID_KEYBOARD, &g_textKeyboard); |
||||
} |
||||
|
||||
void executeNumericKeypadOptionHook(int optionActionIndex) { |
||||
} |
||||
|
||||
Keypad *getActiveKeypad() { |
||||
return g_activeKeypad; |
||||
} |
||||
|
||||
NumericKeypad *getActiveNumericKeypad() { |
||||
if (g_deviceAppContext.getActivePageId() == PAGE_ID_NUMERIC_KEYPAD) { |
||||
return &g_numericKeypad; |
||||
} |
||||
return nullptr; |
||||
} |
||||
|
||||
WidgetCursor g_editWidgetCursor; |
||||
|
||||
void keypadSetFloatValue(float value) { |
||||
//auto &widgetCursor = g_editWidgetCursor;
|
||||
g_deviceAppContext.popPage(); |
||||
} |
||||
|
||||
void textKeyboardSet(char *value) { |
||||
auto &widgetCursor = g_editWidgetCursor; |
||||
set(widgetCursor, widgetCursor.widget->data, value); |
||||
g_deviceAppContext.popPage(); |
||||
} |
||||
|
||||
void action_edit() { |
||||
auto widgetCursor = getFoundWidgetAtDown(); |
||||
auto widget = (const InputWidget*)widgetCursor.widget; |
||||
|
||||
auto data = widgetCursor.widget->data; |
||||
|
||||
auto value = eez::gui::get(widgetCursor, data); |
||||
auto minValue = eez::gui::getMin(widgetCursor, data); |
||||
auto maxValue = eez::gui::getMax(widgetCursor, data); |
||||
|
||||
g_editWidgetCursor = widgetCursor; |
||||
|
||||
if (widget->flags & INPUT_WIDGET_TYPE_NUMBER) { |
||||
auto defValue = eez::gui::getDef(widgetCursor, data); |
||||
|
||||
NumericKeypadOptions options; |
||||
|
||||
options.pageId = PAGE_ID_NUMERIC_KEYPAD; |
||||
|
||||
options.min = minValue.getFloat(); |
||||
options.max = maxValue.getFloat(); |
||||
|
||||
// auto dataId = flow::getNativeVariableId(widgetCursor);
|
||||
// if (dataId == DATA_ID_INTENSITY) {
|
||||
// options.editValueUnit = value.getUnit();
|
||||
// options.flags.dotButtonEnabled = true;
|
||||
// }
|
||||
|
||||
startNumericKeypad(&g_deviceAppContext, nullptr, value, options, keypadSetFloatValue, nullptr, nullptr); |
||||
} else { |
||||
startTextKeyboard(nullptr, value.getString(), minValue.toInt32(), maxValue.toInt32(), widget->flags & INPUT_WIDGET_PASSWORD_FLAG, textKeyboardSet, nullptr, nullptr); |
||||
} |
||||
} |
||||
|
||||
} // gui
|
||||
} // eez
|
@ -0,0 +1,30 @@
|
||||
#pragma once |
||||
|
||||
#include <eez/gui/keypad.h> |
||||
|
||||
namespace eez { |
||||
namespace gui { |
||||
|
||||
NumericKeypad *startNumericKeypad( |
||||
AppContext *appContext, |
||||
const char *label, |
||||
const Value &value, |
||||
NumericKeypadOptions &options, |
||||
void(*okFloat)(float), |
||||
void(*okUint32)(uint32_t), |
||||
void(*cancel)() |
||||
); |
||||
|
||||
void startTextKeyboard( |
||||
const char *label, |
||||
const char *text, |
||||
int minChars_, |
||||
int maxChars_, |
||||
bool isPassword_, |
||||
void(*ok)(char *), |
||||
void(*cancel)(), |
||||
void(*setDefault)() |
||||
); |
||||
|
||||
} // namespace gui
|
||||
} // namespace eez
|
Binary file not shown.
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 36 KiB |
After Width: | Height: | Size: 1.8 KiB |
@ -0,0 +1,34 @@
|
||||
/*
|
||||
* EEZ Generic Firmware |
||||
* Copyright (C) 2020-present, Envox d.o.o. |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation, either version 3 of the License, or |
||||
* (at your option) any later version. |
||||
|
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
|
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#include <memory.h> |
||||
#include <string.h> |
||||
#include <stdio.h> |
||||
|
||||
#include <eez/core/keyboard.h> |
||||
|
||||
namespace eez { |
||||
namespace keyboard { |
||||
|
||||
#if defined(EEZ_PLATFORM_SIMULATOR) && !defined(__EMSCRIPTEN__) |
||||
void onKeyboardEvent(SDL_KeyboardEvent *key) { |
||||
} |
||||
#endif |
||||
|
||||
} // keyboard
|
||||
} // eez
|
@ -0,0 +1,64 @@
|
||||
#ifdef EEZ_PLATFORM_STM32 |
||||
#include "main.h" |
||||
#include "tim.h" |
||||
#include "stm32469i_discovery_lcd.h" |
||||
#include "stm32469i_discovery_sdram.h" |
||||
#include "stm32469i_discovery_ts.h" |
||||
#endif |
||||
|
||||
#include "firmware.h" |
||||
#include "eez/conf.h" |
||||
#include "eez/core/memory.h" |
||||
|
||||
#define MAX_BRIGHTNESS 20 |
||||
|
||||
#ifdef EEZ_PLATFORM_STM32 |
||||
|
||||
extern LTDC_HandleTypeDef hltdc_eval; |
||||
extern DMA2D_HandleTypeDef hdma2d_eval; |
||||
|
||||
static void OnError_Handler(uint32_t condition); |
||||
|
||||
/**
|
||||
* @brief On Error Handler on condition TRUE. |
||||
* @param condition : Can be TRUE or FALSE |
||||
* @retval None |
||||
*/ |
||||
static void OnError_Handler(uint32_t condition) { |
||||
if(condition) { |
||||
BSP_LED_On(LED3); |
||||
while(1) { ; } /* Blocking on error */ |
||||
} |
||||
} |
||||
|
||||
#endif |
||||
|
||||
void LCD_init() { |
||||
#ifdef EEZ_PLATFORM_STM32 |
||||
uint8_t lcd_status = LCD_OK; |
||||
|
||||
lcd_status = BSP_LCD_Init(); |
||||
OnError_Handler(lcd_status != LCD_OK); |
||||
|
||||
BSP_LCD_LayerDefaultInit(0, (uint32_t)eez::VRAM_BUFFER1_START_ADDRESS); |
||||
BSP_LCD_SelectLayer(0); |
||||
|
||||
BSP_LCD_Clear(LCD_COLOR_BLACK); |
||||
|
||||
BSP_TS_Init(DISPLAY_WIDTH, DISPLAY_HEIGHT); |
||||
#endif |
||||
|
||||
updateBrightness(); |
||||
} |
||||
|
||||
void updateBrightness() { |
||||
#ifdef EEZ_PLATFORM_STM32 |
||||
// auto brightness = g_lcdBrightness;
|
||||
//
|
||||
// auto phtim = &htim2;
|
||||
//
|
||||
// HAL_TIM_PWM_Start(phtim, TIM_CHANNEL_1);
|
||||
// uint32_t max = __HAL_TIM_GET_AUTORELOAD(phtim);
|
||||
// __HAL_TIM_SET_COMPARE(phtim, TIM_CHANNEL_1, brightness * max / MAX_BRIGHTNESS);
|
||||
#endif // EEZ_PLATFORM_STM32
|
||||
} |
@ -0,0 +1,47 @@
|
||||
<!doctype html> |
||||
<html lang="en-us"> |
||||
|
||||
<head> |
||||
<meta charset="utf-8"> |
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> |
||||
<title>STM32F469I-DISCO Template</title> |
||||
|
||||
<script src="https://code.jquery.com/jquery-2.2.4.min.js" integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44=" |
||||
crossorigin="anonymous"></script> |
||||
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jquery.terminal/1.19.1/css/jquery.terminal.min.css" |
||||
integrity="sha256-Wmou2jG6hKDZfedC0GE/DU10CZmRLYFbwKWDXTAt52s=" crossorigin="anonymous" /> |
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.terminal/1.19.1/js/jquery.terminal.min.js" integrity="sha256-eC2LikcRx0UbkV/d/her4358nTQP0AxRJczIwO6Rso8=" |
||||
crossorigin="anonymous"></script> |
||||
|
||||
<link rel="stylesheet" href="main.css" /> |
||||
</head> |
||||
|
||||
<body> |
||||
<div id="content"> |
||||
<div id="header"> |
||||
<div id='title'>STM32F469I-DISCO Template</div> |
||||
<div id='spinner'></div> |
||||
<div id="status">Downloading...</div> |
||||
<div> |
||||
<progress value="0" max="100" id="progress" hidden=1></progress> |
||||
</div> |
||||
</div> |
||||
|
||||
<div id="canvas-container"> |
||||
<canvas id="canvas" oncontextmenu="event.preventDefault()" width="1000" height="680"></canvas> |
||||
</div> |
||||
|
||||
<div id="output"></div> |
||||
|
||||
<div id="footer"> |
||||
<span>Copyright (C) 2022 <a href="https://www.envox.eu" target="_blank">Envox d.o.o.</a></span> |
||||
<a href="http://emscripten.org" target="_blank">Powered by Emscripten</a> |
||||
</div> |
||||
</div> |
||||
|
||||
<script src="main.js"></script> |
||||
<script async type="text/javascript" src="eez-flow-template-stm32f469i-disco.js"></script> |
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,139 @@
|
||||
body { |
||||
font-family: arial; |
||||
margin: 0; |
||||
padding: 0; |
||||
overflow: hidden; |
||||
} |
||||
|
||||
#content { |
||||
position: absolute; |
||||
top: 0; |
||||
left: 0; |
||||
width: 100%; |
||||
height: 100%; |
||||
display: flex; |
||||
flex-direction: column; |
||||
} |
||||
|
||||
#header { |
||||
min-height: 40px; |
||||
|
||||
flex-grow: 0; |
||||
flex-shrink: 0; |
||||
|
||||
display: flex; |
||||
flex-direction: row; |
||||
align-items: center; |
||||
padding: 10px; |
||||
background: #eee; |
||||
border-bottom: 1px solid #ddd; |
||||
} |
||||
|
||||
#header > div { |
||||
margin-left: 20px; |
||||
} |
||||
|
||||
#title { |
||||
font-weight: bold; |
||||
color: #333; |
||||
font-size: 150%; |
||||
} |
||||
|
||||
#spinner { |
||||
height: 30px; |
||||
width: 30px; |
||||
|
||||
-webkit-animation: rotation 0.8s linear infinite; |
||||
-moz-animation: rotation 0.8s linear infinite; |
||||
-o-animation: rotation 0.8s linear infinite; |
||||
animation: rotation 0.8s linear infinite; |
||||
|
||||
border-left: 5px solid rgb(235, 235, 235); |
||||
border-right: 5px solid rgb(235, 235, 235); |
||||
border-bottom: 5px solid rgb(235, 235, 235); |
||||
border-top: 5px solid rgb(120, 120, 120); |
||||
|
||||
border-radius: 100%; |
||||
background-color: rgb(189, 215, 46); |
||||
} |
||||
|
||||
@-webkit-keyframes rotation { |
||||
from { |
||||
-webkit-transform: rotate(0deg); |
||||
} |
||||
to { |
||||
-webkit-transform: rotate(360deg); |
||||
} |
||||
} |
||||
|
||||
@-moz-keyframes rotation { |
||||
from { |
||||
-moz-transform: rotate(0deg); |
||||
} |
||||
to { |
||||
-moz-transform: rotate(360deg); |
||||
} |
||||
} |
||||
|
||||
@-o-keyframes rotation { |
||||
from { |
||||
-o-transform: rotate(0deg); |
||||
} |
||||
to { |
||||
-o-transform: rotate(360deg); |
||||
} |
||||
} |
||||
|
||||
@keyframes rotation { |
||||
from { |
||||
transform: rotate(0deg); |
||||
} |
||||
to { |
||||
transform: rotate(360deg); |
||||
} |
||||
} |
||||
|
||||
#status { |
||||
font-weight: bold; |
||||
color: rgb(120, 120, 120); |
||||
} |
||||
|
||||
#progress { |
||||
height: 20px; |
||||
width: 300px; |
||||
} |
||||
|
||||
#canvas-container { |
||||
flex-grow: 0; |
||||
flex-shrink: 0; |
||||
text-align: center; |
||||
margin-top: 10px; |
||||
} |
||||
|
||||
/* the canvas *must not* have any border or padding, or mouse coords will be wrong */ |
||||
#canvas { |
||||
margin: 0; |
||||
border: none; |
||||
padding: 0; |
||||
} |
||||
|
||||
#output { |
||||
flex-grow: 1; |
||||
flex-shrink: 1; |
||||
margin-top: 10px; |
||||
} |
||||
|
||||
#footer { |
||||
flex-grow: 0; |
||||
flex-shrink: 0; |
||||
text-align: center; |
||||
background: #eee; |
||||
border-top: 1px solid #ddd; |
||||
padding: 10px; |
||||
display: flex; |
||||
justify-content: space-between; |
||||
} |
||||
|
||||
#footer > a:nth-child(3) { |
||||
color: #999; |
||||
} |
@ -0,0 +1,206 @@
|
||||
var statusElement = document.getElementById("status"); |
||||
var progressElement = document.getElementById("progress"); |
||||
var spinnerElement = document.getElementById("spinner"); |
||||
|
||||
var stdinBuffer = []; |
||||
|
||||
var terminal = $("#output").terminal( |
||||
function(command) { |
||||
// send command characters one by one, with 10ms interval, otherwise it will block for unknown reason
|
||||
const sendChar = () => { |
||||
if (i < command.length) { |
||||
stdinBuffer.push(command.charCodeAt(i)); |
||||
i++; |
||||
setTimeout(sendChar, 10); // 10ms
|
||||
} else { |
||||
stdinBuffer.push(13); |
||||
} |
||||
} |
||||
let i = 0; |
||||
sendChar(); |
||||
}, |
||||
{ |
||||
greetings: "", |
||||
name: "js_demo", |
||||
prompt: "[[;yellow;]> ]" |
||||
} |
||||
); |
||||
|
||||
var Module = { |
||||
preRun: [ |
||||
function() { |
||||
var lastCh = null; |
||||
|
||||
function stdin() { |
||||
var ch = stdinBuffer.shift(); |
||||
if (ch !== undefined) { |
||||
lastCh = ch; |
||||
} else { |
||||
// if no input then send 0, null, 0, null, ... to trick emscripten,
|
||||
// otherwise it will stop calling this function
|
||||
lastCh = lastCh === null ? 0 : null; |
||||
} |
||||
return lastCh; |
||||
} |
||||
|
||||
FS.init(stdin); |
||||
} |
||||
], |
||||
|
||||
postRun: [], |
||||
|
||||
onRuntimeInitialized: function () { |
||||
console.log("onRuntimeInitialized"); |
||||
Module._init(); |
||||
Module._startFlow(); |
||||
|
||||
const canvas = document.getElementById("canvas"); |
||||
const ctx = canvas.getContext("2d"); |
||||
|
||||
const displayWidth = canvas.width; |
||||
const displayHeight = canvas.height; |
||||
|
||||
let wheelDeltaY = 0; |
||||
let wheelClicked = 0; |
||||
let pointerEvents = []; |
||||
|
||||
const tick = () => { |
||||
if (!Module._mainLoop()) { |
||||
// flow is stopped
|
||||
return; |
||||
} |
||||
|
||||
if (pointerEvents.length > 0) { |
||||
for (let i = 0; i < pointerEvents.length; i++) { |
||||
const pointerEvent = pointerEvents[i]; |
||||
Module._onPointerEvent(pointerEvent.x, pointerEvent.y, pointerEvent.pressed); |
||||
} |
||||
pointerEvents = []; |
||||
} |
||||
|
||||
if (wheelDeltaY != 0 || wheelClicked != 0) { |
||||
Modulentime._onMouseWheelEvent(wheelDeltaY, wheelClicked); |
||||
wheelDeltaY = 0; |
||||
wheelClicked = 0; |
||||
} |
||||
|
||||
var buf_addr = Module._getSyncedBuffer(); |
||||
if (buf_addr != 0) { |
||||
const screen = new Uint8ClampedArray(Module.HEAPU8.subarray(buf_addr, buf_addr + displayWidth * displayHeight *4)); |
||||
var imgData = new ImageData(screen, displayWidth, displayHeight); |
||||
ctx.putImageData(imgData, 0, 0, 0, 0, canvas.width, canvas.height); |
||||
} |
||||
|
||||
window.requestAnimationFrame(tick); |
||||
}; |
||||
|
||||
window.requestAnimationFrame(tick); |
||||
|
||||
function sendPointerEvent(event) { |
||||
var bbox = canvas.getBoundingClientRect(); |
||||
const x = (event.clientX - bbox.left) * (canvas.width / bbox.width); |
||||
const y = (event.clientY - bbox.top) * (canvas.height / bbox.height); |
||||
const pressed = event.buttons == 1 ? 1 : 0; |
||||
pointerEvents.push({ x, y, pressed }); |
||||
event.preventDefault(); |
||||
event.stopPropagation(); |
||||
} |
||||
|
||||
canvas.addEventListener("pointerdown", event => { |
||||
if (event.buttons == 4) { |
||||
wasmRuntime.wheelClicked = 1; |
||||
} |
||||
canvas.setPointerCapture(event.pointerId); |
||||
sendPointerEvent(event); |
||||
}, true); |
||||
|
||||
canvas.addEventListener("pointermove",event => { |
||||
sendPointerEvent(event); |
||||
}, true); |
||||
|
||||
canvas.addEventListener("pointerup",event => { |
||||
canvas.releasePointerCapture(event.pointerId); |
||||
sendPointerEvent(event); |
||||
}, true); |
||||
|
||||
canvas.addEventListener("pointercancel",event => { |
||||
canvas.releasePointerCapture(event.pointerId); |
||||
sendPointerEvent(event); |
||||
}, true); |
||||
|
||||
document.addEventListener("wheel", event => { |
||||
wheelDeltaY += -event.deltaY; |
||||
}, true);
|
||||
}, |
||||
|
||||
print: function(text) { |
||||
if (arguments.length > 1) { |
||||
text = Array.prototype.slice.call(arguments).join(" "); |
||||
} |
||||
|
||||
console.log(text); |
||||
|
||||
if (text.startsWith("**ERROR")) { |
||||
terminal.error(text); |
||||
} else { |
||||
terminal.echo(text); |
||||
} |
||||
}, |
||||
|
||||
printErr: function(text) { |
||||
if (arguments.length > 1) { |
||||
text = Array.prototype.slice.call(arguments).join(" "); |
||||
} |
||||
console.error(text); |
||||
}, |
||||
|
||||
setStatus: function(text) { |
||||
if (!Module.setStatus.last) |
||||
Module.setStatus.last = { time: Date.now(), text: "" }; |
||||
if (text === Module.setStatus.last.text) return; |
||||
var m = text.match(/([^(]+)\((\d+(\.\d+)?)\/(\d+)\)/); |
||||
var now = Date.now(); |
||||
if (m && now - Module.setStatus.last.time < 30) return; // if this is a progress update, skip it if too soon
|
||||
Module.setStatus.last.time = now; |
||||
Module.setStatus.last.text = text; |
||||
if (m) { |
||||
text = m[1]; |
||||
progressElement.value = parseInt(m[2]) * 100; |
||||
progressElement.max = parseInt(m[4]) * 100; |
||||
progressElement.hidden = false; |
||||
spinnerElement.hidden = false; |
||||
} else { |
||||
progressElement.value = null; |
||||
progressElement.max = null; |
||||
progressElement.hidden = true; |
||||
if (!text) spinnerElement.style.display = "none"; |
||||
} |
||||
statusElement.innerHTML = text; |
||||
}, |
||||
|
||||
totalDependencies: 0, |
||||
|
||||
monitorRunDependencies: function(left) { |
||||
this.totalDependencies = Math.max(this.totalDependencies, left); |
||||
Module.setStatus( |
||||
left |
||||
? "Preparing... (" + |
||||
(this.totalDependencies - left) + |
||||
"/" + |
||||
this.totalDependencies + |
||||
")" |
||||
: "All downloads complete." |
||||
); |
||||
} |
||||
}; |
||||
|
||||
Module.setStatus("Downloading..."); |
||||
|
||||
window.onerror = function(event) { |
||||
// TODO: do not warn on ok events like simulating an infinite loop or exitStatus
|
||||
Module.setStatus("Exception thrown, see JavaScript console"); |
||||
spinnerElement.style.display = "none"; |
||||
Module.setStatus = function(text) { |
||||
if (text) Module.printErr("[post-exception status] " + text); |
||||
}; |
||||
}; |
@ -0,0 +1,40 @@
|
||||
#include <eez/gui/gui.h> |
||||
|
||||
#include "../gui/app_context.h" |
||||
#include "../gui/document.h" |
||||
|
||||
#include "front_panel.h" |
||||
|
||||
namespace eez { |
||||
namespace gui { |
||||
|
||||
FrontPanelAppContext g_frontPanelAppContext; |
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void FrontPanelAppContext::stateManagment() { |
||||
AppContext::stateManagment(); |
||||
|
||||
if (getActivePageId() == PAGE_ID_NONE) { |
||||
showPage(getMainPageId()); |
||||
} |
||||
} |
||||
|
||||
int FrontPanelAppContext::getMainPageId() { |
||||
return PAGE_ID_FRONT_PANEL; |
||||
} |
||||
|
||||
int FrontPanelAppContext::getLongTouchActionHook(const WidgetCursor &widgetCursor) { |
||||
return AppContext::getLongTouchActionHook(widgetCursor); |
||||
} |
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void data_main_app_view(DataOperationEnum operation, const WidgetCursor &widgetCursor, Value &value) { |
||||
if (operation == DATA_OPERATION_GET) { |
||||
value = Value(&g_deviceAppContext); |
||||
} |
||||
} |
||||
|
||||
} // namespace gui
|
||||
} // namespace eez
|
@ -0,0 +1,23 @@
|
||||
#pragma once |
||||
|
||||
#include <eez/gui/gui.h> |
||||
|
||||
using namespace eez::gui; |
||||
|
||||
namespace eez { |
||||
namespace gui { |
||||
|
||||
class FrontPanelAppContext : public AppContext { |
||||
public: |
||||
void stateManagment() override; |
||||
|
||||
int getLongTouchActionHook(const WidgetCursor &widgetCursor) override; |
||||
|
||||
protected: |
||||
int getMainPageId() override; |
||||
}; |
||||
|
||||
extern FrontPanelAppContext g_frontPanelAppContext; |
||||
|
||||
} // namespace gui
|
||||
} // namespace eez
|
File diff suppressed because one or more lines are too long
Binary file not shown.
@ -0,0 +1,41 @@
|
||||
/*
|
||||
* EEZ Modular Firmware |
||||
* Copyright (C) 2015-present, Envox d.o.o. |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation, either version 3 of the License, or |
||||
* (at your option) any later version. |
||||
|
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
|
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#include <math.h> |
||||
#include <memory.h> |
||||
#include <assert.h> |
||||
|
||||
#include <eez/core/sound.h> |
||||
|
||||
namespace eez { |
||||
namespace sound { |
||||
|
||||
void playPowerUp(PlayPowerUpCondition condition) { |
||||
} |
||||
|
||||
void playPowerDown() { |
||||
} |
||||
|
||||
void playBeep(bool force) { |
||||
} |
||||
|
||||
void playClick() { |
||||
} |
||||
|
||||
} // namespace sound
|
||||
} // namespace eez
|
@ -0,0 +1,188 @@
|
||||
/*
|
||||
* EEZ Generic Firmware |
||||
* Copyright (C) 2020-present, Envox d.o.o. |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation, either version 3 of the License, or |
||||
* (at your option) any later version. |
||||
|
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
|
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#include <stdio.h> // snprintf |
||||
|
||||
#include <eez/core/hmi.h> |
||||
#include <eez/core/os.h> |
||||
|
||||
#include <eez/flow/flow.h> |
||||
|
||||
#include <eez/gui/touch.h> |
||||
|
||||
#include "tasks.h" |
||||
|
||||
using namespace eez; |
||||
|
||||
namespace eez { |
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void highPriorityThreadMainLoop(void *); |
||||
|
||||
EEZ_THREAD_DECLARE(highPriority, AboveNormal, 4 * 1024); |
||||
|
||||
#if defined(EEZ_PLATFORM_STM32) |
||||
#define HIGH_PRIORITY_QUEUE_SIZE 50 |
||||
#endif |
||||
|
||||
#if defined(EEZ_PLATFORM_SIMULATOR) |
||||
#define HIGH_PRIORITY_QUEUE_SIZE 100 |
||||
#endif |
||||
|
||||
EEZ_MESSAGE_QUEUE_DECLARE(highPriority, { |
||||
HighPriorityThreadMessage type; |
||||
uint32_t param; |
||||
}); |
||||
|
||||
|
||||
void initHighPriorityMessageQueue() { |
||||
EEZ_MESSAGE_QUEUE_CREATE(highPriority, HIGH_PRIORITY_QUEUE_SIZE); |
||||
} |
||||
|
||||
void startHighPriorityThread() { |
||||
EEZ_THREAD_CREATE(highPriority, highPriorityThreadMainLoop); |
||||
} |
||||
|
||||
void highPriorityThreadOneIter(); |
||||
|
||||
void highPriorityThreadMainLoop(void *) { |
||||
#ifdef __EMSCRIPTEN__ |
||||
highPriorityThreadOneIter(); |
||||
#else |
||||
g_highPriorityTaskHandle = osThreadGetId(); |
||||
|
||||
while (1) { |
||||
highPriorityThreadOneIter(); |
||||
} |
||||
#endif |
||||
} |
||||
|
||||
void highPriorityThreadOneIter() { |
||||
highPriorityMessageQueueObject obj; |
||||
if (EEZ_MESSAGE_QUEUE_GET(highPriority, obj, 1)) { |
||||
auto type = obj.type; |
||||
|
||||
if (type == HIGH_PRIORITY_THREAD_MESSAGE_DUMMY) { |
||||
} |
||||
} |
||||
|
||||
#if defined(EEZ_PLATFORM_STM32) |
||||
// call every 10 ms
|
||||
static int counter = 0; |
||||
if (++counter == 10) { |
||||
gui::touch::tick(); |
||||
counter = 0; |
||||
} |
||||
#endif |
||||
} |
||||
|
||||
bool isHighPriorityThread() { |
||||
return osThreadGetId() == g_highPriorityTaskHandle; |
||||
} |
||||
|
||||
void sendMessageToHighPriorityThread(HighPriorityThreadMessage messageType, uint32_t messageParam, uint32_t timeoutMillisec) { |
||||
if (!g_highPriorityMessageQueueId) { |
||||
return; |
||||
} |
||||
|
||||
highPriorityMessageQueueObject obj; |
||||
obj.type = messageType; |
||||
obj.param = messageParam; |
||||
EEZ_MESSAGE_QUEUE_PUT(highPriority, obj, timeoutMillisec); |
||||
} |
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void lowPriorityThreadMainLoop(void *); |
||||
|
||||
EEZ_THREAD_DECLARE(lowPriority, Normal, 24 * 1024); |
||||
|
||||
EEZ_MESSAGE_QUEUE_DECLARE(lowPriority, { |
||||
LowPriorityThreadMessage type; |
||||
uint32_t param; |
||||
}); |
||||
|
||||
#define LOW_PRIORITY_THREAD_QUEUE_SIZE 10 |
||||
|
||||
void initLowPriorityMessageQueue() { |
||||
EEZ_MESSAGE_QUEUE_CREATE(lowPriority, LOW_PRIORITY_THREAD_QUEUE_SIZE); |
||||
} |
||||
|
||||
void startLowPriorityThread() { |
||||
EEZ_THREAD_CREATE(lowPriority, lowPriorityThreadMainLoop); |
||||
} |
||||
|
||||
void lowPriorityThreadOneIter(); |
||||
|
||||
void lowPriorityThreadMainLoop(void *) { |
||||
#ifdef __EMSCRIPTEN__ |
||||
lowPriorityThreadOneIter(); |
||||
#else |
||||
g_lowPriorityTaskHandle = osThreadGetId(); |
||||
|
||||
while (1) { |
||||
lowPriorityThreadOneIter(); |
||||
} |
||||
|
||||
while (true) { |
||||
osDelay(1); |
||||
} |
||||
#endif |
||||
} |
||||
|
||||
void lowPriorityThreadOneIter() { |
||||
static const uint32_t INTERVAL = 25; |
||||
static uint32_t g_lastTickCountMs; |
||||
|
||||
lowPriorityMessageQueueObject obj; |
||||
if (EEZ_MESSAGE_QUEUE_GET(lowPriority, obj, INTERVAL)) { |
||||
auto type = obj.type; |
||||
|
||||
if (type == LOW_PRIORITY_THREAD_MESSAGE_DUMMY) { |
||||
} |
||||
|
||||
uint32_t diffMs = millis() - g_lastTickCountMs; |
||||
if (diffMs < INTERVAL) { |
||||
return; |
||||
} |
||||
} |
||||
|
||||
g_lastTickCountMs = millis(); |
||||
|
||||
hmi::tick(); |
||||
|
||||
return; |
||||
} |
||||
|
||||
bool isLowPriorityThread() { |
||||
return osThreadGetId() == g_lowPriorityTaskHandle; |
||||
} |
||||
|
||||
void sendMessageToLowPriorityThread(LowPriorityThreadMessage messageType, uint32_t messageParam, uint32_t timeoutMillisec) { |
||||
if (!g_lowPriorityMessageQueueId) { |
||||
return; |
||||
} |
||||
|
||||
lowPriorityMessageQueueObject obj; |
||||
obj.type = messageType; |
||||
obj.param = messageParam; |
||||
EEZ_MESSAGE_QUEUE_PUT(lowPriority, obj, timeoutMillisec); |
||||
} |
||||
|
||||
} // namespace eez
|
@ -0,0 +1,25 @@
|
||||
#pragma once |
||||
|
||||
#include <eez/core/os.h> |
||||
|
||||
namespace eez { |
||||
|
||||
enum HighPriorityThreadMessage { |
||||
HIGH_PRIORITY_THREAD_MESSAGE_DUMMY |
||||
}; |
||||
|
||||
void initHighPriorityMessageQueue(); |
||||
void startHighPriorityThread(); |
||||
bool isHighPriorityThread(); |
||||
void sendMessageToHighPriorityThread(HighPriorityThreadMessage messageType, uint32_t messageParam = 0, uint32_t timeoutMillisec = osWaitForever); |
||||
|
||||
enum LowPriorityThreadMessage { |
||||
LOW_PRIORITY_THREAD_MESSAGE_DUMMY |
||||
}; |
||||
|
||||
void initLowPriorityMessageQueue(); |
||||
void startLowPriorityThread(); |
||||
bool isLowPriorityThread(); |
||||
void sendMessageToLowPriorityThread(LowPriorityThreadMessage messageType, uint32_t messageParam = 0, uint32_t timeoutMillisec = osWaitForever); |
||||
|
||||
} // namespace eez
|
@ -0,0 +1,240 @@
|
||||
{ |
||||
"settings": { |
||||
"general": { |
||||
"projectVersion": "v3", |
||||
"projectType": "dashboard", |
||||
"imports": [] |
||||
}, |
||||
"build": { |
||||
"configurations": [ |
||||
{ |
||||
"name": "Default" |
||||
} |
||||
], |
||||
"files": [] |
||||
} |
||||
}, |
||||
"variables": { |
||||
"globalVariables": [], |
||||
"structures": [], |
||||
"enums": [] |
||||
}, |
||||
"actions": [], |
||||
"pages": [ |
||||
{ |
||||
"components": [ |
||||
{ |
||||
"type": "Select", |
||||
"left": 0, |
||||
"top": 0, |
||||
"width": 800, |
||||
"height": 450, |
||||
"wireID": "8d0a425b-2e66-486e-ca7e-7c40e73f1d49", |
||||
"customInputs": [], |
||||
"customOutputs": [], |
||||
"data": "sel", |
||||
"style": { |
||||
"inheritFrom": "default" |
||||
}, |
||||
"timeline": [], |
||||
"widgets": [ |
||||
{ |
||||
"type": "TextWidget", |
||||
"left": 0, |
||||
"top": 0, |
||||
"width": 800, |
||||
"height": 450, |
||||
"wireID": "ea7eb013-6c4a-4647-ff9f-0f2f5df1d137", |
||||
"customInputs": [], |
||||
"customOutputs": [], |
||||
"data": "\"Hello, world!\"", |
||||
"style": { |
||||
"inheritFrom": "default", |
||||
"backgroundColor": "#e8b62b" |
||||
}, |
||||
"timeline": [] |
||||
}, |
||||
{ |
||||
"type": "TextWidget", |
||||
"left": 0, |
||||
"top": 0, |
||||
"width": 800, |
||||
"height": 450, |
||||
"wireID": "add37a1a-c222-4dff-c507-0a336afed2ad", |
||||
"customInputs": [], |
||||
"customOutputs": [], |
||||
"data": "\"Test\"", |
||||
"style": { |
||||
"inheritFrom": "default", |
||||
"backgroundColor": "#3416dc" |
||||
}, |
||||
"timeline": [] |
||||
} |
||||
] |
||||
}, |
||||
{ |
||||
"type": "StartActionComponent", |
||||
"left": -33, |
||||
"top": -184, |
||||
"width": 87, |
||||
"height": 25, |
||||
"wireID": "daf60711-0bd9-4269-bdf9-2bd9b89f10e8", |
||||
"customInputs": [], |
||||
"customOutputs": [] |
||||
}, |
||||
{ |
||||
"type": "EvalJSExprActionComponent", |
||||
"left": 245, |
||||
"top": -184, |
||||
"width": 302, |
||||
"height": 55, |
||||
"wireID": "bf57d0c4-f7e1-4d83-f68f-17af77959771", |
||||
"customInputs": [ |
||||
{ |
||||
"name": "counter", |
||||
"type": "integer" |
||||
} |
||||
], |
||||
"customOutputs": [ |
||||
{ |
||||
"name": "result", |
||||
"type": "array:string" |
||||
} |
||||
], |
||||
"expression": "{counter}.toString().split(\"5\")" |
||||
}, |
||||
{ |
||||
"type": "ConstantActionComponent", |
||||
"left": 44, |
||||
"top": -129, |
||||
"width": 87, |
||||
"height": 54, |
||||
"wireID": "25671a50-e557-4672-b10b-ff70667d5450", |
||||
"customInputs": [], |
||||
"customOutputs": [], |
||||
"value": "123456789" |
||||
}, |
||||
{ |
||||
"type": "LogActionComponent", |
||||
"left": 598, |
||||
"top": -184, |
||||
"width": 87, |
||||
"height": 54, |
||||
"wireID": "9069d197-a417-4d45-d6b7-886cf761e177", |
||||
"customInputs": [ |
||||
{ |
||||
"name": "value", |
||||
"type": "array:string" |
||||
} |
||||
], |
||||
"customOutputs": [], |
||||
"value": "value" |
||||
}, |
||||
{ |
||||
"type": "SetVariableActionComponent", |
||||
"left": 167, |
||||
"top": -344, |
||||
"width": 153, |
||||
"height": 56, |
||||
"wireID": "8e496378-60e3-4827-b8c3-63429cc80c15", |
||||
"customInputs": [], |
||||
"customOutputs": [], |
||||
"entries": [ |
||||
{ |
||||
"variable": "sel", |
||||
"value": "sel ? 0 : 1" |
||||
} |
||||
] |
||||
}, |
||||
{ |
||||
"type": "DelayActionComponent", |
||||
"left": 334, |
||||
"top": -344, |
||||
"width": 87, |
||||
"height": 55, |
||||
"wireID": "dbd191a5-fd5d-42d0-fbaa-d48ce5f4f45c", |
||||
"customInputs": [], |
||||
"customOutputs": [], |
||||
"milliseconds": "1000" |
||||
} |
||||
], |
||||
"connectionLines": [ |
||||
{ |
||||
"source": "daf60711-0bd9-4269-bdf9-2bd9b89f10e8", |
||||
"output": "@seqout", |
||||
"target": "bf57d0c4-f7e1-4d83-f68f-17af77959771", |
||||
"input": "@seqin" |
||||
}, |
||||
{ |
||||
"source": "25671a50-e557-4672-b10b-ff70667d5450", |
||||
"output": "value", |
||||
"target": "bf57d0c4-f7e1-4d83-f68f-17af77959771", |
||||
"input": "counter" |
||||
}, |
||||
{ |
||||
"source": "bf57d0c4-f7e1-4d83-f68f-17af77959771", |
||||
"output": "result", |
||||
"target": "9069d197-a417-4d45-d6b7-886cf761e177", |
||||
"input": "value" |
||||
}, |
||||
{ |
||||
"source": "daf60711-0bd9-4269-bdf9-2bd9b89f10e8", |
||||
"output": "@seqout", |
||||
"target": "8e496378-60e3-4827-b8c3-63429cc80c15", |
||||
"input": "@seqin" |
||||
}, |
||||
{ |
||||
"source": "8e496378-60e3-4827-b8c3-63429cc80c15", |
||||
"output": "@seqout", |
||||
"target": "dbd191a5-fd5d-42d0-fbaa-d48ce5f4f45c", |
||||
"input": "@seqin" |
||||
}, |
||||
{ |
||||
"source": "dbd191a5-fd5d-42d0-fbaa-d48ce5f4f45c", |
||||
"output": "@seqout", |
||||
"target": "8e496378-60e3-4827-b8c3-63429cc80c15", |
||||
"input": "@seqin" |
||||
} |
||||
], |
||||
"localVariables": [ |
||||
{ |
||||
"name": "sel", |
||||
"type": "integer", |
||||
"defaultValue": "0", |
||||
"persistent": false |
||||
} |
||||
], |
||||
"name": "Main", |
||||
"style": "page", |
||||
"left": 0, |
||||
"top": 0, |
||||
"width": 800, |
||||
"height": 450, |
||||
"scaleToFit": true |
||||
} |
||||
], |
||||
"styles": [ |
||||
{ |
||||
"name": "default" |
||||
}, |
||||
{ |
||||
"name": "page", |
||||
"inheritFrom": "", |
||||
"backgroundColor": "page_color", |
||||
"css": "\n" |
||||
} |
||||
], |
||||
"colors": [ |
||||
{ |
||||
"name": "page_color" |
||||
} |
||||
], |
||||
"themes": [ |
||||
{ |
||||
"name": "default", |
||||
"colors": [ |
||||
"#f0f0f0" |
||||
] |
||||
} |
||||
] |
||||
} |
@ -0,0 +1,100 @@
|
||||
/* USER CODE BEGIN Header */ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file : usb_device.c |
||||
* @version : v1.0_Cube |
||||
* @brief : This file implements the USB Device |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* Copyright (c) 2022 STMicroelectronics. |
||||
* All rights reserved. |
||||
* |
||||
* This software is licensed under terms that can be found in the LICENSE file |
||||
* in the root directory of this software component. |
||||
* If no LICENSE file comes with this software, it is provided AS-IS. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
/* USER CODE END Header */ |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
|
||||
#include "usb_device.h" |
||||
#include "usbd_core.h" |
||||
#include "usbd_desc.h" |
||||
#include "usbd_cdc.h" |
||||
#include "usbd_cdc_if.h" |
||||
|
||||
/* USER CODE BEGIN Includes */ |
||||
|
||||
/* USER CODE END Includes */ |
||||
|
||||
/* USER CODE BEGIN PV */ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
|
||||
/* USER CODE END PV */ |
||||
|
||||
/* USER CODE BEGIN PFP */ |
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
|
||||
/* USER CODE END PFP */ |
||||
|
||||
/* USB Device Core handle declaration. */ |
||||
USBD_HandleTypeDef hUsbDeviceFS; |
||||
|
||||
/*
|
||||
* -- Insert your variables declaration here -- |
||||
*/ |
||||
/* USER CODE BEGIN 0 */ |
||||
|
||||
/* USER CODE END 0 */ |
||||
|
||||
/*
|
||||
* -- Insert your external function declaration here -- |
||||
*/ |
||||
/* USER CODE BEGIN 1 */ |
||||
|
||||
/* USER CODE END 1 */ |
||||
|
||||
/**
|
||||
* Init USB device Library, add supported class and start the library |
||||
* @retval None |
||||
*/ |
||||
void MX_USB_DEVICE_Init(void) |
||||
{ |
||||
/* USER CODE BEGIN USB_DEVICE_Init_PreTreatment */ |
||||
|
||||
/* USER CODE END USB_DEVICE_Init_PreTreatment */ |
||||
|
||||
/* Init Device Library, add supported class and start the library. */ |
||||
if (USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS) != USBD_OK) |
||||
{ |
||||
Error_Handler(); |
||||
} |
||||
if (USBD_RegisterClass(&hUsbDeviceFS, &USBD_CDC) != USBD_OK) |
||||
{ |
||||
Error_Handler(); |
||||
} |
||||
if (USBD_CDC_RegisterInterface(&hUsbDeviceFS, &USBD_Interface_fops_FS) != USBD_OK) |
||||
{ |
||||
Error_Handler(); |
||||
} |
||||
if (USBD_Start(&hUsbDeviceFS) != USBD_OK) |
||||
{ |
||||
Error_Handler(); |
||||
} |
||||
|
||||
/* USER CODE BEGIN USB_DEVICE_Init_PostTreatment */ |
||||
|
||||
/* USER CODE END USB_DEVICE_Init_PostTreatment */ |
||||
} |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
@ -0,0 +1,102 @@
|
||||
/* USER CODE BEGIN Header */ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file : usb_device.h |
||||
* @version : v1.0_Cube |
||||
* @brief : Header for usb_device.c file. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* Copyright (c) 2022 STMicroelectronics. |
||||
* All rights reserved. |
||||
* |
||||
* This software is licensed under terms that can be found in the LICENSE file |
||||
* in the root directory of this software component. |
||||
* If no LICENSE file comes with this software, it is provided AS-IS. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
/* USER CODE END Header */ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __USB_DEVICE__H__ |
||||
#define __USB_DEVICE__H__ |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm32f4xx.h" |
||||
#include "stm32f4xx_hal.h" |
||||
#include "usbd_def.h" |
||||
|
||||
/* USER CODE BEGIN INCLUDE */ |
||||
|
||||
/* USER CODE END INCLUDE */ |
||||
|
||||
/** @addtogroup USBD_OTG_DRIVER
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup USBD_DEVICE USBD_DEVICE
|
||||
* @brief Device file for Usb otg low level driver. |
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup USBD_DEVICE_Exported_Variables USBD_DEVICE_Exported_Variables
|
||||
* @brief Public variables. |
||||
* @{ |
||||
*/ |
||||
|
||||
/* Private variables ---------------------------------------------------------*/ |
||||
/* USER CODE BEGIN PV */ |
||||
|
||||
/* USER CODE END PV */ |
||||
|
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
/* USER CODE BEGIN PFP */ |
||||
|
||||
/* USER CODE END PFP */ |
||||
|
||||
/*
|
||||
* -- Insert your variables declaration here -- |
||||
*/ |
||||
/* USER CODE BEGIN VARIABLES */ |
||||
|
||||
/* USER CODE END VARIABLES */ |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBD_DEVICE_Exported_FunctionsPrototype USBD_DEVICE_Exported_FunctionsPrototype
|
||||
* @brief Declaration of public functions for Usb device. |
||||
* @{ |
||||
*/ |
||||
|
||||
/** USB Device initialization function. */ |
||||
void MX_USB_DEVICE_Init(void); |
||||
|
||||
/*
|
||||
* -- Insert functions declaration here -- |
||||
*/ |
||||
/* USER CODE BEGIN FD */ |
||||
|
||||
/* USER CODE END FD */ |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* __USB_DEVICE__H__ */ |
@ -0,0 +1,328 @@
|
||||
/* USER CODE BEGIN Header */ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file : usbd_cdc_if.c |
||||
* @version : v1.0_Cube |
||||
* @brief : Usb device for Virtual Com Port. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* Copyright (c) 2022 STMicroelectronics. |
||||
* All rights reserved. |
||||
* |
||||
* This software is licensed under terms that can be found in the LICENSE file |
||||
* in the root directory of this software component. |
||||
* If no LICENSE file comes with this software, it is provided AS-IS. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
/* USER CODE END Header */ |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbd_cdc_if.h" |
||||
|
||||
/* USER CODE BEGIN INCLUDE */ |
||||
|
||||
/* USER CODE END INCLUDE */ |
||||
|
||||
/* Private typedef -----------------------------------------------------------*/ |
||||
/* Private define ------------------------------------------------------------*/ |
||||
/* Private macro -------------------------------------------------------------*/ |
||||
|
||||
/* USER CODE BEGIN PV */ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
|
||||
/* USER CODE END PV */ |
||||
|
||||
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
||||
* @brief Usb device library. |
||||
* @{ |
||||
*/ |
||||
|
||||
/** @addtogroup USBD_CDC_IF
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup USBD_CDC_IF_Private_TypesDefinitions USBD_CDC_IF_Private_TypesDefinitions
|
||||
* @brief Private types. |
||||
* @{ |
||||
*/ |
||||
|
||||
/* USER CODE BEGIN PRIVATE_TYPES */ |
||||
|
||||
/* USER CODE END PRIVATE_TYPES */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBD_CDC_IF_Private_Defines USBD_CDC_IF_Private_Defines
|
||||
* @brief Private defines. |
||||
* @{ |
||||
*/ |
||||
|
||||
/* USER CODE BEGIN PRIVATE_DEFINES */ |
||||
/* USER CODE END PRIVATE_DEFINES */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBD_CDC_IF_Private_Macros USBD_CDC_IF_Private_Macros
|
||||
* @brief Private macros. |
||||
* @{ |
||||
*/ |
||||
|
||||
/* USER CODE BEGIN PRIVATE_MACRO */ |
||||
|
||||
/* USER CODE END PRIVATE_MACRO */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBD_CDC_IF_Private_Variables USBD_CDC_IF_Private_Variables
|
||||
* @brief Private variables. |
||||
* @{ |
||||
*/ |
||||
/* Create buffer for reception and transmission */ |
||||
/* It's up to user to redefine and/or remove those define */ |
||||
/** Received data over USB are stored in this buffer */ |
||||
uint8_t UserRxBufferFS[APP_RX_DATA_SIZE]; |
||||
|
||||
/** Data to send over USB CDC are stored in this buffer */ |
||||
uint8_t UserTxBufferFS[APP_TX_DATA_SIZE]; |
||||
|
||||
/* USER CODE BEGIN PRIVATE_VARIABLES */ |
||||
|
||||
/* USER CODE END PRIVATE_VARIABLES */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBD_CDC_IF_Exported_Variables USBD_CDC_IF_Exported_Variables
|
||||
* @brief Public variables. |
||||
* @{ |
||||
*/ |
||||
|
||||
extern USBD_HandleTypeDef hUsbDeviceFS; |
||||
|
||||
/* USER CODE BEGIN EXPORTED_VARIABLES */ |
||||
|
||||
/* USER CODE END EXPORTED_VARIABLES */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBD_CDC_IF_Private_FunctionPrototypes USBD_CDC_IF_Private_FunctionPrototypes
|
||||
* @brief Private functions declaration. |
||||
* @{ |
||||
*/ |
||||
|
||||
static int8_t CDC_Init_FS(void); |
||||
static int8_t CDC_DeInit_FS(void); |
||||
static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length); |
||||
static int8_t CDC_Receive_FS(uint8_t* pbuf, uint32_t *Len); |
||||
static int8_t CDC_TransmitCplt_FS(uint8_t *pbuf, uint32_t *Len, uint8_t epnum); |
||||
|
||||
/* USER CODE BEGIN PRIVATE_FUNCTIONS_DECLARATION */ |
||||
|
||||
/* USER CODE END PRIVATE_FUNCTIONS_DECLARATION */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
USBD_CDC_ItfTypeDef USBD_Interface_fops_FS = |
||||
{ |
||||
CDC_Init_FS, |
||||
CDC_DeInit_FS, |
||||
CDC_Control_FS, |
||||
CDC_Receive_FS, |
||||
CDC_TransmitCplt_FS |
||||
}; |
||||
|
||||
/* Private functions ---------------------------------------------------------*/ |
||||
/**
|
||||
* @brief Initializes the CDC media low layer over the FS USB IP |
||||
* @retval USBD_OK if all operations are OK else USBD_FAIL |
||||
*/ |
||||
static int8_t CDC_Init_FS(void) |
||||
{ |
||||
/* USER CODE BEGIN 3 */ |
||||
/* Set Application Buffers */ |
||||
USBD_CDC_SetTxBuffer(&hUsbDeviceFS, UserTxBufferFS, 0); |
||||
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, UserRxBufferFS); |
||||
return (USBD_OK); |
||||
/* USER CODE END 3 */ |
||||
} |
||||
|
||||
/**
|
||||
* @brief DeInitializes the CDC media low layer |
||||
* @retval USBD_OK if all operations are OK else USBD_FAIL |
||||
*/ |
||||
static int8_t CDC_DeInit_FS(void) |
||||
{ |
||||
/* USER CODE BEGIN 4 */ |
||||
return (USBD_OK); |
||||
/* USER CODE END 4 */ |
||||
} |
||||
|
||||
/**
|
||||
* @brief Manage the CDC class requests |
||||
* @param cmd: Command code |
||||
* @param pbuf: Buffer containing command data (request parameters) |
||||
* @param length: Number of data to be sent (in bytes) |
||||
* @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL |
||||
*/ |
||||
static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length) |
||||
{ |
||||
/* USER CODE BEGIN 5 */ |
||||
switch(cmd) |
||||
{ |
||||
case CDC_SEND_ENCAPSULATED_COMMAND: |
||||
|
||||
break; |
||||
|
||||
case CDC_GET_ENCAPSULATED_RESPONSE: |
||||
|
||||
break; |
||||
|
||||
case CDC_SET_COMM_FEATURE: |
||||
|
||||
break; |
||||
|
||||
case CDC_GET_COMM_FEATURE: |
||||
|
||||
break; |
||||
|
||||
case CDC_CLEAR_COMM_FEATURE: |
||||
|
||||
break; |
||||
|
||||
/*******************************************************************************/ |
||||
/* Line Coding Structure */ |
||||
/*-----------------------------------------------------------------------------*/ |
||||
/* Offset | Field | Size | Value | Description */ |
||||
/* 0 | dwDTERate | 4 | Number |Data terminal rate, in bits per second*/ |
||||
/* 4 | bCharFormat | 1 | Number | Stop bits */ |
||||
/* 0 - 1 Stop bit */ |
||||
/* 1 - 1.5 Stop bits */ |
||||
/* 2 - 2 Stop bits */ |
||||
/* 5 | bParityType | 1 | Number | Parity */ |
||||
/* 0 - None */ |
||||
/* 1 - Odd */ |
||||
/* 2 - Even */ |
||||
/* 3 - Mark */ |
||||
/* 4 - Space */ |
||||
/* 6 | bDataBits | 1 | Number Data bits (5, 6, 7, 8 or 16). */ |
||||
/*******************************************************************************/ |
||||
case CDC_SET_LINE_CODING: |
||||
|
||||
break; |
||||
|
||||
case CDC_GET_LINE_CODING: |
||||
|
||||
break; |
||||
|
||||
case CDC_SET_CONTROL_LINE_STATE: |
||||
|
||||
break; |
||||
|
||||
case CDC_SEND_BREAK: |
||||
|
||||
break; |
||||
|
||||
default: |
||||
break; |
||||
} |
||||
|
||||
return (USBD_OK); |
||||
/* USER CODE END 5 */ |
||||
} |
||||
|
||||
/**
|
||||
* @brief Data received over USB OUT endpoint are sent over CDC interface |
||||
* through this function. |
||||
* |
||||
* @note |
||||
* This function will issue a NAK packet on any OUT packet received on |
||||
* USB endpoint until 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 operation: USBD_OK if all operations are OK else USBD_FAIL |
||||
*/ |
||||
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len) |
||||
{ |
||||
/* USER CODE BEGIN 6 */ |
||||
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]); |
||||
USBD_CDC_ReceivePacket(&hUsbDeviceFS); |
||||
return (USBD_OK); |
||||
/* USER CODE END 6 */ |
||||
} |
||||
|
||||
/**
|
||||
* @brief CDC_Transmit_FS |
||||
* Data to send over USB IN endpoint are sent over CDC interface |
||||
* through this function. |
||||
* @note |
||||
* |
||||
* |
||||
* @param Buf: Buffer of data to be sent |
||||
* @param Len: Number of data to be sent (in bytes) |
||||
* @retval USBD_OK if all operations are OK else USBD_FAIL or USBD_BUSY |
||||
*/ |
||||
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len) |
||||
{ |
||||
uint8_t result = USBD_OK; |
||||
/* USER CODE BEGIN 7 */ |
||||
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData; |
||||
if (hcdc->TxState != 0){ |
||||
return USBD_BUSY; |
||||
} |
||||
USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len); |
||||
result = USBD_CDC_TransmitPacket(&hUsbDeviceFS); |
||||
/* USER CODE END 7 */ |
||||
return result; |
||||
} |
||||
|
||||
/**
|
||||
* @brief CDC_TransmitCplt_FS |
||||
* Data transmitted callback |
||||
* |
||||
* @note |
||||
* This function is IN transfer complete callback used to inform user that |
||||
* the submitted Data is successfully sent over USB. |
||||
* |
||||
* @param Buf: Buffer of data to be received |
||||
* @param Len: Number of data received (in bytes) |
||||
* @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL |
||||
*/ |
||||
static int8_t CDC_TransmitCplt_FS(uint8_t *Buf, uint32_t *Len, uint8_t epnum) |
||||
{ |
||||
uint8_t result = USBD_OK; |
||||
/* USER CODE BEGIN 13 */ |
||||
UNUSED(Buf); |
||||
UNUSED(Len); |
||||
UNUSED(epnum); |
||||
/* USER CODE END 13 */ |
||||
return result; |
||||
} |
||||
|
||||
/* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION */ |
||||
|
||||
/* USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
@ -0,0 +1,131 @@
|
||||
/* USER CODE BEGIN Header */ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file : usbd_cdc_if.h |
||||
* @version : v1.0_Cube |
||||
* @brief : Header for usbd_cdc_if.c file. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* Copyright (c) 2022 STMicroelectronics. |
||||
* All rights reserved. |
||||
* |
||||
* This software is licensed under terms that can be found in the LICENSE file |
||||
* in the root directory of this software component. |
||||
* If no LICENSE file comes with this software, it is provided AS-IS. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
/* USER CODE END Header */ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __USBD_CDC_IF_H__ |
||||
#define __USBD_CDC_IF_H__ |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbd_cdc.h" |
||||
|
||||
/* USER CODE BEGIN INCLUDE */ |
||||
|
||||
/* USER CODE END INCLUDE */ |
||||
|
||||
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
||||
* @brief For Usb device. |
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup USBD_CDC_IF USBD_CDC_IF
|
||||
* @brief Usb VCP device module |
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup USBD_CDC_IF_Exported_Defines USBD_CDC_IF_Exported_Defines
|
||||
* @brief Defines. |
||||
* @{ |
||||
*/ |
||||
/* Define size for the receive and transmit buffer over CDC */ |
||||
#define APP_RX_DATA_SIZE 2048 |
||||
#define APP_TX_DATA_SIZE 2048 |
||||
/* USER CODE BEGIN EXPORTED_DEFINES */ |
||||
|
||||
/* USER CODE END EXPORTED_DEFINES */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBD_CDC_IF_Exported_Types USBD_CDC_IF_Exported_Types
|
||||
* @brief Types. |
||||
* @{ |
||||
*/ |
||||
|
||||
/* USER CODE BEGIN EXPORTED_TYPES */ |
||||
|
||||
/* USER CODE END EXPORTED_TYPES */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBD_CDC_IF_Exported_Macros USBD_CDC_IF_Exported_Macros
|
||||
* @brief Aliases. |
||||
* @{ |
||||
*/ |
||||
|
||||
/* USER CODE BEGIN EXPORTED_MACRO */ |
||||
|
||||
/* USER CODE END EXPORTED_MACRO */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBD_CDC_IF_Exported_Variables USBD_CDC_IF_Exported_Variables
|
||||
* @brief Public variables. |
||||
* @{ |
||||
*/ |
||||
|
||||
/** CDC Interface callback. */ |
||||
extern USBD_CDC_ItfTypeDef USBD_Interface_fops_FS; |
||||
|
||||
/* USER CODE BEGIN EXPORTED_VARIABLES */ |
||||
|
||||
/* USER CODE END EXPORTED_VARIABLES */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBD_CDC_IF_Exported_FunctionsPrototype USBD_CDC_IF_Exported_FunctionsPrototype
|
||||
* @brief Public functions declaration. |
||||
* @{ |
||||
*/ |
||||
|
||||
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len); |
||||
|
||||
/* USER CODE BEGIN EXPORTED_FUNCTIONS */ |
||||
|
||||
/* USER CODE END EXPORTED_FUNCTIONS */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* __USBD_CDC_IF_H__ */ |
||||
|
@ -0,0 +1,443 @@
|
||||
/* USER CODE BEGIN Header */ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file : App/usbd_desc.c |
||||
* @version : v1.0_Cube |
||||
* @brief : This file implements the USB device descriptors. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* Copyright (c) 2022 STMicroelectronics. |
||||
* All rights reserved. |
||||
* |
||||
* This software is licensed under terms that can be found in the LICENSE file |
||||
* in the root directory of this software component. |
||||
* If no LICENSE file comes with this software, it is provided AS-IS. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
/* USER CODE END Header */ |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbd_core.h" |
||||
#include "usbd_desc.h" |
||||
#include "usbd_conf.h" |
||||
|
||||
/* USER CODE BEGIN INCLUDE */ |
||||
|
||||
/* USER CODE END INCLUDE */ |
||||
|
||||
/* Private typedef -----------------------------------------------------------*/ |
||||
/* Private define ------------------------------------------------------------*/ |
||||
/* Private macro -------------------------------------------------------------*/ |
||||
|
||||
/* USER CODE BEGIN PV */ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
|
||||
/* USER CODE END PV */ |
||||
|
||||
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @addtogroup USBD_DESC
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup USBD_DESC_Private_TypesDefinitions USBD_DESC_Private_TypesDefinitions
|
||||
* @brief Private types. |
||||
* @{ |
||||
*/ |
||||
|
||||
/* USER CODE BEGIN PRIVATE_TYPES */ |
||||
|
||||
/* USER CODE END PRIVATE_TYPES */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBD_DESC_Private_Defines USBD_DESC_Private_Defines
|
||||
* @brief Private defines. |
||||
* @{ |
||||
*/ |
||||
|
||||
#define USBD_VID 1155 |
||||
#define USBD_LANGID_STRING 1033 |
||||
#define USBD_MANUFACTURER_STRING "STMicroelectronics" |
||||
#define USBD_PID_FS 22336 |
||||
#define USBD_PRODUCT_STRING_FS "STM32 Virtual ComPort" |
||||
#define USBD_CONFIGURATION_STRING_FS "CDC Config" |
||||
#define USBD_INTERFACE_STRING_FS "CDC Interface" |
||||
|
||||
#define USB_SIZ_BOS_DESC 0x0C |
||||
|
||||
/* USER CODE BEGIN PRIVATE_DEFINES */ |
||||
|
||||
/* USER CODE END PRIVATE_DEFINES */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* USER CODE BEGIN 0 */ |
||||
|
||||
/* USER CODE END 0 */ |
||||
|
||||
/** @defgroup USBD_DESC_Private_Macros USBD_DESC_Private_Macros
|
||||
* @brief Private macros. |
||||
* @{ |
||||
*/ |
||||
|
||||
/* USER CODE BEGIN PRIVATE_MACRO */ |
||||
|
||||
/* USER CODE END PRIVATE_MACRO */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBD_DESC_Private_FunctionPrototypes USBD_DESC_Private_FunctionPrototypes
|
||||
* @brief Private functions declaration. |
||||
* @{ |
||||
*/ |
||||
|
||||
static void Get_SerialNum(void); |
||||
static void IntToUnicode(uint32_t value, uint8_t * pbuf, uint8_t len); |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBD_DESC_Private_FunctionPrototypes USBD_DESC_Private_FunctionPrototypes
|
||||
* @brief Private functions declaration for FS. |
||||
* @{ |
||||
*/ |
||||
|
||||
uint8_t * USBD_FS_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); |
||||
uint8_t * USBD_FS_LangIDStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); |
||||
uint8_t * USBD_FS_ManufacturerStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); |
||||
uint8_t * USBD_FS_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); |
||||
uint8_t * USBD_FS_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); |
||||
uint8_t * USBD_FS_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); |
||||
uint8_t * USBD_FS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); |
||||
#if (USBD_LPM_ENABLED == 1) |
||||
uint8_t * USBD_FS_USR_BOSDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); |
||||
#endif /* (USBD_LPM_ENABLED == 1) */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBD_DESC_Private_Variables USBD_DESC_Private_Variables
|
||||
* @brief Private variables. |
||||
* @{ |
||||
*/ |
||||
|
||||
USBD_DescriptorsTypeDef FS_Desc = |
||||
{ |
||||
USBD_FS_DeviceDescriptor |
||||
, USBD_FS_LangIDStrDescriptor |
||||
, USBD_FS_ManufacturerStrDescriptor |
||||
, USBD_FS_ProductStrDescriptor |
||||
, USBD_FS_SerialStrDescriptor |
||||
, USBD_FS_ConfigStrDescriptor |
||||
, USBD_FS_InterfaceStrDescriptor |
||||
#if (USBD_LPM_ENABLED == 1) |
||||
, USBD_FS_USR_BOSDescriptor |
||||
#endif /* (USBD_LPM_ENABLED == 1) */ |
||||
}; |
||||
|
||||
#if defined ( __ICCARM__ ) /* IAR Compiler */ |
||||
#pragma data_alignment=4 |
||||
#endif /* defined ( __ICCARM__ ) */ |
||||
/** USB standard device descriptor. */ |
||||
__ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END = |
||||
{ |
||||
0x12, /*bLength */ |
||||
USB_DESC_TYPE_DEVICE, /*bDescriptorType*/ |
||||
#if (USBD_LPM_ENABLED == 1) |
||||
0x01, /*bcdUSB */ /* changed to USB version 2.01
|
||||
in order to support LPM L1 suspend |
||||
resume test of USBCV3.0*/ |
||||
#else |
||||
0x00, /*bcdUSB */ |
||||
#endif /* (USBD_LPM_ENABLED == 1) */ |
||||
0x02, |
||||
0x02, /*bDeviceClass*/ |
||||
0x02, /*bDeviceSubClass*/ |
||||
0x00, /*bDeviceProtocol*/ |
||||
USB_MAX_EP0_SIZE, /*bMaxPacketSize*/ |
||||
LOBYTE(USBD_VID), /*idVendor*/ |
||||
HIBYTE(USBD_VID), /*idVendor*/ |
||||
LOBYTE(USBD_PID_FS), /*idProduct*/ |
||||
HIBYTE(USBD_PID_FS), /*idProduct*/ |
||||
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_MAX_NUM_CONFIGURATION /*bNumConfigurations*/ |
||||
}; |
||||
|
||||
/* USB_DeviceDescriptor */ |
||||
/** BOS descriptor. */ |
||||
#if (USBD_LPM_ENABLED == 1) |
||||
#if defined ( __ICCARM__ ) /* IAR Compiler */ |
||||
#pragma data_alignment=4 |
||||
#endif /* defined ( __ICCARM__ ) */ |
||||
__ALIGN_BEGIN uint8_t USBD_FS_BOSDesc[USB_SIZ_BOS_DESC] __ALIGN_END = |
||||
{ |
||||
0x5, |
||||
USB_DESC_TYPE_BOS, |
||||
0xC, |
||||
0x0, |
||||
0x1, /* 1 device capability*/ |
||||
/* device capability*/ |
||||
0x7, |
||||
USB_DEVICE_CAPABITY_TYPE, |
||||
0x2, |
||||
0x2, /* LPM capability bit set*/ |
||||
0x0, |
||||
0x0, |
||||
0x0 |
||||
}; |
||||
#endif /* (USBD_LPM_ENABLED == 1) */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBD_DESC_Private_Variables USBD_DESC_Private_Variables
|
||||
* @brief Private variables. |
||||
* @{ |
||||
*/ |
||||
|
||||
#if defined ( __ICCARM__ ) /* IAR Compiler */ |
||||
#pragma data_alignment=4 |
||||
#endif /* defined ( __ICCARM__ ) */ |
||||
|
||||
/** USB lang identifier descriptor. */ |
||||
__ALIGN_BEGIN uint8_t USBD_LangIDDesc[USB_LEN_LANGID_STR_DESC] __ALIGN_END = |
||||
{ |
||||
USB_LEN_LANGID_STR_DESC, |
||||
USB_DESC_TYPE_STRING, |
||||
LOBYTE(USBD_LANGID_STRING), |
||||
HIBYTE(USBD_LANGID_STRING) |
||||
}; |
||||
|
||||
#if defined ( __ICCARM__ ) /* IAR Compiler */ |
||||
#pragma data_alignment=4 |
||||
#endif /* defined ( __ICCARM__ ) */ |
||||
/* Internal string descriptor. */ |
||||
__ALIGN_BEGIN uint8_t USBD_StrDesc[USBD_MAX_STR_DESC_SIZ] __ALIGN_END; |
||||
|
||||
#if defined ( __ICCARM__ ) /*!< IAR Compiler */ |
||||
#pragma data_alignment=4 |
||||
#endif |
||||
__ALIGN_BEGIN uint8_t USBD_StringSerial[USB_SIZ_STRING_SERIAL] __ALIGN_END = { |
||||
USB_SIZ_STRING_SERIAL, |
||||
USB_DESC_TYPE_STRING, |
||||
}; |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBD_DESC_Private_Functions USBD_DESC_Private_Functions
|
||||
* @brief Private functions. |
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Return the device descriptor |
||||
* @param speed : Current device speed |
||||
* @param length : Pointer to data length variable |
||||
* @retval Pointer to descriptor buffer |
||||
*/ |
||||
uint8_t * USBD_FS_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) |
||||
{ |
||||
UNUSED(speed); |
||||
*length = sizeof(USBD_FS_DeviceDesc); |
||||
return USBD_FS_DeviceDesc; |
||||
} |
||||
|
||||
/**
|
||||
* @brief 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_FS_LangIDStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) |
||||
{ |
||||
UNUSED(speed); |
||||
*length = sizeof(USBD_LangIDDesc); |
||||
return USBD_LangIDDesc; |
||||
} |
||||
|
||||
/**
|
||||
* @brief 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_FS_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) |
||||
{ |
||||
if(speed == 0) |
||||
{ |
||||
USBD_GetString((uint8_t *)USBD_PRODUCT_STRING_FS, USBD_StrDesc, length); |
||||
} |
||||
else |
||||
{ |
||||
USBD_GetString((uint8_t *)USBD_PRODUCT_STRING_FS, USBD_StrDesc, length); |
||||
} |
||||
return USBD_StrDesc; |
||||
} |
||||
|
||||
/**
|
||||
* @brief 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_FS_ManufacturerStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) |
||||
{ |
||||
UNUSED(speed); |
||||
USBD_GetString((uint8_t *)USBD_MANUFACTURER_STRING, USBD_StrDesc, length); |
||||
return USBD_StrDesc; |
||||
} |
||||
|
||||
/**
|
||||
* @brief 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_FS_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) |
||||
{ |
||||
UNUSED(speed); |
||||
*length = USB_SIZ_STRING_SERIAL; |
||||
|
||||
/* Update the serial number string descriptor with the data from the unique
|
||||
* ID */ |
||||
Get_SerialNum(); |
||||
/* USER CODE BEGIN USBD_FS_SerialStrDescriptor */ |
||||
|
||||
/* USER CODE END USBD_FS_SerialStrDescriptor */ |
||||
return (uint8_t *) USBD_StringSerial; |
||||
} |
||||
|
||||
/**
|
||||
* @brief 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_FS_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) |
||||
{ |
||||
if(speed == USBD_SPEED_HIGH) |
||||
{ |
||||
USBD_GetString((uint8_t *)USBD_CONFIGURATION_STRING_FS, USBD_StrDesc, length); |
||||
} |
||||
else |
||||
{ |
||||
USBD_GetString((uint8_t *)USBD_CONFIGURATION_STRING_FS, USBD_StrDesc, length); |
||||
} |
||||
return USBD_StrDesc; |
||||
} |
||||
|
||||
/**
|
||||
* @brief 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_FS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) |
||||
{ |
||||
if(speed == 0) |
||||
{ |
||||
USBD_GetString((uint8_t *)USBD_INTERFACE_STRING_FS, USBD_StrDesc, length); |
||||
} |
||||
else |
||||
{ |
||||
USBD_GetString((uint8_t *)USBD_INTERFACE_STRING_FS, USBD_StrDesc, length); |
||||
} |
||||
return USBD_StrDesc; |
||||
} |
||||
|
||||
#if (USBD_LPM_ENABLED == 1) |
||||
/**
|
||||
* @brief Return the BOS descriptor |
||||
* @param speed : Current device speed |
||||
* @param length : Pointer to data length variable |
||||
* @retval Pointer to descriptor buffer |
||||
*/ |
||||
uint8_t * USBD_FS_USR_BOSDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) |
||||
{ |
||||
UNUSED(speed); |
||||
*length = sizeof(USBD_FS_BOSDesc); |
||||
return (uint8_t*)USBD_FS_BOSDesc; |
||||
} |
||||
#endif /* (USBD_LPM_ENABLED == 1) */ |
||||
|
||||
/**
|
||||
* @brief Create the serial number string descriptor |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
static void Get_SerialNum(void) |
||||
{ |
||||
uint32_t deviceserial0, deviceserial1, deviceserial2; |
||||
|
||||
deviceserial0 = *(uint32_t *) DEVICE_ID1; |
||||
deviceserial1 = *(uint32_t *) DEVICE_ID2; |
||||
deviceserial2 = *(uint32_t *) DEVICE_ID3; |
||||
|
||||
deviceserial0 += deviceserial2; |
||||
|
||||
if (deviceserial0 != 0) |
||||
{ |
||||
IntToUnicode(deviceserial0, &USBD_StringSerial[2], 8); |
||||
IntToUnicode(deviceserial1, &USBD_StringSerial[18], 4); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Convert Hex 32Bits value into char |
||||
* @param value: value to convert |
||||
* @param pbuf: pointer to the buffer |
||||
* @param len: buffer length |
||||
* @retval None |
||||
*/ |
||||
static void IntToUnicode(uint32_t value, uint8_t * pbuf, uint8_t len) |
||||
{ |
||||
uint8_t idx = 0; |
||||
|
||||
for (idx = 0; idx < len; idx++) |
||||
{ |
||||
if (((value >> 28)) < 0xA) |
||||
{ |
||||
pbuf[2 * idx] = (value >> 28) + '0'; |
||||
} |
||||
else |
||||
{ |
||||
pbuf[2 * idx] = (value >> 28) + 'A' - 10; |
||||
} |
||||
|
||||
value = value << 4; |
||||
|
||||
pbuf[2 * idx + 1] = 0; |
||||
} |
||||
} |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
@ -0,0 +1,143 @@
|
||||
/* USER CODE BEGIN Header */ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file : usbd_desc.c |
||||
* @version : v1.0_Cube |
||||
* @brief : Header for usbd_conf.c file. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* Copyright (c) 2022 STMicroelectronics. |
||||
* All rights reserved. |
||||
* |
||||
* This software is licensed under terms that can be found in the LICENSE file |
||||
* in the root directory of this software component. |
||||
* If no LICENSE file comes with this software, it is provided AS-IS. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
/* USER CODE END Header */ |
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __USBD_DESC__C__ |
||||
#define __USBD_DESC__C__ |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbd_def.h" |
||||
|
||||
/* USER CODE BEGIN INCLUDE */ |
||||
|
||||
/* USER CODE END INCLUDE */ |
||||
|
||||
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup USBD_DESC USBD_DESC
|
||||
* @brief Usb device descriptors module. |
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup USBD_DESC_Exported_Constants USBD_DESC_Exported_Constants
|
||||
* @brief Constants. |
||||
* @{ |
||||
*/ |
||||
#define DEVICE_ID1 (UID_BASE) |
||||
#define DEVICE_ID2 (UID_BASE + 0x4) |
||||
#define DEVICE_ID3 (UID_BASE + 0x8) |
||||
|
||||
#define USB_SIZ_STRING_SERIAL 0x1A |
||||
|
||||
/* USER CODE BEGIN EXPORTED_CONSTANTS */ |
||||
|
||||
/* USER CODE END EXPORTED_CONSTANTS */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBD_DESC_Exported_Defines USBD_DESC_Exported_Defines
|
||||
* @brief Defines. |
||||
* @{ |
||||
*/ |
||||
|
||||
/* USER CODE BEGIN EXPORTED_DEFINES */ |
||||
|
||||
/* USER CODE END EXPORTED_DEFINES */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBD_DESC_Exported_TypesDefinitions USBD_DESC_Exported_TypesDefinitions
|
||||
* @brief Types. |
||||
* @{ |
||||
*/ |
||||
|
||||
/* USER CODE BEGIN EXPORTED_TYPES */ |
||||
|
||||
/* USER CODE END EXPORTED_TYPES */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBD_DESC_Exported_Macros USBD_DESC_Exported_Macros
|
||||
* @brief Aliases. |
||||
* @{ |
||||
*/ |
||||
|
||||
/* USER CODE BEGIN EXPORTED_MACRO */ |
||||
|
||||
/* USER CODE END EXPORTED_MACRO */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBD_DESC_Exported_Variables USBD_DESC_Exported_Variables
|
||||
* @brief Public variables. |
||||
* @{ |
||||
*/ |
||||
|
||||
/** Descriptor for the Usb device. */ |
||||
extern USBD_DescriptorsTypeDef FS_Desc; |
||||
|
||||
/* USER CODE BEGIN EXPORTED_VARIABLES */ |
||||
|
||||
/* USER CODE END EXPORTED_VARIABLES */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBD_DESC_Exported_FunctionsPrototype USBD_DESC_Exported_FunctionsPrototype
|
||||
* @brief Public functions declaration. |
||||
* @{ |
||||
*/ |
||||
|
||||
/* USER CODE BEGIN EXPORTED_FUNCTIONS */ |
||||
|
||||
/* USER CODE END EXPORTED_FUNCTIONS */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* __USBD_DESC__C__ */ |
||||
|
@ -0,0 +1,724 @@
|
||||
/* USER CODE BEGIN Header */ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file : Target/usbd_conf.c |
||||
* @version : v1.0_Cube |
||||
* @brief : This file implements the board support package for the USB device library |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* Copyright (c) 2022 STMicroelectronics. |
||||
* All rights reserved. |
||||
* |
||||
* This software is licensed under terms that can be found in the LICENSE file |
||||
* in the root directory of this software component. |
||||
* If no LICENSE file comes with this software, it is provided AS-IS. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
/* USER CODE END Header */ |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm32f4xx.h" |
||||
#include "stm32f4xx_hal.h" |
||||
#include "usbd_def.h" |
||||
#include "usbd_core.h" |
||||
|
||||
#include "usbd_cdc.h" |
||||
|
||||
/* USER CODE BEGIN Includes */ |
||||
|
||||
/* USER CODE END Includes */ |
||||
|
||||
/* Private typedef -----------------------------------------------------------*/ |
||||
/* Private define ------------------------------------------------------------*/ |
||||
/* Private macro -------------------------------------------------------------*/ |
||||
|
||||
/* USER CODE BEGIN PV */ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
|
||||
/* USER CODE END PV */ |
||||
|
||||
PCD_HandleTypeDef hpcd_USB_OTG_FS; |
||||
void Error_Handler(void); |
||||
|
||||
/* External functions --------------------------------------------------------*/ |
||||
void SystemClock_Config(void); |
||||
|
||||
/* USER CODE BEGIN 0 */ |
||||
|
||||
/* USER CODE END 0 */ |
||||
|
||||
/* USER CODE BEGIN PFP */ |
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
USBD_StatusTypeDef USBD_Get_USB_Status(HAL_StatusTypeDef hal_status); |
||||
|
||||
/* USER CODE END PFP */ |
||||
|
||||
/* Private functions ---------------------------------------------------------*/ |
||||
|
||||
/* USER CODE BEGIN 1 */ |
||||
|
||||
/* USER CODE END 1 */ |
||||
|
||||
/*******************************************************************************
|
||||
LL Driver Callbacks (PCD -> USB Device Library) |
||||
*******************************************************************************/ |
||||
/* MSP Init */ |
||||
|
||||
void HAL_PCD_MspInit(PCD_HandleTypeDef* pcdHandle) |
||||
{ |
||||
GPIO_InitTypeDef GPIO_InitStruct = {0}; |
||||
if(pcdHandle->Instance==USB_OTG_FS) |
||||
{ |
||||
/* USER CODE BEGIN USB_OTG_FS_MspInit 0 */ |
||||
|
||||
/* USER CODE END USB_OTG_FS_MspInit 0 */ |
||||
|
||||
__HAL_RCC_GPIOA_CLK_ENABLE(); |
||||
/**USB_OTG_FS GPIO Configuration
|
||||
PA12 ------> USB_OTG_FS_DP |
||||
PA11 ------> USB_OTG_FS_DM |
||||
PA10 ------> USB_OTG_FS_ID |
||||
PA9 ------> USB_OTG_FS_VBUS |
||||
*/ |
||||
GPIO_InitStruct.Pin = USB_FS1_P_Pin|USB_FS1_N_Pin|USB_FS1_ID_Pin; |
||||
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; |
||||
GPIO_InitStruct.Pull = GPIO_NOPULL; |
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; |
||||
GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS; |
||||
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); |
||||
|
||||
GPIO_InitStruct.Pin = VBUS_FS1_Pin; |
||||
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; |
||||
GPIO_InitStruct.Pull = GPIO_NOPULL; |
||||
HAL_GPIO_Init(VBUS_FS1_GPIO_Port, &GPIO_InitStruct); |
||||
|
||||
/* Peripheral clock enable */ |
||||
__HAL_RCC_USB_OTG_FS_CLK_ENABLE(); |
||||
|
||||
/* Peripheral interrupt init */ |
||||
HAL_NVIC_SetPriority(OTG_FS_IRQn, 5, 0); |
||||
HAL_NVIC_EnableIRQ(OTG_FS_IRQn); |
||||
/* USER CODE BEGIN USB_OTG_FS_MspInit 1 */ |
||||
|
||||
/* USER CODE END USB_OTG_FS_MspInit 1 */ |
||||
} |
||||
} |
||||
|
||||
void HAL_PCD_MspDeInit(PCD_HandleTypeDef* pcdHandle) |
||||
{ |
||||
if(pcdHandle->Instance==USB_OTG_FS) |
||||
{ |
||||
/* USER CODE BEGIN USB_OTG_FS_MspDeInit 0 */ |
||||
|
||||
/* USER CODE END USB_OTG_FS_MspDeInit 0 */ |
||||
/* Peripheral clock disable */ |
||||
__HAL_RCC_USB_OTG_FS_CLK_DISABLE(); |
||||
|
||||
/**USB_OTG_FS GPIO Configuration
|
||||
PA12 ------> USB_OTG_FS_DP |
||||
PA11 ------> USB_OTG_FS_DM |
||||
PA10 ------> USB_OTG_FS_ID |
||||
PA9 ------> USB_OTG_FS_VBUS |
||||
*/ |
||||
HAL_GPIO_DeInit(GPIOA, USB_FS1_P_Pin|USB_FS1_N_Pin|USB_FS1_ID_Pin|VBUS_FS1_Pin); |
||||
|
||||
/* Peripheral interrupt Deinit*/ |
||||
HAL_NVIC_DisableIRQ(OTG_FS_IRQn); |
||||
|
||||
/* USER CODE BEGIN USB_OTG_FS_MspDeInit 1 */ |
||||
|
||||
/* USER CODE END USB_OTG_FS_MspDeInit 1 */ |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Setup stage callback |
||||
* @param hpcd: PCD handle |
||||
* @retval None |
||||
*/ |
||||
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) |
||||
static void PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd) |
||||
#else |
||||
void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd) |
||||
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ |
||||
{ |
||||
USBD_LL_SetupStage((USBD_HandleTypeDef*)hpcd->pData, (uint8_t *)hpcd->Setup); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Data Out stage callback. |
||||
* @param hpcd: PCD handle |
||||
* @param epnum: Endpoint number |
||||
* @retval None |
||||
*/ |
||||
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) |
||||
static void PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) |
||||
#else |
||||
void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) |
||||
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ |
||||
{ |
||||
USBD_LL_DataOutStage((USBD_HandleTypeDef*)hpcd->pData, epnum, hpcd->OUT_ep[epnum].xfer_buff); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Data In stage callback. |
||||
* @param hpcd: PCD handle |
||||
* @param epnum: Endpoint number |
||||
* @retval None |
||||
*/ |
||||
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) |
||||
static void PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) |
||||
#else |
||||
void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) |
||||
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ |
||||
{ |
||||
USBD_LL_DataInStage((USBD_HandleTypeDef*)hpcd->pData, epnum, hpcd->IN_ep[epnum].xfer_buff); |
||||
} |
||||
|
||||
/**
|
||||
* @brief SOF callback. |
||||
* @param hpcd: PCD handle |
||||
* @retval None |
||||
*/ |
||||
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) |
||||
static void PCD_SOFCallback(PCD_HandleTypeDef *hpcd) |
||||
#else |
||||
void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd) |
||||
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ |
||||
{ |
||||
USBD_LL_SOF((USBD_HandleTypeDef*)hpcd->pData); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Reset callback. |
||||
* @param hpcd: PCD handle |
||||
* @retval None |
||||
*/ |
||||
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) |
||||
static void PCD_ResetCallback(PCD_HandleTypeDef *hpcd) |
||||
#else |
||||
void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd) |
||||
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ |
||||
{ |
||||
USBD_SpeedTypeDef speed = USBD_SPEED_FULL; |
||||
|
||||
if ( hpcd->Init.speed == PCD_SPEED_HIGH) |
||||
{ |
||||
speed = USBD_SPEED_HIGH; |
||||
} |
||||
else if ( hpcd->Init.speed == PCD_SPEED_FULL) |
||||
{ |
||||
speed = USBD_SPEED_FULL; |
||||
} |
||||
else |
||||
{ |
||||
Error_Handler(); |
||||
} |
||||
/* Set Speed. */ |
||||
USBD_LL_SetSpeed((USBD_HandleTypeDef*)hpcd->pData, speed); |
||||
|
||||
/* Reset Device. */ |
||||
USBD_LL_Reset((USBD_HandleTypeDef*)hpcd->pData); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Suspend callback. |
||||
* When Low power mode is enabled the debug cannot be used (IAR, Keil doesn't support it) |
||||
* @param hpcd: PCD handle |
||||
* @retval None |
||||
*/ |
||||
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) |
||||
static void PCD_SuspendCallback(PCD_HandleTypeDef *hpcd) |
||||
#else |
||||
void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd) |
||||
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ |
||||
{ |
||||
/* Inform USB library that core enters in suspend Mode. */ |
||||
USBD_LL_Suspend((USBD_HandleTypeDef*)hpcd->pData); |
||||
__HAL_PCD_GATE_PHYCLOCK(hpcd); |
||||
/* Enter in STOP mode. */ |
||||
/* USER CODE BEGIN 2 */ |
||||
if (hpcd->Init.low_power_enable) |
||||
{ |
||||
/* Set SLEEPDEEP bit and SleepOnExit of Cortex System Control Register. */ |
||||
SCB->SCR |= (uint32_t)((uint32_t)(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk)); |
||||
} |
||||
/* USER CODE END 2 */ |
||||
} |
||||
|
||||
/**
|
||||
* @brief Resume callback. |
||||
* When Low power mode is enabled the debug cannot be used (IAR, Keil doesn't support it) |
||||
* @param hpcd: PCD handle |
||||
* @retval None |
||||
*/ |
||||
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) |
||||
static void PCD_ResumeCallback(PCD_HandleTypeDef *hpcd) |
||||
#else |
||||
void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd) |
||||
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ |
||||
{ |
||||
/* USER CODE BEGIN 3 */ |
||||
|
||||
/* USER CODE END 3 */ |
||||
USBD_LL_Resume((USBD_HandleTypeDef*)hpcd->pData); |
||||
} |
||||
|
||||
/**
|
||||
* @brief ISOOUTIncomplete callback. |
||||
* @param hpcd: PCD handle |
||||
* @param epnum: Endpoint number |
||||
* @retval None |
||||
*/ |
||||
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) |
||||
static void PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) |
||||
#else |
||||
void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) |
||||
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ |
||||
{ |
||||
USBD_LL_IsoOUTIncomplete((USBD_HandleTypeDef*)hpcd->pData, epnum); |
||||
} |
||||
|
||||
/**
|
||||
* @brief ISOINIncomplete callback. |
||||
* @param hpcd: PCD handle |
||||
* @param epnum: Endpoint number |
||||
* @retval None |
||||
*/ |
||||
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) |
||||
static void PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) |
||||
#else |
||||
void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) |
||||
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ |
||||
{ |
||||
USBD_LL_IsoINIncomplete((USBD_HandleTypeDef*)hpcd->pData, epnum); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Connect callback. |
||||
* @param hpcd: PCD handle |
||||
* @retval None |
||||
*/ |
||||
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) |
||||
static void PCD_ConnectCallback(PCD_HandleTypeDef *hpcd) |
||||
#else |
||||
void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd) |
||||
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ |
||||
{ |
||||
USBD_LL_DevConnected((USBD_HandleTypeDef*)hpcd->pData); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Disconnect callback. |
||||
* @param hpcd: PCD handle |
||||
* @retval None |
||||
*/ |
||||
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) |
||||
static void PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd) |
||||
#else |
||||
void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd) |
||||
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ |
||||
{ |
||||
USBD_LL_DevDisconnected((USBD_HandleTypeDef*)hpcd->pData); |
||||
} |
||||
|
||||
/*******************************************************************************
|
||||
LL Driver Interface (USB Device Library --> PCD) |
||||
*******************************************************************************/ |
||||
|
||||
/**
|
||||
* @brief Initializes the low level portion of the device driver. |
||||
* @param pdev: Device handle |
||||
* @retval USBD status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev) |
||||
{ |
||||
/* Init USB Ip. */ |
||||
if (pdev->id == DEVICE_FS) { |
||||
/* Link the driver to the stack. */ |
||||
hpcd_USB_OTG_FS.pData = pdev; |
||||
pdev->pData = &hpcd_USB_OTG_FS; |
||||
|
||||
hpcd_USB_OTG_FS.Instance = USB_OTG_FS; |
||||
hpcd_USB_OTG_FS.Init.dev_endpoints = 6; |
||||
hpcd_USB_OTG_FS.Init.speed = PCD_SPEED_FULL; |
||||
hpcd_USB_OTG_FS.Init.dma_enable = DISABLE; |
||||
hpcd_USB_OTG_FS.Init.phy_itface = PCD_PHY_EMBEDDED; |
||||
hpcd_USB_OTG_FS.Init.Sof_enable = DISABLE; |
||||
hpcd_USB_OTG_FS.Init.low_power_enable = DISABLE; |
||||
hpcd_USB_OTG_FS.Init.lpm_enable = DISABLE; |
||||
hpcd_USB_OTG_FS.Init.vbus_sensing_enable = ENABLE; |
||||
hpcd_USB_OTG_FS.Init.use_dedicated_ep1 = DISABLE; |
||||
if (HAL_PCD_Init(&hpcd_USB_OTG_FS) != HAL_OK) |
||||
{ |
||||
Error_Handler( ); |
||||
} |
||||
|
||||
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) |
||||
/* Register USB PCD CallBacks */ |
||||
HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_SOF_CB_ID, PCD_SOFCallback); |
||||
HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_SETUPSTAGE_CB_ID, PCD_SetupStageCallback); |
||||
HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_RESET_CB_ID, PCD_ResetCallback); |
||||
HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_SUSPEND_CB_ID, PCD_SuspendCallback); |
||||
HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_RESUME_CB_ID, PCD_ResumeCallback); |
||||
HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_CONNECT_CB_ID, PCD_ConnectCallback); |
||||
HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_DISCONNECT_CB_ID, PCD_DisconnectCallback); |
||||
|
||||
HAL_PCD_RegisterDataOutStageCallback(&hpcd_USB_OTG_FS, PCD_DataOutStageCallback); |
||||
HAL_PCD_RegisterDataInStageCallback(&hpcd_USB_OTG_FS, PCD_DataInStageCallback); |
||||
HAL_PCD_RegisterIsoOutIncpltCallback(&hpcd_USB_OTG_FS, PCD_ISOOUTIncompleteCallback); |
||||
HAL_PCD_RegisterIsoInIncpltCallback(&hpcd_USB_OTG_FS, PCD_ISOINIncompleteCallback); |
||||
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ |
||||
HAL_PCDEx_SetRxFiFo(&hpcd_USB_OTG_FS, 0x80); |
||||
HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 0, 0x40); |
||||
HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 1, 0x80); |
||||
} |
||||
return USBD_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief De-Initializes the low level portion of the device driver. |
||||
* @param pdev: Device handle |
||||
* @retval USBD status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_LL_DeInit(USBD_HandleTypeDef *pdev) |
||||
{ |
||||
HAL_StatusTypeDef hal_status = HAL_OK; |
||||
USBD_StatusTypeDef usb_status = USBD_OK; |
||||
|
||||
hal_status = HAL_PCD_DeInit(pdev->pData); |
||||
|
||||
usb_status = USBD_Get_USB_Status(hal_status); |
||||
|
||||
return usb_status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Starts the low level portion of the device driver. |
||||
* @param pdev: Device handle |
||||
* @retval USBD status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_LL_Start(USBD_HandleTypeDef *pdev) |
||||
{ |
||||
HAL_StatusTypeDef hal_status = HAL_OK; |
||||
USBD_StatusTypeDef usb_status = USBD_OK; |
||||
|
||||
hal_status = HAL_PCD_Start(pdev->pData); |
||||
|
||||
usb_status = USBD_Get_USB_Status(hal_status); |
||||
|
||||
return usb_status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Stops the low level portion of the device driver. |
||||
* @param pdev: Device handle |
||||
* @retval USBD status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_LL_Stop(USBD_HandleTypeDef *pdev) |
||||
{ |
||||
HAL_StatusTypeDef hal_status = HAL_OK; |
||||
USBD_StatusTypeDef usb_status = USBD_OK; |
||||
|
||||
hal_status = HAL_PCD_Stop(pdev->pData); |
||||
|
||||
usb_status = USBD_Get_USB_Status(hal_status); |
||||
|
||||
return usb_status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Opens an endpoint of the low level driver. |
||||
* @param pdev: Device handle |
||||
* @param ep_addr: Endpoint number |
||||
* @param ep_type: Endpoint type |
||||
* @param ep_mps: Endpoint max packet size |
||||
* @retval USBD status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_LL_OpenEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t ep_type, uint16_t ep_mps) |
||||
{ |
||||
HAL_StatusTypeDef hal_status = HAL_OK; |
||||
USBD_StatusTypeDef usb_status = USBD_OK; |
||||
|
||||
hal_status = HAL_PCD_EP_Open(pdev->pData, ep_addr, ep_mps, ep_type); |
||||
|
||||
usb_status = USBD_Get_USB_Status(hal_status); |
||||
|
||||
return usb_status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Closes an endpoint of the low level driver. |
||||
* @param pdev: Device handle |
||||
* @param ep_addr: Endpoint number |
||||
* @retval USBD status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_LL_CloseEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) |
||||
{ |
||||
HAL_StatusTypeDef hal_status = HAL_OK; |
||||
USBD_StatusTypeDef usb_status = USBD_OK; |
||||
|
||||
hal_status = HAL_PCD_EP_Close(pdev->pData, ep_addr); |
||||
|
||||
usb_status = USBD_Get_USB_Status(hal_status); |
||||
|
||||
return usb_status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Flushes an endpoint of the Low Level Driver. |
||||
* @param pdev: Device handle |
||||
* @param ep_addr: Endpoint number |
||||
* @retval USBD status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_LL_FlushEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) |
||||
{ |
||||
HAL_StatusTypeDef hal_status = HAL_OK; |
||||
USBD_StatusTypeDef usb_status = USBD_OK; |
||||
|
||||
hal_status = HAL_PCD_EP_Flush(pdev->pData, ep_addr); |
||||
|
||||
usb_status = USBD_Get_USB_Status(hal_status); |
||||
|
||||
return usb_status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Sets a Stall condition on an endpoint of the Low Level Driver. |
||||
* @param pdev: Device handle |
||||
* @param ep_addr: Endpoint number |
||||
* @retval USBD status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_LL_StallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) |
||||
{ |
||||
HAL_StatusTypeDef hal_status = HAL_OK; |
||||
USBD_StatusTypeDef usb_status = USBD_OK; |
||||
|
||||
hal_status = HAL_PCD_EP_SetStall(pdev->pData, ep_addr); |
||||
|
||||
usb_status = USBD_Get_USB_Status(hal_status); |
||||
|
||||
return usb_status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Clears a Stall condition on an endpoint of the Low Level Driver. |
||||
* @param pdev: Device handle |
||||
* @param ep_addr: Endpoint number |
||||
* @retval USBD status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_LL_ClearStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) |
||||
{ |
||||
HAL_StatusTypeDef hal_status = HAL_OK; |
||||
USBD_StatusTypeDef usb_status = USBD_OK; |
||||
|
||||
hal_status = HAL_PCD_EP_ClrStall(pdev->pData, ep_addr); |
||||
|
||||
usb_status = USBD_Get_USB_Status(hal_status); |
||||
|
||||
return usb_status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Returns Stall condition. |
||||
* @param pdev: Device handle |
||||
* @param ep_addr: Endpoint number |
||||
* @retval Stall (1: Yes, 0: No) |
||||
*/ |
||||
uint8_t USBD_LL_IsStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) |
||||
{ |
||||
PCD_HandleTypeDef *hpcd = (PCD_HandleTypeDef*) pdev->pData; |
||||
|
||||
if((ep_addr & 0x80) == 0x80) |
||||
{ |
||||
return hpcd->IN_ep[ep_addr & 0x7F].is_stall; |
||||
} |
||||
else |
||||
{ |
||||
return hpcd->OUT_ep[ep_addr & 0x7F].is_stall; |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Assigns a USB address to the device. |
||||
* @param pdev: Device handle |
||||
* @param dev_addr: Device address |
||||
* @retval USBD status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_LL_SetUSBAddress(USBD_HandleTypeDef *pdev, uint8_t dev_addr) |
||||
{ |
||||
HAL_StatusTypeDef hal_status = HAL_OK; |
||||
USBD_StatusTypeDef usb_status = USBD_OK; |
||||
|
||||
hal_status = HAL_PCD_SetAddress(pdev->pData, dev_addr); |
||||
|
||||
usb_status = USBD_Get_USB_Status(hal_status); |
||||
|
||||
return usb_status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Transmits data over an endpoint. |
||||
* @param pdev: Device handle |
||||
* @param ep_addr: Endpoint number |
||||
* @param pbuf: Pointer to data to be sent |
||||
* @param size: Data size |
||||
* @retval USBD status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint32_t size) |
||||
{ |
||||
HAL_StatusTypeDef hal_status = HAL_OK; |
||||
USBD_StatusTypeDef usb_status = USBD_OK; |
||||
|
||||
hal_status = HAL_PCD_EP_Transmit(pdev->pData, ep_addr, pbuf, size); |
||||
|
||||
usb_status = USBD_Get_USB_Status(hal_status); |
||||
|
||||
return usb_status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Prepares an endpoint for reception. |
||||
* @param pdev: Device handle |
||||
* @param ep_addr: Endpoint number |
||||
* @param pbuf: Pointer to data to be received |
||||
* @param size: Data size |
||||
* @retval USBD status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint32_t size) |
||||
{ |
||||
HAL_StatusTypeDef hal_status = HAL_OK; |
||||
USBD_StatusTypeDef usb_status = USBD_OK; |
||||
|
||||
hal_status = HAL_PCD_EP_Receive(pdev->pData, ep_addr, pbuf, size); |
||||
|
||||
usb_status = USBD_Get_USB_Status(hal_status); |
||||
|
||||
return usb_status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Returns the last transferred packet size. |
||||
* @param pdev: Device handle |
||||
* @param ep_addr: Endpoint number |
||||
* @retval Received Data Size |
||||
*/ |
||||
uint32_t USBD_LL_GetRxDataSize(USBD_HandleTypeDef *pdev, uint8_t ep_addr) |
||||
{ |
||||
return HAL_PCD_EP_GetRxCount((PCD_HandleTypeDef*) pdev->pData, ep_addr); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Send LPM message to user layer |
||||
* @param hpcd: PCD handle |
||||
* @param msg: LPM message |
||||
* @retval None |
||||
*/ |
||||
void HAL_PCDEx_LPM_Callback(PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg) |
||||
{ |
||||
switch (msg) |
||||
{ |
||||
case PCD_LPM_L0_ACTIVE: |
||||
if (hpcd->Init.low_power_enable) |
||||
{ |
||||
SystemClock_Config(); |
||||
|
||||
/* Reset SLEEPDEEP bit of Cortex System Control Register. */ |
||||
SCB->SCR &= (uint32_t)~((uint32_t)(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk)); |
||||
} |
||||
__HAL_PCD_UNGATE_PHYCLOCK(hpcd); |
||||
USBD_LL_Resume(hpcd->pData); |
||||
break; |
||||
|
||||
case PCD_LPM_L1_ACTIVE: |
||||
__HAL_PCD_GATE_PHYCLOCK(hpcd); |
||||
USBD_LL_Suspend(hpcd->pData); |
||||
|
||||
/* Enter in STOP mode. */ |
||||
if (hpcd->Init.low_power_enable) |
||||
{ |
||||
/* Set SLEEPDEEP bit and SleepOnExit of Cortex System Control Register. */ |
||||
SCB->SCR |= (uint32_t)((uint32_t)(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk)); |
||||
} |
||||
break; |
||||
} |
||||
} |
||||
|
||||
#ifdef USBD_HS_TESTMODE_ENABLE |
||||
/**
|
||||
* @brief Set High speed Test mode. |
||||
* @param pdev: Device handle |
||||
* @param testmode: test mode |
||||
* @retval USBD Status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_LL_SetTestMode(USBD_HandleTypeDef *pdev, uint8_t testmode) |
||||
{ |
||||
UNUSED(pdev); |
||||
UNUSED(testmode); |
||||
|
||||
return USBD_OK; |
||||
} |
||||
#endif /* USBD_HS_TESTMODE_ENABLE */ |
||||
|
||||
/**
|
||||
* @brief Static single allocation. |
||||
* @param size: Size of allocated memory |
||||
* @retval None |
||||
*/ |
||||
void *USBD_static_malloc(uint32_t size) |
||||
{ |
||||
static uint32_t mem[(sizeof(USBD_CDC_HandleTypeDef)/4)+1];/* On 32-bit boundary */ |
||||
return mem; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Dummy memory free |
||||
* @param p: Pointer to allocated memory address |
||||
* @retval None |
||||
*/ |
||||
void USBD_static_free(void *p) |
||||
{ |
||||
|
||||
} |
||||
|
||||
/**
|
||||
* @brief Delays routine for the USB Device Library. |
||||
* @param Delay: Delay in ms |
||||
* @retval None |
||||
*/ |
||||
void USBD_LL_Delay(uint32_t Delay) |
||||
{ |
||||
HAL_Delay(Delay); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Returns the USB status depending on the HAL status: |
||||
* @param hal_status: HAL status |
||||
* @retval USB status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_Get_USB_Status(HAL_StatusTypeDef hal_status) |
||||
{ |
||||
USBD_StatusTypeDef usb_status = USBD_OK; |
||||
|
||||
switch (hal_status) |
||||
{ |
||||
case HAL_OK : |
||||
usb_status = USBD_OK; |
||||
break; |
||||
case HAL_ERROR : |
||||
usb_status = USBD_FAIL; |
||||
break; |
||||
case HAL_BUSY : |
||||
usb_status = USBD_BUSY; |
||||
break; |
||||
case HAL_TIMEOUT : |
||||
usb_status = USBD_FAIL; |
||||
break; |
||||
default : |
||||
usb_status = USBD_FAIL; |
||||
break; |
||||
} |
||||
return usb_status; |
||||
} |
@ -0,0 +1,173 @@
|
||||
/* USER CODE BEGIN Header */ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file : usbd_conf.h |
||||
* @version : v1.0_Cube |
||||
* @brief : Header for usbd_conf.c file. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* Copyright (c) 2022 STMicroelectronics. |
||||
* All rights reserved. |
||||
* |
||||
* This software is licensed under terms that can be found in the LICENSE file |
||||
* in the root directory of this software component. |
||||
* If no LICENSE file comes with this software, it is provided AS-IS. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
/* USER CODE END Header */ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __USBD_CONF__H__ |
||||
#define __USBD_CONF__H__ |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include <stdio.h> |
||||
#include <stdlib.h> |
||||
#include <string.h> |
||||
#include "main.h" |
||||
#include "stm32f4xx.h" |
||||
#include "stm32f4xx_hal.h" |
||||
|
||||
/* USER CODE BEGIN INCLUDE */ |
||||
|
||||
/* USER CODE END INCLUDE */ |
||||
|
||||
/** @addtogroup USBD_OTG_DRIVER
|
||||
* @brief Driver for Usb device. |
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup USBD_CONF USBD_CONF
|
||||
* @brief Configuration file for Usb otg low level driver. |
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup USBD_CONF_Exported_Variables USBD_CONF_Exported_Variables
|
||||
* @brief Public variables. |
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBD_CONF_Exported_Defines USBD_CONF_Exported_Defines
|
||||
* @brief Defines for configuration of the Usb device. |
||||
* @{ |
||||
*/ |
||||
|
||||
/*---------- -----------*/ |
||||
#define USBD_MAX_NUM_INTERFACES 1U |
||||
/*---------- -----------*/ |
||||
#define USBD_MAX_NUM_CONFIGURATION 1U |
||||
/*---------- -----------*/ |
||||
#define USBD_MAX_STR_DESC_SIZ 512U |
||||
/*---------- -----------*/ |
||||
#define USBD_DEBUG_LEVEL 0U |
||||
/*---------- -----------*/ |
||||
#define USBD_LPM_ENABLED 1U |
||||
/*---------- -----------*/ |
||||
#define USBD_SELF_POWERED 1U |
||||
|
||||
/****************************************/ |
||||
/* #define for FS and HS identification */ |
||||
#define DEVICE_FS 0 |
||||
#define DEVICE_HS 1 |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBD_CONF_Exported_Macros USBD_CONF_Exported_Macros
|
||||
* @brief Aliases. |
||||
* @{ |
||||
*/ |
||||
/* Memory management macros make sure to use static memory allocation */ |
||||
/** Alias for memory allocation. */ |
||||
|
||||
#define USBD_malloc (void *)USBD_static_malloc |
||||
|
||||
/** Alias for memory release. */ |
||||
#define USBD_free USBD_static_free |
||||
|
||||
/** Alias for memory set. */ |
||||
#define USBD_memset memset |
||||
|
||||
/** Alias for memory copy. */ |
||||
#define USBD_memcpy memcpy |
||||
|
||||
/** Alias for delay. */ |
||||
#define USBD_Delay HAL_Delay |
||||
|
||||
/* DEBUG macros */ |
||||
|
||||
#if (USBD_DEBUG_LEVEL > 0) |
||||
#define USBD_UsrLog(...) printf(__VA_ARGS__);\ |
||||
printf("\n"); |
||||
#else |
||||
#define USBD_UsrLog(...) |
||||
#endif /* (USBD_DEBUG_LEVEL > 0U) */ |
||||
|
||||
#if (USBD_DEBUG_LEVEL > 1) |
||||
|
||||
#define USBD_ErrLog(...) printf("ERROR: ") ;\ |
||||
printf(__VA_ARGS__);\
|
||||
printf("\n"); |
||||
#else |
||||
#define USBD_ErrLog(...) |
||||
#endif /* (USBD_DEBUG_LEVEL > 1U) */ |
||||
|
||||
#if (USBD_DEBUG_LEVEL > 2) |
||||
#define USBD_DbgLog(...) printf("DEBUG : ") ;\ |
||||
printf(__VA_ARGS__);\
|
||||
printf("\n"); |
||||
#else |
||||
#define USBD_DbgLog(...) |
||||
#endif /* (USBD_DEBUG_LEVEL > 2U) */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBD_CONF_Exported_Types USBD_CONF_Exported_Types
|
||||
* @brief Types. |
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBD_CONF_Exported_FunctionsPrototype USBD_CONF_Exported_FunctionsPrototype
|
||||
* @brief Declaration of public functions for Usb device. |
||||
* @{ |
||||
*/ |
||||
|
||||
/* Exported functions -------------------------------------------------------*/ |
||||
void *USBD_static_malloc(uint32_t size); |
||||
void USBD_static_free(void *p); |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* __USBD_CONF__H__ */ |
||||
|
@ -1,128 +0,0 @@
|
||||
/* USER CODE BEGIN Header */ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file : usb_host.c |
||||
* @version : v1.0_Cube |
||||
* @brief : This file implements the USB Host |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* Copyright (c) 2022 STMicroelectronics. |
||||
* All rights reserved. |
||||
* |
||||
* This software is licensed under terms that can be found in the LICENSE file |
||||
* in the root directory of this software component. |
||||
* If no LICENSE file comes with this software, it is provided AS-IS. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
/* USER CODE END Header */ |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
|
||||
#include "usb_host.h" |
||||
#include "usbh_core.h" |
||||
#include "usbh_cdc.h" |
||||
|
||||
/* USER CODE BEGIN Includes */ |
||||
|
||||
/* USER CODE END Includes */ |
||||
|
||||
/* USER CODE BEGIN PV */ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
|
||||
/* USER CODE END PV */ |
||||
|
||||
/* USER CODE BEGIN PFP */ |
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
|
||||
/* USER CODE END PFP */ |
||||
|
||||
/* USB Host core handle declaration */ |
||||
USBH_HandleTypeDef hUsbHostFS; |
||||
ApplicationTypeDef Appli_state = APPLICATION_IDLE; |
||||
|
||||
/*
|
||||
* -- Insert your variables declaration here -- |
||||
*/ |
||||
/* USER CODE BEGIN 0 */ |
||||
|
||||
/* USER CODE END 0 */ |
||||
|
||||
/*
|
||||
* user callback declaration |
||||
*/ |
||||
static void USBH_UserProcess(USBH_HandleTypeDef *phost, uint8_t id); |
||||
|
||||
/*
|
||||
* -- Insert your external function declaration here -- |
||||
*/ |
||||
/* USER CODE BEGIN 1 */ |
||||
|
||||
/* USER CODE END 1 */ |
||||
|
||||
/**
|
||||
* Init USB host library, add supported class and start the library |
||||
* @retval None |
||||
*/ |
||||
void MX_USB_HOST_Init(void) |
||||
{ |
||||
/* USER CODE BEGIN USB_HOST_Init_PreTreatment */ |
||||
|
||||
/* USER CODE END USB_HOST_Init_PreTreatment */ |
||||
|
||||
/* Init host Library, add supported class and start the library. */ |
||||
if (USBH_Init(&hUsbHostFS, USBH_UserProcess, HOST_FS) != USBH_OK) |
||||
{ |
||||
Error_Handler(); |
||||
} |
||||
if (USBH_RegisterClass(&hUsbHostFS, USBH_CDC_CLASS) != USBH_OK) |
||||
{ |
||||
Error_Handler(); |
||||
} |
||||
if (USBH_Start(&hUsbHostFS) != USBH_OK) |
||||
{ |
||||
Error_Handler(); |
||||
} |
||||
/* USER CODE BEGIN USB_HOST_Init_PostTreatment */ |
||||
|
||||
/* USER CODE END USB_HOST_Init_PostTreatment */ |
||||
} |
||||
|
||||
/*
|
||||
* user callback definition |
||||
*/ |
||||
static void USBH_UserProcess (USBH_HandleTypeDef *phost, uint8_t id) |
||||
{ |
||||
/* USER CODE BEGIN CALL_BACK_1 */ |
||||
switch(id) |
||||
{ |
||||
case HOST_USER_SELECT_CONFIGURATION: |
||||
break; |
||||
|
||||
case HOST_USER_DISCONNECTION: |
||||
Appli_state = APPLICATION_DISCONNECT; |
||||
break; |
||||
|
||||
case HOST_USER_CLASS_ACTIVE: |
||||
Appli_state = APPLICATION_READY; |
||||
break; |
||||
|
||||
case HOST_USER_CONNECTION: |
||||
Appli_state = APPLICATION_START; |
||||
break; |
||||
|
||||
default: |
||||
break; |
||||
} |
||||
/* USER CODE END CALL_BACK_1 */ |
||||
} |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
@ -1,90 +0,0 @@
|
||||
/* USER CODE BEGIN Header */ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file : usb_host.h |
||||
* @version : v1.0_Cube |
||||
* @brief : Header for usb_host.c file. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* Copyright (c) 2022 STMicroelectronics. |
||||
* All rights reserved. |
||||
* |
||||
* This software is licensed under terms that can be found in the LICENSE file |
||||
* in the root directory of this software component. |
||||
* If no LICENSE file comes with this software, it is provided AS-IS. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
/* USER CODE END Header */ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __USB_HOST__H__ |
||||
#define __USB_HOST__H__ |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm32f4xx.h" |
||||
#include "stm32f4xx_hal.h" |
||||
|
||||
/* USER CODE BEGIN INCLUDE */ |
||||
|
||||
/* USER CODE END INCLUDE */ |
||||
|
||||
/** @addtogroup USBH_OTG_DRIVER
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup USBH_HOST USBH_HOST
|
||||
* @brief Host file for Usb otg low level driver. |
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup USBH_HOST_Exported_Variables USBH_HOST_Exported_Variables
|
||||
* @brief Public variables. |
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** Status of the application. */ |
||||
typedef enum { |
||||
APPLICATION_IDLE = 0, |
||||
APPLICATION_START, |
||||
APPLICATION_READY, |
||||
APPLICATION_DISCONNECT |
||||
}ApplicationTypeDef; |
||||
|
||||
/** @defgroup USBH_HOST_Exported_FunctionsPrototype USBH_HOST_Exported_FunctionsPrototype
|
||||
* @brief Declaration of public functions for Usb host. |
||||
* @{ |
||||
*/ |
||||
|
||||
/* Exported functions -------------------------------------------------------*/ |
||||
|
||||
/** @brief USB Host initialization function. */ |
||||
void MX_USB_HOST_Init(void); |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* __USB_HOST__H__ */ |
||||
|
@ -1,548 +0,0 @@
|
||||
/* USER CODE BEGIN Header */ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file : Target/usbh_conf.c |
||||
* @version : v1.0_Cube |
||||
* @brief : This file implements the board support package for the USB host library |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* Copyright (c) 2022 STMicroelectronics. |
||||
* All rights reserved. |
||||
* |
||||
* This software is licensed under terms that can be found in the LICENSE file |
||||
* in the root directory of this software component. |
||||
* If no LICENSE file comes with this software, it is provided AS-IS. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
/* USER CODE END Header */ |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbh_core.h" |
||||
#include "usbh_platform.h" |
||||
|
||||
/* USER CODE BEGIN Includes */ |
||||
|
||||
/* USER CODE END Includes */ |
||||
|
||||
/* Private typedef -----------------------------------------------------------*/ |
||||
/* Private define ------------------------------------------------------------*/ |
||||
/* Private macro -------------------------------------------------------------*/ |
||||
|
||||
/* USER CODE BEGIN PV */ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
|
||||
/* USER CODE END PV */ |
||||
|
||||
HCD_HandleTypeDef hhcd_USB_OTG_FS; |
||||
void Error_Handler(void); |
||||
|
||||
/* USER CODE BEGIN 0 */ |
||||
|
||||
/* USER CODE END 0 */ |
||||
|
||||
/* USER CODE BEGIN PFP */ |
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
USBH_StatusTypeDef USBH_Get_USB_Status(HAL_StatusTypeDef hal_status); |
||||
|
||||
/* USER CODE END PFP */ |
||||
|
||||
/* Private functions ---------------------------------------------------------*/ |
||||
|
||||
/* USER CODE BEGIN 1 */ |
||||
|
||||
/* USER CODE END 1 */ |
||||
|
||||
/*******************************************************************************
|
||||
LL Driver Callbacks (HCD -> USB Host Library) |
||||
*******************************************************************************/ |
||||
/* MSP Init */ |
||||
|
||||
void HAL_HCD_MspInit(HCD_HandleTypeDef* hcdHandle) |
||||
{ |
||||
GPIO_InitTypeDef GPIO_InitStruct = {0}; |
||||
if(hcdHandle->Instance==USB_OTG_FS) |
||||
{ |
||||
/* USER CODE BEGIN USB_OTG_FS_MspInit 0 */ |
||||
|
||||
/* USER CODE END USB_OTG_FS_MspInit 0 */ |
||||
|
||||
__HAL_RCC_GPIOA_CLK_ENABLE(); |
||||
/**USB_OTG_FS GPIO Configuration
|
||||
PA12 ------> USB_OTG_FS_DP |
||||
PA11 ------> USB_OTG_FS_DM |
||||
PA10 ------> USB_OTG_FS_ID |
||||
PA9 ------> USB_OTG_FS_VBUS |
||||
*/ |
||||
GPIO_InitStruct.Pin = USB_FS1_P_Pin|USB_FS1_N_Pin|USB_FS1_ID_Pin; |
||||
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; |
||||
GPIO_InitStruct.Pull = GPIO_NOPULL; |
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; |
||||
GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS; |
||||
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); |
||||
|
||||
GPIO_InitStruct.Pin = VBUS_FS1_Pin; |
||||
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; |
||||
GPIO_InitStruct.Pull = GPIO_NOPULL; |
||||
HAL_GPIO_Init(VBUS_FS1_GPIO_Port, &GPIO_InitStruct); |
||||
|
||||
/* Peripheral clock enable */ |
||||
__HAL_RCC_USB_OTG_FS_CLK_ENABLE(); |
||||
|
||||
/* Peripheral interrupt init */ |
||||
HAL_NVIC_SetPriority(OTG_FS_IRQn, 5, 0); |
||||
HAL_NVIC_EnableIRQ(OTG_FS_IRQn); |
||||
/* USER CODE BEGIN USB_OTG_FS_MspInit 1 */ |
||||
|
||||
/* USER CODE END USB_OTG_FS_MspInit 1 */ |
||||
} |
||||
} |
||||
|
||||
void HAL_HCD_MspDeInit(HCD_HandleTypeDef* hcdHandle) |
||||
{ |
||||
if(hcdHandle->Instance==USB_OTG_FS) |
||||
{ |
||||
/* USER CODE BEGIN USB_OTG_FS_MspDeInit 0 */ |
||||
|
||||
/* USER CODE END USB_OTG_FS_MspDeInit 0 */ |
||||
/* Peripheral clock disable */ |
||||
__HAL_RCC_USB_OTG_FS_CLK_DISABLE(); |
||||
|
||||
/**USB_OTG_FS GPIO Configuration
|
||||
PA12 ------> USB_OTG_FS_DP |
||||
PA11 ------> USB_OTG_FS_DM |
||||
PA10 ------> USB_OTG_FS_ID |
||||
PA9 ------> USB_OTG_FS_VBUS |
||||
*/ |
||||
HAL_GPIO_DeInit(GPIOA, USB_FS1_P_Pin|USB_FS1_N_Pin|USB_FS1_ID_Pin|VBUS_FS1_Pin); |
||||
|
||||
/* Peripheral interrupt Deinit*/ |
||||
HAL_NVIC_DisableIRQ(OTG_FS_IRQn); |
||||
|
||||
/* USER CODE BEGIN USB_OTG_FS_MspDeInit 1 */ |
||||
|
||||
/* USER CODE END USB_OTG_FS_MspDeInit 1 */ |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief SOF callback. |
||||
* @param hhcd: HCD handle |
||||
* @retval None |
||||
*/ |
||||
void HAL_HCD_SOF_Callback(HCD_HandleTypeDef *hhcd) |
||||
{ |
||||
USBH_LL_IncTimer(hhcd->pData); |
||||
} |
||||
|
||||
/**
|
||||
* @brief SOF callback. |
||||
* @param hhcd: HCD handle |
||||
* @retval None |
||||
*/ |
||||
void HAL_HCD_Connect_Callback(HCD_HandleTypeDef *hhcd) |
||||
{ |
||||
USBH_LL_Connect(hhcd->pData); |
||||
} |
||||
|
||||
/**
|
||||
* @brief SOF callback. |
||||
* @param hhcd: HCD handle |
||||
* @retval None |
||||
*/ |
||||
void HAL_HCD_Disconnect_Callback(HCD_HandleTypeDef *hhcd) |
||||
{ |
||||
USBH_LL_Disconnect(hhcd->pData); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Notify URB state change callback. |
||||
* @param hhcd: HCD handle |
||||
* @param chnum: channel number |
||||
* @param urb_state: state |
||||
* @retval None |
||||
*/ |
||||
void HAL_HCD_HC_NotifyURBChange_Callback(HCD_HandleTypeDef *hhcd, uint8_t chnum, HCD_URBStateTypeDef urb_state) |
||||
{ |
||||
/* To be used with OS to sync URB state with the global state machine */ |
||||
#if (USBH_USE_OS == 1) |
||||
USBH_LL_NotifyURBChange(hhcd->pData); |
||||
#endif |
||||
} |
||||
/**
|
||||
* @brief Port Port Enabled callback. |
||||
* @param hhcd: HCD handle |
||||
* @retval None |
||||
*/ |
||||
void HAL_HCD_PortEnabled_Callback(HCD_HandleTypeDef *hhcd) |
||||
{ |
||||
USBH_LL_PortEnabled(hhcd->pData); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Port Port Disabled callback. |
||||
* @param hhcd: HCD handle |
||||
* @retval None |
||||
*/ |
||||
void HAL_HCD_PortDisabled_Callback(HCD_HandleTypeDef *hhcd) |
||||
{ |
||||
USBH_LL_PortDisabled(hhcd->pData); |
||||
} |
||||
|
||||
/*******************************************************************************
|
||||
LL Driver Interface (USB Host Library --> HCD) |
||||
*******************************************************************************/ |
||||
|
||||
/**
|
||||
* @brief Initialize the low level portion of the host driver. |
||||
* @param phost: Host handle |
||||
* @retval USBH status |
||||
*/ |
||||
USBH_StatusTypeDef USBH_LL_Init(USBH_HandleTypeDef *phost) |
||||
{ |
||||
/* Init USB_IP */ |
||||
if (phost->id == HOST_FS) { |
||||
/* Link the driver to the stack. */ |
||||
hhcd_USB_OTG_FS.pData = phost; |
||||
phost->pData = &hhcd_USB_OTG_FS; |
||||
|
||||
hhcd_USB_OTG_FS.Instance = USB_OTG_FS; |
||||
hhcd_USB_OTG_FS.Init.Host_channels = 8; |
||||
hhcd_USB_OTG_FS.Init.speed = HCD_SPEED_FULL; |
||||
hhcd_USB_OTG_FS.Init.dma_enable = DISABLE; |
||||
hhcd_USB_OTG_FS.Init.phy_itface = HCD_PHY_EMBEDDED; |
||||
hhcd_USB_OTG_FS.Init.Sof_enable = DISABLE; |
||||
if (HAL_HCD_Init(&hhcd_USB_OTG_FS) != HAL_OK) |
||||
{ |
||||
Error_Handler( ); |
||||
} |
||||
|
||||
USBH_LL_SetTimer(phost, HAL_HCD_GetCurrentFrame(&hhcd_USB_OTG_FS)); |
||||
} |
||||
return USBH_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief De-Initialize the low level portion of the host driver. |
||||
* @param phost: Host handle |
||||
* @retval USBH status |
||||
*/ |
||||
USBH_StatusTypeDef USBH_LL_DeInit(USBH_HandleTypeDef *phost) |
||||
{ |
||||
HAL_StatusTypeDef hal_status = HAL_OK; |
||||
USBH_StatusTypeDef usb_status = USBH_OK; |
||||
|
||||
hal_status = HAL_HCD_DeInit(phost->pData); |
||||
|
||||
usb_status = USBH_Get_USB_Status(hal_status); |
||||
|
||||
return usb_status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Start the low level portion of the host driver. |
||||
* @param phost: Host handle |
||||
* @retval USBH status |
||||
*/ |
||||
USBH_StatusTypeDef USBH_LL_Start(USBH_HandleTypeDef *phost) |
||||
{ |
||||
HAL_StatusTypeDef hal_status = HAL_OK; |
||||
USBH_StatusTypeDef usb_status = USBH_OK; |
||||
|
||||
hal_status = HAL_HCD_Start(phost->pData); |
||||
|
||||
usb_status = USBH_Get_USB_Status(hal_status); |
||||
|
||||
return usb_status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Stop the low level portion of the host driver. |
||||
* @param phost: Host handle |
||||
* @retval USBH status |
||||
*/ |
||||
USBH_StatusTypeDef USBH_LL_Stop(USBH_HandleTypeDef *phost) |
||||
{ |
||||
HAL_StatusTypeDef hal_status = HAL_OK; |
||||
USBH_StatusTypeDef usb_status = USBH_OK; |
||||
|
||||
hal_status = HAL_HCD_Stop(phost->pData); |
||||
|
||||
usb_status = USBH_Get_USB_Status(hal_status); |
||||
|
||||
return usb_status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Return the USB host speed from the low level driver. |
||||
* @param phost: Host handle |
||||
* @retval USBH speeds |
||||
*/ |
||||
USBH_SpeedTypeDef USBH_LL_GetSpeed(USBH_HandleTypeDef *phost) |
||||
{ |
||||
USBH_SpeedTypeDef speed = USBH_SPEED_FULL; |
||||
|
||||
switch (HAL_HCD_GetCurrentSpeed(phost->pData)) |
||||
{ |
||||
case 0 : |
||||
speed = USBH_SPEED_HIGH; |
||||
break; |
||||
|
||||
case 1 : |
||||
speed = USBH_SPEED_FULL; |
||||
break; |
||||
|
||||
case 2 : |
||||
speed = USBH_SPEED_LOW; |
||||
break; |
||||
|
||||
default: |
||||
speed = USBH_SPEED_FULL; |
||||
break; |
||||
} |
||||
return speed; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Reset the Host port of the low level driver. |
||||
* @param phost: Host handle |
||||
* @retval USBH status |
||||
*/ |
||||
USBH_StatusTypeDef USBH_LL_ResetPort(USBH_HandleTypeDef *phost) |
||||
{ |
||||
HAL_StatusTypeDef hal_status = HAL_OK; |
||||
USBH_StatusTypeDef usb_status = USBH_OK; |
||||
|
||||
hal_status = HAL_HCD_ResetPort(phost->pData); |
||||
|
||||
usb_status = USBH_Get_USB_Status(hal_status); |
||||
|
||||
return usb_status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Return the last transferred packet size. |
||||
* @param phost: Host handle |
||||
* @param pipe: Pipe index |
||||
* @retval Packet size |
||||
*/ |
||||
uint32_t USBH_LL_GetLastXferSize(USBH_HandleTypeDef *phost, uint8_t pipe) |
||||
{ |
||||
return HAL_HCD_HC_GetXferCount(phost->pData, pipe); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Open a pipe of the low level driver. |
||||
* @param phost: Host handle |
||||
* @param pipe_num: Pipe index |
||||
* @param epnum: Endpoint number |
||||
* @param dev_address: Device USB address |
||||
* @param speed: Device Speed |
||||
* @param ep_type: Endpoint type |
||||
* @param mps: Endpoint max packet size |
||||
* @retval USBH status |
||||
*/ |
||||
USBH_StatusTypeDef USBH_LL_OpenPipe(USBH_HandleTypeDef *phost, uint8_t pipe_num, uint8_t epnum, |
||||
uint8_t dev_address, uint8_t speed, uint8_t ep_type, uint16_t mps) |
||||
{ |
||||
HAL_StatusTypeDef hal_status = HAL_OK; |
||||
USBH_StatusTypeDef usb_status = USBH_OK; |
||||
|
||||
hal_status = HAL_HCD_HC_Init(phost->pData, pipe_num, epnum, |
||||
dev_address, speed, ep_type, mps); |
||||
|
||||
usb_status = USBH_Get_USB_Status(hal_status); |
||||
|
||||
return usb_status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Close a pipe of the low level driver. |
||||
* @param phost: Host handle |
||||
* @param pipe: Pipe index |
||||
* @retval USBH status |
||||
*/ |
||||
USBH_StatusTypeDef USBH_LL_ClosePipe(USBH_HandleTypeDef *phost, uint8_t pipe) |
||||
{ |
||||
HAL_StatusTypeDef hal_status = HAL_OK; |
||||
USBH_StatusTypeDef usb_status = USBH_OK; |
||||
|
||||
hal_status = HAL_HCD_HC_Halt(phost->pData, pipe); |
||||
|
||||
usb_status = USBH_Get_USB_Status(hal_status); |
||||
|
||||
return usb_status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Submit a new URB to the low level driver. |
||||
* @param phost: Host handle |
||||
* @param pipe: Pipe index |
||||
* This parameter can be a value from 1 to 15 |
||||
* @param direction : Channel number |
||||
* This parameter can be one of the these values: |
||||
* 0 : Output |
||||
* 1 : Input |
||||
* @param ep_type : Endpoint Type |
||||
* This parameter can be one of the these values: |
||||
* @arg EP_TYPE_CTRL: Control type |
||||
* @arg EP_TYPE_ISOC: Isochrounous type |
||||
* @arg EP_TYPE_BULK: Bulk type |
||||
* @arg EP_TYPE_INTR: Interrupt type |
||||
* @param token : Endpoint Type |
||||
* This parameter can be one of the these values: |
||||
* @arg 0: PID_SETUP |
||||
* @arg 1: PID_DATA |
||||
* @param pbuff : pointer to URB data |
||||
* @param length : Length of URB data |
||||
* @param do_ping : activate do ping protocol (for high speed only) |
||||
* This parameter can be one of the these values: |
||||
* 0 : do ping inactive |
||||
* 1 : do ping active |
||||
* @retval Status |
||||
*/ |
||||
USBH_StatusTypeDef USBH_LL_SubmitURB(USBH_HandleTypeDef *phost, uint8_t pipe, uint8_t direction, |
||||
uint8_t ep_type, uint8_t token, uint8_t *pbuff, uint16_t length, |
||||
uint8_t do_ping) |
||||
{ |
||||
HAL_StatusTypeDef hal_status = HAL_OK; |
||||
USBH_StatusTypeDef usb_status = USBH_OK; |
||||
|
||||
hal_status = HAL_HCD_HC_SubmitRequest(phost->pData, pipe, direction , |
||||
ep_type, token, pbuff, length, |
||||
do_ping); |
||||
usb_status = USBH_Get_USB_Status(hal_status); |
||||
|
||||
return usb_status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Get a URB state from the low level driver. |
||||
* @param phost: Host handle |
||||
* @param pipe: Pipe index |
||||
* This parameter can be a value from 1 to 15 |
||||
* @retval URB state |
||||
* This parameter can be one of the these values: |
||||
* @arg URB_IDLE |
||||
* @arg URB_DONE |
||||
* @arg URB_NOTREADY |
||||
* @arg URB_NYET |
||||
* @arg URB_ERROR |
||||
* @arg URB_STALL |
||||
*/ |
||||
USBH_URBStateTypeDef USBH_LL_GetURBState(USBH_HandleTypeDef *phost, uint8_t pipe) |
||||
{ |
||||
return (USBH_URBStateTypeDef)HAL_HCD_HC_GetURBState (phost->pData, pipe); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Drive VBUS. |
||||
* @param phost: Host handle |
||||
* @param state : VBUS state |
||||
* This parameter can be one of the these values: |
||||
* 0 : VBUS Inactive |
||||
* 1 : VBUS Active |
||||
* @retval Status |
||||
*/ |
||||
USBH_StatusTypeDef USBH_LL_DriverVBUS(USBH_HandleTypeDef *phost, uint8_t state) |
||||
{ |
||||
if (phost->id == HOST_FS) { |
||||
MX_DriverVbusFS(state); |
||||
} |
||||
|
||||
/* USER CODE BEGIN 0 */ |
||||
|
||||
/* USER CODE END 0*/ |
||||
|
||||
HAL_Delay(200); |
||||
return USBH_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Set toggle for a pipe. |
||||
* @param phost: Host handle |
||||
* @param pipe: Pipe index |
||||
* @param toggle: toggle (0/1) |
||||
* @retval Status |
||||
*/ |
||||
USBH_StatusTypeDef USBH_LL_SetToggle(USBH_HandleTypeDef *phost, uint8_t pipe, uint8_t toggle) |
||||
{ |
||||
HCD_HandleTypeDef *pHandle; |
||||
pHandle = phost->pData; |
||||
|
||||
if(pHandle->hc[pipe].ep_is_in) |
||||
{ |
||||
pHandle->hc[pipe].toggle_in = toggle; |
||||
} |
||||
else |
||||
{ |
||||
pHandle->hc[pipe].toggle_out = toggle; |
||||
} |
||||
|
||||
return USBH_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Return the current toggle of a pipe. |
||||
* @param phost: Host handle |
||||
* @param pipe: Pipe index |
||||
* @retval toggle (0/1) |
||||
*/ |
||||
uint8_t USBH_LL_GetToggle(USBH_HandleTypeDef *phost, uint8_t pipe) |
||||
{ |
||||
uint8_t toggle = 0; |
||||
HCD_HandleTypeDef *pHandle; |
||||
pHandle = phost->pData; |
||||
|
||||
if(pHandle->hc[pipe].ep_is_in) |
||||
{ |
||||
toggle = pHandle->hc[pipe].toggle_in; |
||||
} |
||||
else |
||||
{ |
||||
toggle = pHandle->hc[pipe].toggle_out; |
||||
} |
||||
return toggle; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Delay routine for the USB Host Library |
||||
* @param Delay: Delay in ms |
||||
* @retval None |
||||
*/ |
||||
void USBH_Delay(uint32_t Delay) |
||||
{ |
||||
HAL_Delay(Delay); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Returns the USB status depending on the HAL status: |
||||
* @param hal_status: HAL status |
||||
* @retval USB status |
||||
*/ |
||||
USBH_StatusTypeDef USBH_Get_USB_Status(HAL_StatusTypeDef hal_status) |
||||
{ |
||||
USBH_StatusTypeDef usb_status = USBH_OK; |
||||
|
||||
switch (hal_status) |
||||
{ |
||||
case HAL_OK : |
||||
usb_status = USBH_OK; |
||||
break; |
||||
case HAL_ERROR : |
||||
usb_status = USBH_FAIL; |
||||
break; |
||||
case HAL_BUSY : |
||||
usb_status = USBH_BUSY; |
||||
break; |
||||
case HAL_TIMEOUT : |
||||
usb_status = USBH_FAIL; |
||||
break; |
||||
default : |
||||
usb_status = USBH_FAIL; |
||||
break; |
||||
} |
||||
return usb_status; |
||||
} |
||||
|
@ -1,194 +0,0 @@
|
||||
/* USER CODE BEGIN Header */ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file : Target/usbh_conf.h |
||||
* @version : v1.0_Cube |
||||
* @brief : Header for usbh_conf.c file. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* Copyright (c) 2022 STMicroelectronics. |
||||
* All rights reserved. |
||||
* |
||||
* This software is licensed under terms that can be found in the LICENSE file |
||||
* in the root directory of this software component. |
||||
* If no LICENSE file comes with this software, it is provided AS-IS. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
/* USER CODE END Header */ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __USBH_CONF__H__ |
||||
#define __USBH_CONF__H__ |
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
/* Includes ------------------------------------------------------------------*/ |
||||
|
||||
#include <stdio.h> |
||||
#include <stdlib.h> |
||||
#include <string.h> |
||||
#include "main.h" |
||||
|
||||
#include "stm32f4xx.h" |
||||
#include "stm32f4xx_hal.h" |
||||
|
||||
/* USER CODE BEGIN INCLUDE */ |
||||
|
||||
/* USER CODE END INCLUDE */ |
||||
|
||||
/** @addtogroup STM32_USB_HOST_LIBRARY
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup USBH_CONF
|
||||
* @brief usb host low level driver configuration file |
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup USBH_CONF_Exported_Variables USBH_CONF_Exported_Variables
|
||||
* @brief Public variables. |
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBH_CONF_Exported_Defines USBH_CONF_Exported_Defines
|
||||
* @brief Defines for configuration of the Usb host. |
||||
* @{ |
||||
*/ |
||||
|
||||
/*---------- -----------*/ |
||||
#define USBH_MAX_NUM_ENDPOINTS 2U |
||||
|
||||
/*---------- -----------*/ |
||||
#define USBH_MAX_NUM_INTERFACES 2U |
||||
|
||||
/*---------- -----------*/ |
||||
#define USBH_MAX_NUM_CONFIGURATION 1U |
||||
|
||||
/*---------- -----------*/ |
||||
#define USBH_KEEP_CFG_DESCRIPTOR 1U |
||||
|
||||
/*---------- -----------*/ |
||||
#define USBH_MAX_NUM_SUPPORTED_CLASS 1U |
||||
|
||||
/*---------- -----------*/ |
||||
#define USBH_MAX_SIZE_CONFIGURATION 256U |
||||
|
||||
/*---------- -----------*/ |
||||
#define USBH_MAX_DATA_BUFFER 512U |
||||
|
||||
/*---------- -----------*/ |
||||
#define USBH_DEBUG_LEVEL 0U |
||||
|
||||
/*---------- -----------*/ |
||||
#define USBH_USE_OS 1U |
||||
|
||||
/****************************************/ |
||||
/* #define for FS and HS identification */ |
||||
#define HOST_HS 0 |
||||
#define HOST_FS 1 |
||||
|
||||
#if (USBH_USE_OS == 1) |
||||
#include "cmsis_os.h" |
||||
#define USBH_PROCESS_PRIO osPriorityNormal |
||||
#define USBH_PROCESS_STACK_SIZE ((uint16_t)128) |
||||
#endif /* (USBH_USE_OS == 1) */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBH_CONF_Exported_Macros USBH_CONF_Exported_Macros
|
||||
* @brief Aliases. |
||||
* @{ |
||||
*/ |
||||
|
||||
/* Memory management macros */ |
||||
|
||||
/** Alias for memory allocation. */ |
||||
#define USBH_malloc malloc |
||||
|
||||
/** Alias for memory release. */ |
||||
#define USBH_free free |
||||
|
||||
/** Alias for memory set. */ |
||||
#define USBH_memset memset |
||||
|
||||
/** Alias for memory copy. */ |
||||
#define USBH_memcpy memcpy |
||||
|
||||
/* DEBUG macros */ |
||||
|
||||
#if (USBH_DEBUG_LEVEL > 0U) |
||||
#define USBH_UsrLog(...) do { \ |
||||
printf(__VA_ARGS__); \
|
||||
printf("\n"); \
|
||||
} while (0) |
||||
#else |
||||
#define USBH_UsrLog(...) do {} while (0) |
||||
#endif |
||||
|
||||
#if (USBH_DEBUG_LEVEL > 1U) |
||||
|
||||
#define USBH_ErrLog(...) do { \ |
||||
printf("ERROR: ") ; \
|
||||
printf(__VA_ARGS__); \
|
||||
printf("\n"); \
|
||||
} while (0) |
||||
#else |
||||
#define USBH_ErrLog(...) do {} while (0) |
||||
#endif |
||||
|
||||
#if (USBH_DEBUG_LEVEL > 2U) |
||||
#define USBH_DbgLog(...) do { \ |
||||
printf("DEBUG : ") ; \
|
||||
printf(__VA_ARGS__); \
|
||||
printf("\n"); \
|
||||
} while (0) |
||||
#else |
||||
#define USBH_DbgLog(...) do {} while (0) |
||||
#endif |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBH_CONF_Exported_Types USBH_CONF_Exported_Types
|
||||
* @brief Types. |
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup USBH_CONF_Exported_FunctionsPrototype USBH_CONF_Exported_FunctionsPrototype
|
||||
* @brief Declaration of public functions for Usb host. |
||||
* @{ |
||||
*/ |
||||
|
||||
/* Exported functions -------------------------------------------------------*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* __USBH_CONF__H__ */ |
||||
|
@ -1,52 +0,0 @@
|
||||
/* USER CODE BEGIN Header */ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file : usbh_platform.c |
||||
|
||||
* @brief : This file implements the USB platform |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* Copyright (c) 2022 STMicroelectronics. |
||||
* All rights reserved. |
||||
* |
||||
* This software is licensed under terms that can be found in the LICENSE file |
||||
* in the root directory of this software component. |
||||
* If no LICENSE file comes with this software, it is provided AS-IS. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
/* USER CODE END Header */ |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbh_platform.h" |
||||
|
||||
/* USER CODE BEGIN INCLUDE */ |
||||
|
||||
/* USER CODE END INCLUDE */ |
||||
|
||||
/**
|
||||
* @brief Drive VBUS. |
||||
* @param state : VBUS state |
||||
* This parameter can be one of the these values: |
||||
* - 1 : VBUS Active |
||||
* - 0 : VBUS Inactive |
||||
*/ |
||||
void MX_DriverVbusFS(uint8_t state) |
||||
{ |
||||
uint8_t data = state; |
||||
/* USER CODE BEGIN PREPARE_GPIO_DATA_VBUS_FS */ |
||||
if(state == 0) |
||||
{ |
||||
/* Drive high Charge pump */ |
||||
data = GPIO_PIN_RESET; |
||||
} |
||||
else |
||||
{ |
||||
/* Drive low Charge pump */ |
||||
data = GPIO_PIN_SET; |
||||
} |
||||
/* USER CODE END PREPARE_GPIO_DATA_VBUS_FS */ |
||||
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,(GPIO_PinState)data); |
||||
} |
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue