2017-08-31 04:54:49 +01:00
|
|
|
/*
|
|
|
|
* This file is part of the MicroPython project, http://micropython.org/
|
|
|
|
*/
|
2018-02-15 04:47:04 +00:00
|
|
|
#ifndef MICROPY_INCLUDED_STM32_USBD_CDC_INTERFACE_H
|
|
|
|
#define MICROPY_INCLUDED_STM32_USBD_CDC_INTERFACE_H
|
2017-08-31 04:54:49 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
******************************************************************************
|
|
|
|
* @file USB_Device/CDC_Standalone/Inc/usbd_cdc_interface.h
|
|
|
|
* @author MCD Application Team
|
|
|
|
* @version V1.0.1
|
|
|
|
* @date 26-February-2014
|
|
|
|
* @brief Header for usbd_cdc_interface.c file.
|
|
|
|
******************************************************************************
|
|
|
|
* @attention
|
|
|
|
*
|
|
|
|
* <h2><center>© COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
|
|
|
|
*
|
|
|
|
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
|
|
|
|
* You may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at:
|
|
|
|
*
|
|
|
|
* http://www.st.com/software_license_agreement_liberty_v2
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*
|
|
|
|
******************************************************************************
|
|
|
|
*/
|
|
|
|
|
2021-08-05 03:21:58 +01:00
|
|
|
#include "py/mpconfig.h"
|
2017-08-31 04:54:49 +01:00
|
|
|
|
stm32/usbd_cdc_interface: Refactor USB CDC tx code to not use SOF IRQ.
Prior to this commit the USB CDC used the USB start-of-frame (SOF) IRQ to
regularly check if buffered data needed to be sent out to the USB host.
This wasted resources (CPU, power) if no data needed to be sent.
This commit changes how the USB CDC transmits buffered data:
- When new data is first available to send the data is queued immediately
on the USB IN endpoint, ready to be sent as soon as possible.
- Subsequent additions to the buffer (via usbd_cdc_try_tx()) will wait.
- When the low-level USB driver has finished sending out the data queued
in the USB IN endpoint it calls usbd_cdc_tx_ready() which immediately
queues any outstanding data, waiting for the next IN frame.
The benefits on this new approach are:
- SOF IRQ does not need to run continuously so device has a better chance
to sleep for longer, and be more responsive to other IRQs.
- Because SOF IRQ is off, current consumption is reduced by a small amount,
roughly 200uA when USB is connected (measured on PYBv1.0).
- CDC tx throughput (USB IN) on PYBv1.0 is about 2.3 faster (USB OUT is
unchanged).
- When USB is connected, Python code that is executing is slightly faster
because SOF IRQ no longer interrupts continuously.
- On F733 with USB HS, CDC tx throughput is about the same as prior to this
commit.
- On F733 with USB HS, Python code is about 5% faster because of no SOF.
As part of this refactor, the serial port should no longer echo initial
characters when the serial port is first opened (this only used to happen
rarely on USB FS, but on USB HS is was more evident).
2018-10-15 05:35:10 +01:00
|
|
|
// Values for connect_state
|
|
|
|
#define USBD_CDC_CONNECT_STATE_DISCONNECTED (0)
|
|
|
|
#define USBD_CDC_CONNECT_STATE_CONNECTING (1)
|
|
|
|
#define USBD_CDC_CONNECT_STATE_CONNECTED (2)
|
|
|
|
|
2018-12-14 06:07:12 +00:00
|
|
|
// Flow control settings
|
|
|
|
#define USBD_CDC_FLOWCONTROL_NONE (0)
|
|
|
|
#define USBD_CDC_FLOWCONTROL_RTS (1)
|
2019-04-24 01:24:24 +01:00
|
|
|
#define USBD_CDC_FLOWCONTROL_CTS (2)
|
2018-12-14 06:07:12 +00:00
|
|
|
|
2017-08-31 04:54:49 +01:00
|
|
|
typedef struct _usbd_cdc_itf_t {
|
2018-05-14 07:15:58 +01:00
|
|
|
usbd_cdc_state_t base; // state for the base CDC layer
|
2017-08-31 04:54:49 +01:00
|
|
|
|
2018-02-01 06:57:44 +00:00
|
|
|
uint8_t rx_packet_buf[CDC_DATA_MAX_PACKET_SIZE]; // received data from USB OUT endpoint is stored in this buffer
|
2021-08-05 03:21:58 +01:00
|
|
|
uint8_t rx_user_buf[MICROPY_HW_USB_CDC_RX_DATA_SIZE]; // received data is buffered here until the user reads it
|
2017-08-31 04:54:49 +01:00
|
|
|
volatile uint16_t rx_buf_put; // circular buffer index
|
|
|
|
uint16_t rx_buf_get; // circular buffer index
|
2018-12-14 06:07:12 +00:00
|
|
|
uint8_t rx_buf_full; // rx from host will be blocked while this is true
|
2017-08-31 04:54:49 +01:00
|
|
|
|
2021-08-05 03:21:58 +01:00
|
|
|
uint8_t tx_buf[MICROPY_HW_USB_CDC_TX_DATA_SIZE]; // data for USB IN endpoind is stored in this buffer
|
|
|
|
uint16_t tx_buf_ptr_in; // increment this pointer modulo MICROPY_HW_USB_CDC_TX_DATA_SIZE when new data is available
|
|
|
|
volatile uint16_t tx_buf_ptr_out; // increment this pointer modulo MICROPY_HW_USB_CDC_TX_DATA_SIZE when data is drained
|
2020-06-26 01:20:27 +01:00
|
|
|
uint16_t tx_buf_ptr_out_next; // next position of above once transmission finished
|
2017-08-31 04:54:49 +01:00
|
|
|
uint8_t tx_need_empty_packet; // used to flush the USB IN endpoint if the last packet was exactly the endpoint packet size
|
|
|
|
|
2021-05-19 14:43:21 +01:00
|
|
|
uint8_t cdc_idx; // between 0 and MICROPY_HW_USB_CDC_NUM-1
|
stm32/usbd_cdc_interface: Refactor USB CDC tx code to not use SOF IRQ.
Prior to this commit the USB CDC used the USB start-of-frame (SOF) IRQ to
regularly check if buffered data needed to be sent out to the USB host.
This wasted resources (CPU, power) if no data needed to be sent.
This commit changes how the USB CDC transmits buffered data:
- When new data is first available to send the data is queued immediately
on the USB IN endpoint, ready to be sent as soon as possible.
- Subsequent additions to the buffer (via usbd_cdc_try_tx()) will wait.
- When the low-level USB driver has finished sending out the data queued
in the USB IN endpoint it calls usbd_cdc_tx_ready() which immediately
queues any outstanding data, waiting for the next IN frame.
The benefits on this new approach are:
- SOF IRQ does not need to run continuously so device has a better chance
to sleep for longer, and be more responsive to other IRQs.
- Because SOF IRQ is off, current consumption is reduced by a small amount,
roughly 200uA when USB is connected (measured on PYBv1.0).
- CDC tx throughput (USB IN) on PYBv1.0 is about 2.3 faster (USB OUT is
unchanged).
- When USB is connected, Python code that is executing is slightly faster
because SOF IRQ no longer interrupts continuously.
- On F733 with USB HS, CDC tx throughput is about the same as prior to this
commit.
- On F733 with USB HS, Python code is about 5% faster because of no SOF.
As part of this refactor, the serial port should no longer echo initial
characters when the serial port is first opened (this only used to happen
rarely on USB FS, but on USB HS is was more evident).
2018-10-15 05:35:10 +01:00
|
|
|
volatile uint8_t connect_state; // indicates if we are connected
|
2018-05-14 14:44:45 +01:00
|
|
|
uint8_t attached_to_repl; // indicates if interface is connected to REPL
|
2018-12-14 06:07:12 +00:00
|
|
|
uint8_t flow; // USBD_CDC_FLOWCONTROL_* setting flags
|
2022-04-21 14:57:32 +01:00
|
|
|
uint32_t bitrate;
|
2017-08-31 04:54:49 +01:00
|
|
|
} usbd_cdc_itf_t;
|
|
|
|
|
2018-05-14 14:44:45 +01:00
|
|
|
// This is implemented in usb.c
|
|
|
|
usbd_cdc_itf_t *usb_vcp_get(int idx);
|
|
|
|
|
2017-08-31 04:54:49 +01:00
|
|
|
static inline int usbd_cdc_is_connected(usbd_cdc_itf_t *cdc) {
|
stm32/usbd_cdc_interface: Refactor USB CDC tx code to not use SOF IRQ.
Prior to this commit the USB CDC used the USB start-of-frame (SOF) IRQ to
regularly check if buffered data needed to be sent out to the USB host.
This wasted resources (CPU, power) if no data needed to be sent.
This commit changes how the USB CDC transmits buffered data:
- When new data is first available to send the data is queued immediately
on the USB IN endpoint, ready to be sent as soon as possible.
- Subsequent additions to the buffer (via usbd_cdc_try_tx()) will wait.
- When the low-level USB driver has finished sending out the data queued
in the USB IN endpoint it calls usbd_cdc_tx_ready() which immediately
queues any outstanding data, waiting for the next IN frame.
The benefits on this new approach are:
- SOF IRQ does not need to run continuously so device has a better chance
to sleep for longer, and be more responsive to other IRQs.
- Because SOF IRQ is off, current consumption is reduced by a small amount,
roughly 200uA when USB is connected (measured on PYBv1.0).
- CDC tx throughput (USB IN) on PYBv1.0 is about 2.3 faster (USB OUT is
unchanged).
- When USB is connected, Python code that is executing is slightly faster
because SOF IRQ no longer interrupts continuously.
- On F733 with USB HS, CDC tx throughput is about the same as prior to this
commit.
- On F733 with USB HS, Python code is about 5% faster because of no SOF.
As part of this refactor, the serial port should no longer echo initial
characters when the serial port is first opened (this only used to happen
rarely on USB FS, but on USB HS is was more evident).
2018-10-15 05:35:10 +01:00
|
|
|
return cdc->connect_state == USBD_CDC_CONNECT_STATE_CONNECTED;
|
2017-08-31 04:54:49 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
int usbd_cdc_tx_half_empty(usbd_cdc_itf_t *cdc);
|
2019-04-24 01:24:24 +01:00
|
|
|
int usbd_cdc_tx_flow(usbd_cdc_itf_t *cdc, const uint8_t *buf, uint32_t len);
|
2017-08-31 04:54:49 +01:00
|
|
|
int usbd_cdc_tx(usbd_cdc_itf_t *cdc, const uint8_t *buf, uint32_t len, uint32_t timeout);
|
|
|
|
void usbd_cdc_tx_always(usbd_cdc_itf_t *cdc, const uint8_t *buf, uint32_t len);
|
|
|
|
|
|
|
|
int usbd_cdc_rx_num(usbd_cdc_itf_t *cdc);
|
|
|
|
int usbd_cdc_rx(usbd_cdc_itf_t *cdc, uint8_t *buf, uint32_t len, uint32_t timeout);
|
2021-05-19 14:43:21 +01:00
|
|
|
void usbd_cdc_rx_event_callback(usbd_cdc_itf_t *cdc);
|
2017-08-31 04:54:49 +01:00
|
|
|
|
2018-02-15 04:47:04 +00:00
|
|
|
#endif // MICROPY_INCLUDED_STM32_USBD_CDC_INTERFACE_H
|