/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file ux_device_cdc_acm.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 "ux_device_cdc_acm.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include #include "devices/usbcdc.h" /* 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 PV */ UX_SLAVE_CLASS_CDC_ACM *cdc_acm; /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ /* USER CODE BEGIN PFP */ UINT USBD_CDC_TX_CMPLT(struct UX_SLAVE_CLASS_CDC_ACM_STRUCT *cdc_acm, UINT status, ULONG length); UINT USBD_CDC_RX(struct UX_SLAVE_CLASS_CDC_ACM_STRUCT *cdc_acm, UINT status, UCHAR *data_pointer, ULONG length); /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ /** * @brief USBD_CDC_ACM_Activate * This function is called when insertion of a CDC ACM device. * @param cdc_acm_instance: Pointer to the cdc acm class instance. * @retval none */ VOID USBD_CDC_ACM_Activate(VOID *cdc_acm_instance) { /* USER CODE BEGIN USBD_CDC_ACM_Activate */ // grab a reference to cdc instance cdc_acm = (UX_SLAVE_CLASS_CDC_ACM*) cdc_acm_instance; // set virtual com port parameters UX_SLAVE_CLASS_CDC_ACM_LINE_CODING_PARAMETER CDC_VCP_LineCoding = { 230400, /* baud rate */ 0x00, /* stop bits-1 */ 0x00, /* parity - none */ 0x08 /* nb. of bits 8 */ }; if (ux_device_class_cdc_acm_ioctl(cdc_acm, UX_SLAVE_CLASS_CDC_ACM_IOCTL_SET_LINE_CODING, &CDC_VCP_LineCoding) != UX_SUCCESS) assert(0 && "failed to set vcp params"); // register tx and rx callbacks UX_SLAVE_CLASS_CDC_ACM_CALLBACK_PARAMETER callbacks = { .ux_device_class_cdc_acm_parameter_write_callback = USBD_CDC_TX_CMPLT, .ux_device_class_cdc_acm_parameter_read_callback = USBD_CDC_RX }; if (ux_device_class_cdc_acm_ioctl(cdc_acm, UX_SLAVE_CLASS_CDC_ACM_IOCTL_TRANSMISSION_START, &callbacks) != UX_SUCCESS) assert(0 && "failed to set cdc callbacks"); // init app layer cdc functionality usbcdc_handleInit(); /* USER CODE END USBD_CDC_ACM_Activate */ return; } /** * @brief USBD_CDC_ACM_Deactivate * This function is called when extraction of a CDC ACM device. * @param cdc_acm_instance: Pointer to the cdc acm class instance. * @retval none */ VOID USBD_CDC_ACM_Deactivate(VOID *cdc_acm_instance) { /* USER CODE BEGIN USBD_CDC_ACM_Deactivate */ // reset cdc instance cdc_acm = UX_NULL; usbcdc_handleDeinit(); /* USER CODE END USBD_CDC_ACM_Deactivate */ return; } /** * @brief USBD_CDC_ACM_ParameterChange * This function is invoked to manage the CDC ACM class requests. * @param cdc_acm_instance: Pointer to the cdc acm class instance. * @retval none */ VOID USBD_CDC_ACM_ParameterChange(VOID *cdc_acm_instance) { /* USER CODE BEGIN USBD_CDC_ACM_ParameterChange */ ULONG request; UX_SLAVE_TRANSFER *transfer_request; UX_SLAVE_DEVICE *device; // get the pointer to the device device = &_ux_system_slave -> ux_system_slave_device; // get the pointer to the transfer request associated with the control endpoint transfer_request = &device -> ux_slave_device_control_endpoint.ux_slave_endpoint_transfer_request; request = *(transfer_request -> ux_slave_transfer_request_setup + UX_SETUP_REQUEST); switch (request) { case UX_SLAVE_CLASS_CDC_ACM_SET_CONTROL_LINE_STATE: { UX_SLAVE_CLASS_CDC_ACM_LINE_STATE_PARAMETER lineState; if (ux_device_class_cdc_acm_ioctl(cdc_acm, UX_SLAVE_CLASS_CDC_ACM_IOCTL_GET_LINE_STATE, &lineState) != UX_SUCCESS) assert(0 && "failed to get line state"); usbcdc_handleSetControlLineStateUsbx(lineState.ux_slave_class_cdc_acm_parameter_dtr); } break; default: break; } /* USER CODE END USBD_CDC_ACM_ParameterChange */ return; } /* USER CODE BEGIN 1 */ // todopk maybe do some checks on cdc_acm? UINT USBD_CDC_TX_CMPLT(struct UX_SLAVE_CLASS_CDC_ACM_STRUCT *cdc_acm, UINT status, ULONG length) { usbcdc_handleTransmitComplete(); return length; } // todopk maybe check status? UINT USBD_CDC_RX(struct UX_SLAVE_CLASS_CDC_ACM_STRUCT *cdc_acm, UINT status, UCHAR *data_pointer, ULONG length) { usbcdc_handleReceive(data_pointer, length); return length; } /* TODOPK 1. need to use this function to register a callback ux_device_class_cdc_acm_ioctl using parameter UX_SLAVE_CLASS_CDC_ACM_IOCTL_TRANSMISSION_START - this will register our rx and tx callbacks 2. use this function to write to the HOST ux_device_class_cdc_acm_write_with_callback */ /* USER CODE END 1 */