diff --git a/f4/usb/include/usb_hs.h b/f4/usb/include/usb_hs.h new file mode 100644 index 0000000000000000000000000000000000000000..726768d7525ea1bc26e02aef1d261007b2ba131b --- /dev/null +++ b/f4/usb/include/usb_hs.h @@ -0,0 +1,22 @@ +#ifndef USB_F4_H +#define USB_F4_H + +#include "stm32f4xx_hal.h" +#include "comm.h" +#include "usbd_def.h" + +/* public functions */ +void usb_init(TComm *comm_dev,USBD_DescriptorsTypeDef *pdesc,USBD_ClassTypeDef *pclass); +void usb_disconnect(void); +void usb_connect(void); +/* IRQ functions */ +unsigned char usb_send_irq(unsigned char first_byte); +unsigned char usb_enable_tx_irq(void); +unsigned char usb_receive_irq(void); +unsigned char usb_cancel_receive_irq(void); +/* DMA functions */ +unsigned char usb_send_dma(unsigned char *data,unsigned short int length); +unsigned char usb_receive_dma(unsigned char *data,unsigned short int length); +unsigned char usb_cancel_receive_dma(void); + +#endif diff --git a/f4/usb/src/usb_hs.c b/f4/usb/src/usb_hs.c new file mode 100644 index 0000000000000000000000000000000000000000..0eed55974b655843c3986b865ce732853f4a5966 --- /dev/null +++ b/f4/usb/src/usb_hs.c @@ -0,0 +1,305 @@ +#include "usb.h" +#include "usbd_cdc.h" + +#define RX_DATA_SIZE 1024 +#define TX_DATA_SIZE 1024 + +// private variables +extern PCD_HandleTypeDef hpcd_USB_OTG_HS; +USBD_HandleTypeDef USBHandle; +TComm *usb_comm_dev; +uint8_t usb_rx_buffer[RX_DATA_SIZE]; +uint8_t usb_tx_buffer[TX_DATA_SIZE]; +unsigned char usb_dma_phase; +unsigned char *usb_dma_phase_data; +unsigned short int usb_dma_phase_length; +unsigned short int usb_dma_phase_write_ptr; + +// private functions +/** + * @brief CDC_Init_FS + * Initializes the CDC media low layer over the FS USB IP + * @param None + * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL + */ +static int8_t usb_cdc_init(void) +{ + /* USER CODE BEGIN 3 */ + /* Set Application Buffers */ + USBD_CDC_SetTxBuffer(&USBHandle, usb_tx_buffer, 0); + USBD_CDC_SetRxBuffer(&USBHandle, usb_rx_buffer); + + /* initialize internal variables */ + usb_dma_phase=0x00; + usb_dma_phase_data=0x00; + usb_dma_phase_length=0; + usb_dma_phase_write_ptr=0; + + return (USBD_OK); + /* USER CODE END 3 */ +} + +/** + * @brief CDC_DeInit_FS + * DeInitializes the CDC media low layer + * @param None + * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL + */ +static int8_t usb_cdc_deinit(void) +{ + /* USER CODE BEGIN 4 */ + return (USBD_OK); + /* USER CODE END 4 */ +} + +/** + * @brief CDC_Control_FS + * 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 usb_cdc_control(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: + pbuf[0]=(uint8_t)115200; + pbuf[1]=(uint8_t)(115200>>8); + pbuf[2]=(uint8_t)(115200>>16); + pbuf[3]=(uint8_t)(115200>>24); + pbuf[4]=0; + pbuf[5]=0; + pbuf[6]=8; + break; + + case CDC_SET_CONTROL_LINE_STATE: + break; + + case CDC_SEND_BREAK: + break; + + default: + break; + } + + return (USBD_OK); + /* USER CODE END 5 */ +} + +/** + * @brief CDC_Receive_FS + * Data received over USB OUT endpoint are sent over CDC interface + * through this function. + * + * @note + * This function will block any OUT packet reception on USB endpoint + * untill exiting this function. If you exit this function before transfer + * is complete on CDC interface (ie. using DMA controller) it will result + * in receiving more data while previous ones are still not sent. + * + * @param Buf: Buffer of data to be received + * @param Len: Number of data received (in bytes) + * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL + */ +static int8_t usb_cdc_receive(uint8_t* Buf, uint32_t *Len) +{ + int i=0; + +/* USER CODE BEGIN 6 */ + for(i=0;i<(*Len);i++) + { + if(!usb_dma_phase) + comm_do_irq_receive(usb_comm_dev,Buf[i]); + else /* do DMA phase */ + { + usb_dma_phase_data[usb_dma_phase_write_ptr]=Buf[i]; + usb_dma_phase_length--; + usb_dma_phase_write_ptr++; + if(usb_dma_phase_length==0) + comm_do_dma_receive(usb_comm_dev); + } + } + USBD_CDC_SetRxBuffer(&USBHandle, &Buf[0]); + USBD_CDC_ReceivePacket(&USBHandle); + + return (USBD_OK); + /* USER CODE END 6 */ +} + +USBD_CDC_ItfTypeDef usb_cdc_ops = +{ + usb_cdc_init, + usb_cdc_deinit, + usb_cdc_control, + usb_cdc_receive +}; + +// interrupt handlers +void OTG_HS_EP1_OUT_IRQHandler(void) +{ + /* USER CODE BEGIN OTG_HS_EP1_OUT_IRQn 0 */ + + /* USER CODE END OTG_HS_EP1_OUT_IRQn 0 */ + HAL_PCD_IRQHandler(&hpcd_USB_OTG_HS); + /* USER CODE BEGIN OTG_HS_EP1_OUT_IRQn 1 */ + + /* USER CODE END OTG_HS_EP1_OUT_IRQn 1 */ +} + +void OTG_HS_EP1_IN_IRQHandler(void) +{ + /* USER CODE BEGIN OTG_HS_EP1_IN_IRQn 0 */ + + /* USER CODE END OTG_HS_EP1_IN_IRQn 0 */ + HAL_PCD_IRQHandler(&hpcd_USB_OTG_HS); + /* USER CODE BEGIN OTG_HS_EP1_IN_IRQn 1 */ + + /* USER CODE END OTG_HS_EP1_IN_IRQn 1 */ +} + +void OTG_HS_IRQHandler(void) +{ + /* USER CODE BEGIN OTG_HS_IRQn 0 */ + + /* USER CODE END OTG_HS_IRQn 0 */ + HAL_PCD_IRQHandler(&hpcd_USB_OTG_HS); + /* USER CODE BEGIN OTG_HS_IRQn 1 */ + + /* USER CODE END OTG_HS_IRQn 1 */ +} + +/* public functions*/ +void usb_init(TComm *comm_dev,USBD_DescriptorsTypeDef *pdesc,USBD_ClassTypeDef *pclass) +{ + /* Initialize the comm structure */ + comm_dev->send_irq=usb_send_irq; + comm_dev->enable_tx_irq=usb_enable_tx_irq; + comm_dev->receive_irq=usb_receive_irq; + comm_dev->cancel_receive_irq=usb_cancel_receive_irq; + if(comm_dev->use_dma) + { + comm_dev->send_dma=usb_send_dma; + comm_dev->receive_dma=usb_receive_dma; + comm_dev->cancel_receive_dma=usb_cancel_receive_dma; + } + comm_dev->irq_send_cb=0x00000000; + comm_dev->irq_receive_cb=0x00000000; + comm_dev->dma_send_cb=0x00000000; + comm_dev->dma_receive_cb=0x00000000; + + /* initialize internal variables */ + usb_comm_dev=comm_dev; + + /* initialize and start the USB device */ + USBD_Init(&USBHandle,pdesc,DEVICE_HS); + USBD_RegisterClass(&USBHandle,pclass); + USBD_CDC_RegisterInterface(&USBHandle,&usb_cdc_ops); + USBD_Start(&USBHandle); +} + +void usb_disconnect(void) +{ + HAL_PCD_DevDisconnect(&hpcd_USB_OTG_HS); +} + +void usb_connect(void) +{ + HAL_PCD_DevConnect(&hpcd_USB_OTG_HS); +} + +/* IRQ functions */ +unsigned char usb_send_irq(unsigned char first_byte) +{ + return 0x00; +} + +unsigned char usb_enable_tx_irq(void) +{ + return 0x00; +} + +unsigned char usb_receive_irq(void) +{ + usb_dma_phase=0x00; + + return 0x00; +} + +unsigned char usb_cancel_receive_irq(void) +{ + return 0x00; +} + +/* DMA functions */ +unsigned char usb_send_dma(unsigned char *data,unsigned short int length) +{ + uint8_t byte; + + /* USER CODE BEGIN 7 */ + USBD_CDC_SetTxBuffer(&USBHandle,data,length); + USBD_CDC_TransmitPacket(&USBHandle); + /* force the tx completion */ + comm_do_dma_send(usb_comm_dev); + comm_do_irq_send(usb_comm_dev,&byte); + /* USER CODE END 7 */ + + return 0x00; +} + +unsigned char usb_receive_dma(unsigned char *data,unsigned short int length) +{ + usb_dma_phase=0x01; + usb_dma_phase_data=data; + usb_dma_phase_length=length; + usb_dma_phase_write_ptr=0; + + return 0x00; +} + +unsigned char usb_cancel_receive_dma(void) +{ + usb_dma_phase=0x00; + usb_dma_phase_data=0x00; + usb_dma_phase_length=0; + usb_dma_phase_write_ptr=0; + + return 0x00; +} +