mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-12-24 07:18:09 +00:00
126 lines
3.3 KiB
C
126 lines
3.3 KiB
C
#include STM32_HAL_H
|
|
|
|
#include "usbd_core.h"
|
|
#include "usbd_desc.h"
|
|
#include "usbd_cdc_msc_hid.h"
|
|
#include "usbd_cdc_interface.h"
|
|
#include "usbd_hid_interface.h"
|
|
|
|
USBD_HandleTypeDef hUSBDDevice;
|
|
extern PCD_HandleTypeDef pcd_fs_handle;
|
|
extern PCD_HandleTypeDef pcd_hs_handle;
|
|
|
|
int usb_init(void) {
|
|
const uint16_t vid = 0x1209;
|
|
const uint16_t pid = 0x53C1;
|
|
|
|
USBD_HID_ModeInfoTypeDef hid_info = {
|
|
.subclass = 0,
|
|
.protocol = 0,
|
|
.max_packet_len = 64,
|
|
.polling_interval = 1,
|
|
.report_desc = (const uint8_t*)"\x06\x00\xff\x09\x01\xa1\x01\x09\x20\x15\x00\x26\xff\x00\x75\x08\x95\x40\x81\x02\x09\x21\x15\x00\x26\xff\x00\x75\x08\x95\x40\x91\x02\xc0",
|
|
.report_desc_len = 34,
|
|
};
|
|
|
|
USBD_SetVIDPIDRelease(vid, pid, 0x0200, 0);
|
|
if (USBD_SelectMode(USBD_MODE_CDC_HID, &hid_info) != 0) {
|
|
return 1;
|
|
}
|
|
USBD_Init(&hUSBDDevice, (USBD_DescriptorsTypeDef*)&USBD_Descriptors, 0); // 0 == full speed
|
|
USBD_RegisterClass(&hUSBDDevice, &USBD_CDC_MSC_HID);
|
|
USBD_CDC_RegisterInterface(&hUSBDDevice, (USBD_CDC_ItfTypeDef*)&USBD_CDC_fops);
|
|
USBD_HID_RegisterInterface(&hUSBDDevice, (USBD_HID_ItfTypeDef*)&USBD_HID_fops);
|
|
USBD_Start(&hUSBDDevice);
|
|
|
|
return 0;
|
|
}
|
|
|
|
#if defined(USE_USB_FS)
|
|
/**
|
|
* @brief This function handles USB-On-The-Go FS global interrupt request.
|
|
* @param None
|
|
* @retval None
|
|
*/
|
|
void OTG_FS_IRQHandler(void) {
|
|
HAL_PCD_IRQHandler(&pcd_fs_handle);
|
|
}
|
|
#endif
|
|
|
|
#if defined(USE_USB_HS)
|
|
/**
|
|
* @brief This function handles USB-On-The-Go HS global interrupt request.
|
|
* @param None
|
|
* @retval None
|
|
*/
|
|
void OTG_HS_IRQHandler(void) {
|
|
HAL_PCD_IRQHandler(&pcd_hs_handle);
|
|
}
|
|
#endif
|
|
|
|
#if defined(USE_USB_FS) || defined(USE_USB_HS)
|
|
/**
|
|
* @brief This function handles USB OTG Common FS/HS Wakeup functions.
|
|
* @param *pcd_handle for FS or HS
|
|
* @retval None
|
|
*/
|
|
STATIC void OTG_CMD_WKUP_Handler(PCD_HandleTypeDef *pcd_handle) {
|
|
if (!(pcd_handle->Init.low_power_enable)) {
|
|
return;
|
|
}
|
|
|
|
/* Reset SLEEPDEEP bit of Cortex System Control Register */
|
|
SCB->SCR &= (uint32_t) ~((uint32_t)(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk));
|
|
|
|
/* Configures system clock after wake-up from STOP: enable HSE, PLL and select
|
|
PLL as system clock source (HSE and PLL are disabled in STOP mode) */
|
|
|
|
__HAL_RCC_HSE_CONFIG(RCC_HSE_ON);
|
|
|
|
/* Wait till HSE is ready */
|
|
while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) {}
|
|
|
|
/* Enable the main PLL. */
|
|
__HAL_RCC_PLL_ENABLE();
|
|
|
|
/* Wait till PLL is ready */
|
|
while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) {}
|
|
|
|
/* Select PLL as SYSCLK */
|
|
MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, RCC_SYSCLKSOURCE_PLLCLK);
|
|
|
|
while (__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL) {}
|
|
|
|
/* ungate PHY clock */
|
|
__HAL_PCD_UNGATE_PHYCLOCK(pcd_handle);
|
|
}
|
|
#endif
|
|
|
|
#if defined(USE_USB_FS)
|
|
/**
|
|
* @brief This function handles USB OTG FS Wakeup IRQ Handler.
|
|
* @param None
|
|
* @retval None
|
|
*/
|
|
void OTG_FS_WKUP_IRQHandler(void) {
|
|
OTG_CMD_WKUP_Handler(&pcd_fs_handle);
|
|
|
|
/* Clear EXTI pending Bit*/
|
|
__HAL_USB_FS_EXTI_CLEAR_FLAG();
|
|
}
|
|
#endif
|
|
|
|
#if defined(USE_USB_HS)
|
|
/**
|
|
* @brief This function handles USB OTG HS Wakeup IRQ Handler.
|
|
* @param None
|
|
* @retval None
|
|
*/
|
|
void OTG_HS_WKUP_IRQHandler(void) {
|
|
OTG_CMD_WKUP_Handler(&pcd_hs_handle);
|
|
|
|
/* Clear EXTI pending Bit*/
|
|
__HAL_USB_HS_EXTI_CLEAR_FLAG();
|
|
}
|
|
#endif
|