/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file app_usbx_device.c * @author MCD Application Team * @brief USBX Device applicative file ****************************************************************************** * @attention * * Copyright (c) 2024 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 "app_usbx_device.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN UX_Device_Memory_Buffer */ /* USER CODE END UX_Device_Memory_Buffer */ #if defined ( __ICCARM__ ) #pragma data_alignment=4 #endif __ALIGN_BEGIN static UCHAR ux_device_byte_pool_buffer[UX_DEVICE_APP_MEM_POOL_SIZE] __ALIGN_END; static ULONG cdc_acm_interface_number; static ULONG cdc_acm_configuration_number; static UX_SLAVE_CLASS_CDC_ACM_PARAMETER cdc_acm_parameter; /* USER CODE BEGIN PV */ extern PCD_HandleTypeDef hpcd_USB_DRD_FS; static uint8_t button_status = 0; /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ static UINT USBD_ChangeFunction(ULONG Device_State); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ /** * @brief Application USBX Device Initialization. * @param none * @retval status */ UINT MX_USBX_Device_Init(VOID) { UINT ret = UX_SUCCESS; UCHAR *device_framework_high_speed; UCHAR *device_framework_full_speed; ULONG device_framework_hs_length; ULONG device_framework_fs_length; ULONG string_framework_length; ULONG language_id_framework_length; UCHAR *string_framework; UCHAR *language_id_framework; UCHAR *pointer; /* USER CODE BEGIN MX_USBX_Device_Init0 */ /* USER CODE END MX_USBX_Device_Init0 */ pointer = ux_device_byte_pool_buffer; /* Initialize USBX Memory */ if (ux_system_initialize(pointer, USBX_DEVICE_MEMORY_STACK_SIZE, UX_NULL, 0) != UX_SUCCESS) { /* USER CODE BEGIN USBX_SYSTEM_INITIALIZE_ERROR */ return UX_ERROR; /* USER CODE END USBX_SYSTEM_INITIALIZE_ERROR */ } /* Get Device Framework High Speed and get the length */ device_framework_high_speed = USBD_Get_Device_Framework_Speed(USBD_HIGH_SPEED, &device_framework_hs_length); /* Get Device Framework Full Speed and get the length */ device_framework_full_speed = USBD_Get_Device_Framework_Speed(USBD_FULL_SPEED, &device_framework_fs_length); /* Get String Framework and get the length */ string_framework = USBD_Get_String_Framework(&string_framework_length); /* Get Language Id Framework and get the length */ language_id_framework = USBD_Get_Language_Id_Framework(&language_id_framework_length); /* Install the device portion of USBX */ if (ux_device_stack_initialize(device_framework_high_speed, device_framework_hs_length, device_framework_full_speed, device_framework_fs_length, string_framework, string_framework_length, language_id_framework, language_id_framework_length, USBD_ChangeFunction) != UX_SUCCESS) { /* USER CODE BEGIN USBX_DEVICE_INITIALIZE_ERROR */ return UX_ERROR; /* USER CODE END USBX_DEVICE_INITIALIZE_ERROR */ } /* Initialize the cdc acm class parameters for the device */ cdc_acm_parameter.ux_slave_class_cdc_acm_instance_activate = USBD_CDC_ACM_Activate; cdc_acm_parameter.ux_slave_class_cdc_acm_instance_deactivate = USBD_CDC_ACM_Deactivate; cdc_acm_parameter.ux_slave_class_cdc_acm_parameter_change = USBD_CDC_ACM_ParameterChange; /* USER CODE BEGIN CDC_ACM_PARAMETER */ /* USER CODE END CDC_ACM_PARAMETER */ /* Get cdc acm configuration number */ cdc_acm_configuration_number = USBD_Get_Configuration_Number(CLASS_TYPE_CDC_ACM, 0); /* Find cdc acm interface number */ cdc_acm_interface_number = USBD_Get_Interface_Number(CLASS_TYPE_CDC_ACM, 0); /* Initialize the device cdc acm class */ if (ux_device_stack_class_register(_ux_system_slave_class_cdc_acm_name, ux_device_class_cdc_acm_entry, cdc_acm_configuration_number, cdc_acm_interface_number, &cdc_acm_parameter) != UX_SUCCESS) { /* USER CODE BEGIN USBX_DEVICE_CDC_ACM_REGISTER_ERROR */ return UX_ERROR; /* USER CODE END USBX_DEVICE_CDC_ACM_REGISTER_ERROR */ } /* USER CODE BEGIN MX_USBX_Device_Init1 */ USBX_APP_Device_Init(); /* USER CODE END MX_USBX_Device_Init1 */ return ret; } /** * @brief _ux_utility_interrupt_disable * USB utility interrupt disable. * @param none * @retval none */ ALIGN_TYPE _ux_utility_interrupt_disable(VOID) { UINT interrupt_save; /* USER CODE BEGIN _ux_utility_interrupt_disable */ interrupt_save = __get_PRIMASK(); __disable_irq(); /* USER CODE END _ux_utility_interrupt_disable */ return interrupt_save; } /** * @brief _ux_utility_interrupt_restore * USB utility interrupt restore. * @param flags * @retval none */ VOID _ux_utility_interrupt_restore(ALIGN_TYPE flags) { /* USER CODE BEGIN _ux_utility_interrupt_restore */ __set_PRIMASK(flags); /* USER CODE END _ux_utility_interrupt_restore */ } /** * @brief _ux_utility_time_get * Get Time Tick for host timing. * @param none * @retval time tick */ ULONG _ux_utility_time_get(VOID) { ULONG time_tick = 0U; /* USER CODE BEGIN _ux_utility_time_get */ /* USER CODE END _ux_utility_time_get */ return time_tick; } /** * @brief USBD_ChangeFunction * This function is called when the device state changes. * @param Device_State: USB Device State * @retval status */ static UINT USBD_ChangeFunction(ULONG Device_State) { UINT status = UX_SUCCESS; /* USER CODE BEGIN USBD_ChangeFunction0 */ /* USER CODE END USBD_ChangeFunction0 */ switch (Device_State) { case UX_DEVICE_ATTACHED: /* USER CODE BEGIN UX_DEVICE_ATTACHED */ /* USER CODE END UX_DEVICE_ATTACHED */ break; case UX_DEVICE_REMOVED: /* USER CODE BEGIN UX_DEVICE_REMOVED */ /* USER CODE END UX_DEVICE_REMOVED */ break; case UX_DCD_STM32_DEVICE_CONNECTED: /* USER CODE BEGIN UX_DCD_STM32_DEVICE_CONNECTED */ /* USER CODE END UX_DCD_STM32_DEVICE_CONNECTED */ break; case UX_DCD_STM32_DEVICE_DISCONNECTED: /* USER CODE BEGIN UX_DCD_STM32_DEVICE_DISCONNECTED */ /* USER CODE END UX_DCD_STM32_DEVICE_DISCONNECTED */ break; case UX_DCD_STM32_DEVICE_SUSPENDED: /* USER CODE BEGIN UX_DCD_STM32_DEVICE_SUSPENDED */ /* USER CODE END UX_DCD_STM32_DEVICE_SUSPENDED */ break; case UX_DCD_STM32_DEVICE_RESUMED: /* USER CODE BEGIN UX_DCD_STM32_DEVICE_RESUMED */ /* USER CODE END UX_DCD_STM32_DEVICE_RESUMED */ break; case UX_DCD_STM32_SOF_RECEIVED: /* USER CODE BEGIN UX_DCD_STM32_SOF_RECEIVED */ /* USER CODE END UX_DCD_STM32_SOF_RECEIVED */ break; default: /* USER CODE BEGIN DEFAULT */ /* USER CODE END DEFAULT */ break; } /* USER CODE BEGIN USBD_ChangeFunction1 */ /* USER CODE END USBD_ChangeFunction1 */ return status; } /* USER CODE BEGIN 1 */ VOID USBX_APP_Device_Init(VOID) { /* USER CODE BEGIN USB_Device_Init_PreTreatment_0 */ /* USER CODE END USB_Device_Init_PreTreatment_0 */ /* USB_DRD_FS init function */ HAL_PWREx_EnableVddUSB(); /* USB_DRD_FS init function */ MX_USB_PCD_Init(); /* USER CODE BEGIN USB_Device_Init_PreTreatment_1 */ HAL_PCDEx_PMAConfig(&hpcd_USB_DRD_FS, 0x00, PCD_SNG_BUF, 0x14); HAL_PCDEx_PMAConfig(&hpcd_USB_DRD_FS, 0x80, PCD_SNG_BUF, 0x54); HAL_PCDEx_PMAConfig(&hpcd_USB_DRD_FS, 0x81, PCD_SNG_BUF, 0x94); HAL_PCDEx_PMAConfig(&hpcd_USB_DRD_FS, 0x01, PCD_SNG_BUF, 0xD4); HAL_PCDEx_PMAConfig(&hpcd_USB_DRD_FS, 0x82, PCD_SNG_BUF, 0x114); /* USER CODE END USB_Device_Init_PreTreatment_1 */ /* initialize the device controller driver*/ ux_dcd_stm32_initialize((ULONG)USB_DRD_FS, (ULONG)&hpcd_USB_DRD_FS); /* Start the USB device */ HAL_PCD_Start(&hpcd_USB_DRD_FS); /* USER CODE BEGIN USB_Device_Init_PostTreatment */ /* USER CODE END USB_Device_Init_PostTreatment */ } VOID USBX_Device_Process(VOID *arg) { ux_device_stack_tasks_run(); if(button_status) { usb_cdc_acm_send_data(); button_status = 0; } //USBX_DEVICE_HID_MOUSE_Task(); } void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin == GPIO_PIN_13) { button_status = 1; } } /* USER CODE END 1 */