mirror of
https://github.com/armel/uv-k1-k5v3-firmware-custom.git
synced 2026-10-02 03:15:37 +00:00
VCP RX
This commit is contained in:
1 parent
85310ea8c1
commit
bbed36d997
4 files changed
+53
-5
No files matched your search
+10
-1
@@ -18,12 +18,21 @@
|
||||
#include "usb_config.h"
|
||||
#include "py32f071_ll_bus.h"
|
||||
|
||||
uint8_t VCP_RxBuf[256];
|
||||
uint32_t VCP_RxBufPointer = 0;
|
||||
|
||||
void VCP_Init()
|
||||
{
|
||||
// LL_APB1_GRP2_EnableClock(LL_APB1_GRP2_PERIPH_SYSCFG);
|
||||
LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA); // PA12:11
|
||||
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_USBD);
|
||||
|
||||
cdc_acm_init();
|
||||
cdc_acm_rx_buf_t rx_buf = {
|
||||
.buf = VCP_RxBuf,
|
||||
.size = sizeof(VCP_RxBuf),
|
||||
.write_pointer = &VCP_RxBufPointer,
|
||||
};
|
||||
cdc_acm_init(rx_buf);
|
||||
|
||||
NVIC_EnableIRQ(USBD_IRQn);
|
||||
}
|
||||
@@ -21,6 +21,9 @@
|
||||
#include <string.h>
|
||||
#include "usb_config.h"
|
||||
|
||||
extern uint8_t VCP_RxBuf[256];
|
||||
extern uint32_t VCP_RxBufPointer;
|
||||
|
||||
void VCP_Init();
|
||||
|
||||
static inline void VCP_Send(const uint8_t *Buf, uint32_t Size)
|
||||
|
||||
@@ -86,7 +86,14 @@
|
||||
|
||||
#define USBD_IRQHandler USB_IRQHandler
|
||||
|
||||
void cdc_acm_init(void);
|
||||
typedef struct
|
||||
{
|
||||
uint8_t *buf;
|
||||
uint32_t size;
|
||||
uint32_t *write_pointer;
|
||||
} cdc_acm_rx_buf_t;
|
||||
|
||||
void cdc_acm_init(cdc_acm_rx_buf_t rx_buf);
|
||||
void cdc_acm_data_send_with_dtr(const uint8_t *buf, uint32_t size);
|
||||
|
||||
|
||||
|
||||
+32
-3
@@ -89,6 +89,8 @@ static const uint8_t cdc_descriptor[] = {
|
||||
USB_MEM_ALIGNX uint8_t read_buffer[128];
|
||||
USB_MEM_ALIGNX uint8_t write_buffer[4];
|
||||
|
||||
static cdc_acm_rx_buf_t client_rx_buf = {0};
|
||||
|
||||
volatile bool ep_tx_busy_flag = false;
|
||||
|
||||
#ifdef CONFIG_USB_HS
|
||||
@@ -100,13 +102,37 @@ volatile bool ep_tx_busy_flag = false;
|
||||
void usbd_configure_done_callback(void)
|
||||
{
|
||||
/* setup first out ep read transfer */
|
||||
usbd_ep_start_read(CDC_OUT_EP, read_buffer, 128);
|
||||
usbd_ep_start_read(CDC_OUT_EP, read_buffer, sizeof(read_buffer));
|
||||
}
|
||||
|
||||
void usbd_cdc_acm_bulk_out(uint8_t ep, uint32_t nbytes)
|
||||
{
|
||||
cdc_acm_rx_buf_t *rx_buf = &client_rx_buf;
|
||||
if (nbytes && rx_buf->buf)
|
||||
{
|
||||
const uint8_t *buf = read_buffer;
|
||||
uint32_t pointer = *rx_buf->write_pointer;
|
||||
while (nbytes)
|
||||
{
|
||||
const uint32_t rem = rx_buf->size - pointer;
|
||||
if (0 == rem)
|
||||
{
|
||||
pointer = 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
uint32_t size = rem < nbytes ? rem : nbytes;
|
||||
memcpy(rx_buf->buf + pointer, buf, size);
|
||||
buf += size;
|
||||
nbytes -= size;
|
||||
pointer += size;
|
||||
}
|
||||
|
||||
*rx_buf->write_pointer = pointer;
|
||||
}
|
||||
|
||||
/* setup next out ep read transfer */
|
||||
usbd_ep_start_read(CDC_OUT_EP, read_buffer, 128);
|
||||
usbd_ep_start_read(CDC_OUT_EP, read_buffer, sizeof(read_buffer));
|
||||
}
|
||||
|
||||
void usbd_cdc_acm_bulk_in(uint8_t ep, uint32_t nbytes)
|
||||
@@ -133,8 +159,11 @@ struct usbd_endpoint cdc_in_ep = {
|
||||
struct usbd_interface intf0;
|
||||
struct usbd_interface intf1;
|
||||
|
||||
void cdc_acm_init(void)
|
||||
void cdc_acm_init(cdc_acm_rx_buf_t rx_buf)
|
||||
{
|
||||
client_rx_buf = rx_buf;
|
||||
*client_rx_buf.write_pointer = 0;
|
||||
|
||||
usbd_desc_register(cdc_descriptor);
|
||||
usbd_add_interface(usbd_cdc_acm_init_intf(&intf0));
|
||||
usbd_add_interface(usbd_cdc_acm_init_intf(&intf1));
|
||||
|
||||
Reference in new issue
Block a user