summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsakimisu <[email protected]>2022-12-11 21:19:48 +0800
committersakimisu <[email protected]>2022-12-11 21:43:29 +0800
commit43a45fc2fca33c0e2682ba1874ab93bdf6e318a3 (patch)
tree628ae2800ed793dcc051c05e159664a4b23218eb
parent52edc32521425bd201e7d82accefedca64c5c8f7 (diff)
add usb tx rx thread for device
-rw-r--r--cherryusb_config_template.h23
-rw-r--r--class/msc/usbd_msc.c114
-rw-r--r--core/usbd_core.c174
-rw-r--r--demo/stm32/usb_device/stm32f429igt6/Core/Inc/usb_config.h11
-rw-r--r--demo/stm32/usb_device/stm32f429igt6/Core/Src/main.c7
-rw-r--r--demo/stm32/usb_device/stm32f429igt6/Core/Src/stm32f4xx_it.c40
-rw-r--r--demo/stm32/usb_device/stm32f429igt6/MDK-ARM/stm32f429igt6.uvoptx146
-rw-r--r--demo/stm32/usb_device/stm32f429igt6/MDK-ARM/stm32f429igt6.uvprojx57
8 files changed, 376 insertions, 196 deletions
diff --git a/cherryusb_config_template.h b/cherryusb_config_template.h
index 97d724ca..adec67eb 100644
--- a/cherryusb_config_template.h
+++ b/cherryusb_config_template.h
@@ -44,6 +44,17 @@
/* Enable test mode */
// #define CONFIG_USBDEV_TEST_MODE
+//#define CONFIG_USBDEV_TX_RX_THREAD
+
+#ifdef CONFIG_USBDEV_TX_RX_THREAD
+#ifndef CONFIG_USBDEV_TX_RX_PRIO
+#define CONFIG_USBDEV_TX_RX_PRIO 4
+#endif
+#ifndef CONFIG_USBDEV_TX_RX_STACKSIZE
+#define CONFIG_USBDEV_TX_RX_STACKSIZE 2048
+#endif
+#endif
+
#ifndef CONFIG_USBDEV_MSC_BLOCK_SIZE
#define CONFIG_USBDEV_MSC_BLOCK_SIZE 512
#endif
@@ -60,18 +71,6 @@
#define CONFIG_USBDEV_MSC_VERSION_STRING "0.01"
#endif
-// #define CONFIG_USBDEV_MSC_THREAD
-
-#ifdef CONFIG_USBDEV_MSC_THREAD
-#ifndef CONFIG_USBDEV_MSC_STACKSIZE
-#define CONFIG_USBDEV_MSC_STACKSIZE 2048
-#endif
-
-#ifndef CONFIG_USBDEV_MSC_PRIO
-#define CONFIG_USBDEV_MSC_PRIO 4
-#endif
-#endif
-
#ifndef CONFIG_USBDEV_AUDIO_VERSION
#define CONFIG_USBDEV_AUDIO_VERSION 0x0100
#endif
diff --git a/class/msc/usbd_msc.c b/class/msc/usbd_msc.c
index 9655c951..2220e112 100644
--- a/class/msc/usbd_msc.c
+++ b/class/msc/usbd_msc.c
@@ -6,13 +6,6 @@
#include "usbd_core.h"
#include "usbd_msc.h"
#include "usb_scsi.h"
-#ifdef CONFIG_USBDEV_MSC_THREAD
-#include "usb_osal.h"
-#endif
-
-#define MSC_THREAD_OP_READ_MEM 1
-#define MSC_THREAD_OP_WRITE_MEM 2
-#define MSC_THREAD_OP_WRITE_DONE 3
#define MSD_OUT_EP_IDX 0
#define MSD_IN_EP_IDX 1
@@ -49,13 +42,6 @@ USB_NOCACHE_RAM_SECTION struct usbd_msc_cfg_priv {
uint8_t block_buffer[CONFIG_USBDEV_MSC_BLOCK_SIZE];
} usbd_msc_cfg;
-#ifdef CONFIG_USBDEV_MSC_THREAD
-static volatile uint8_t thread_op;
-static usb_osal_sem_t msc_sem;
-static usb_osal_thread_t msc_thread;
-static volatile uint32_t current_byte_read;
-#endif
-
static void usbd_msc_reset(void)
{
usbd_msc_cfg.stage = MSC_READ_CBW;
@@ -635,17 +621,11 @@ static bool SCSI_processRead(void)
transfer_len = MIN(usbd_msc_cfg.nsectors * usbd_msc_cfg.scsi_blk_size, CONFIG_USBDEV_MSC_BLOCK_SIZE);
- /* Start reading one sector */
-#ifdef CONFIG_USBDEV_MSC_THREAD
- thread_op = MSC_THREAD_OP_READ_MEM;
- usb_osal_sem_give(msc_sem);
- return true;
-#else
if (usbd_msc_sector_read(usbd_msc_cfg.start_sector, usbd_msc_cfg.block_buffer, transfer_len) != 0) {
SCSI_SetSenseData(SCSI_KCQHE_UREINRESERVEDAREA);
return false;
}
-#endif
+
usbd_ep_start_write(mass_ep_data[MSD_IN_EP_IDX].ep_addr, usbd_msc_cfg.block_buffer, transfer_len);
usbd_msc_cfg.start_sector += (transfer_len / usbd_msc_cfg.scsi_blk_size);
@@ -659,47 +639,15 @@ static bool SCSI_processRead(void)
return true;
}
-#ifdef CONFIG_USBDEV_MSC_THREAD
-static void usbd_msc_thread_memory_read_done(void)
-{
- size_t flags;
- uint32_t transfer_len;
-
- flags = usb_osal_enter_critical_section();
-
- transfer_len = MIN(usbd_msc_cfg.nsectors * usbd_msc_cfg.scsi_blk_size, CONFIG_USBDEV_MSC_BLOCK_SIZE);
-
- usbd_ep_start_write(mass_ep_data[MSD_IN_EP_IDX].ep_addr,
- usbd_msc_cfg.block_buffer, transfer_len);
-
- usbd_msc_cfg.start_sector += (transfer_len / usbd_msc_cfg.scsi_blk_size);
- usbd_msc_cfg.nsectors -= (transfer_len / usbd_msc_cfg.scsi_blk_size);
- usbd_msc_cfg.csw.dDataResidue -= transfer_len;
-
- if (usbd_msc_cfg.nsectors == 0) {
- usbd_msc_cfg.stage = MSC_SEND_CSW;
- }
- usb_osal_leave_critical_section(flags);
-}
-#endif
-
static bool SCSI_processWrite(uint32_t nbytes)
{
uint32_t data_len = 0;
USB_LOG_DBG("write lba:%d\r\n", usbd_msc_cfg.start_sector);
- /* Start writing one sector */
-#ifdef CONFIG_USBDEV_MSC_THREAD
- thread_op = MSC_THREAD_OP_WRITE_MEM;
- current_byte_read = nbytes;
- usb_osal_sem_give(msc_sem);
- return true;
-#else
if (usbd_msc_sector_write(usbd_msc_cfg.start_sector, usbd_msc_cfg.block_buffer, nbytes) != 0) {
SCSI_SetSenseData(SCSI_KCQHE_WRITEFAULT);
return false;
}
-#endif
usbd_msc_cfg.start_sector += (nbytes / usbd_msc_cfg.scsi_blk_size);
usbd_msc_cfg.nsectors -= (nbytes / usbd_msc_cfg.scsi_blk_size);
@@ -715,29 +663,6 @@ static bool SCSI_processWrite(uint32_t nbytes)
return true;
}
-#ifdef CONFIG_USBDEV_MSC_THREAD
-static void usbd_msc_thread_memory_write_done()
-{
- size_t flags;
- uint32_t data_len = 0;
-
- flags = usb_osal_enter_critical_section();
-
- usbd_msc_cfg.start_sector += (current_byte_read / usbd_msc_cfg.scsi_blk_size);
- usbd_msc_cfg.nsectors -= (current_byte_read / usbd_msc_cfg.scsi_blk_size);
- usbd_msc_cfg.csw.dDataResidue -= current_byte_read;
-
- if (usbd_msc_cfg.nsectors == 0) {
- usbd_msc_send_csw(CSW_STATUS_CMD_PASSED);
- } else {
- data_len = MIN(usbd_msc_cfg.nsectors * usbd_msc_cfg.scsi_blk_size, CONFIG_USBDEV_MSC_BLOCK_SIZE);
- usbd_ep_start_read(mass_ep_data[MSD_OUT_EP_IDX].ep_addr, usbd_msc_cfg.block_buffer, data_len);
- }
-
- usb_osal_leave_critical_section(flags);
-}
-#endif
-
static bool SCSI_CBWDecode(uint32_t nbytes)
{
uint8_t *buf2send = usbd_msc_cfg.block_buffer;
@@ -883,35 +808,6 @@ void mass_storage_bulk_in(uint8_t ep, uint32_t nbytes)
}
}
-#ifdef CONFIG_USBDEV_MSC_THREAD
-static void usbd_msc_thread(void *argument)
-{
- uint32_t data_len = 0;
- while (1) {
- usb_osal_sem_take(msc_sem, 0xffffffff);
-
- switch (thread_op) {
- case MSC_THREAD_OP_READ_MEM:
- data_len = MIN(usbd_msc_cfg.nsectors * usbd_msc_cfg.scsi_blk_size, CONFIG_USBDEV_MSC_BLOCK_SIZE);
- if (usbd_msc_sector_read(usbd_msc_cfg.start_sector, usbd_msc_cfg.block_buffer, data_len) != 0) {
- SCSI_SetSenseData(SCSI_KCQHE_UREINRESERVEDAREA);
- }
- usbd_msc_thread_memory_read_done();
- break;
- case MSC_THREAD_OP_WRITE_MEM:
- data_len = MIN(usbd_msc_cfg.nsectors * usbd_msc_cfg.scsi_blk_size, CONFIG_USBDEV_MSC_BLOCK_SIZE);
- if (usbd_msc_sector_write(usbd_msc_cfg.start_sector, usbd_msc_cfg.block_buffer, data_len) != 0) {
- SCSI_SetSenseData(SCSI_KCQHE_WRITEFAULT);
- }
- usbd_msc_thread_memory_write_done();
- break;
- default:
- break;
- }
- }
-}
-#endif
-
struct usbd_interface *usbd_msc_init_intf(struct usbd_interface *intf, const uint8_t out_ep, const uint8_t in_ep)
{
intf->class_interface_handler = msc_storage_class_interface_request_handler;
@@ -935,14 +831,6 @@ struct usbd_interface *usbd_msc_init_intf(struct usbd_interface *intf, const uin
USB_LOG_ERR("msc block buffer overflow\r\n");
return NULL;
}
-#ifdef CONFIG_USBDEV_MSC_THREAD
- msc_sem = usb_osal_sem_create(1);
- msc_thread = usb_osal_thread_create("usbd_msc", CONFIG_USBDEV_MSC_STACKSIZE, CONFIG_USBDEV_MSC_PRIO, usbd_msc_thread, NULL);
- if (msc_thread == NULL) {
- USB_LOG_ERR("no enough memory to alloc msc thread\r\n");
- return NULL;
- }
-#endif
return intf;
}
diff --git a/core/usbd_core.c b/core/usbd_core.c
index 2fc8a363..1d4e57b3 100644
--- a/core/usbd_core.c
+++ b/core/usbd_core.c
@@ -6,6 +6,9 @@
* SPDX-License-Identifier: Apache-2.0
*/
#include "usbd_core.h"
+#ifdef CONFIG_USBDEV_TX_RX_THREAD
+#include "usb_osal.h"
+#endif
/* general descriptor field offsets */
#define DESC_bLength 0 /** Length offset */
@@ -23,6 +26,12 @@
#define USB_EP_OUT_NUM 8
#define USB_EP_IN_NUM 8
+struct usbd_tx_rx_msg {
+ uint8_t ep;
+ uint32_t nbytes;
+ usbd_endpoint_callback cb;
+};
+
USB_NOCACHE_RAM_SECTION struct usbd_core_cfg_priv {
/** Setup packet */
USB_MEM_ALIGNX struct usb_setup_packet setup;
@@ -43,9 +52,6 @@ USB_NOCACHE_RAM_SECTION struct usbd_core_cfg_priv {
/* Buffer used for storing standard, class and vendor request data */
USB_MEM_ALIGNX uint8_t req_data[CONFIG_USBDEV_REQUEST_BUFFER_LEN];
- usbd_endpoint_callback in_ep_cb[USB_EP_IN_NUM];
- usbd_endpoint_callback out_ep_cb[USB_EP_OUT_NUM];
-
/** Variable to check whether the usb has been configured */
bool configured;
/** Currently selected configuration */
@@ -63,6 +69,14 @@ static struct usb_msosv1_descriptor *msosv1_desc;
static struct usb_msosv2_descriptor *msosv2_desc;
static struct usb_bos_descriptor *bos_desc;
+struct usbd_tx_rx_msg tx_msg[USB_EP_IN_NUM];
+struct usbd_tx_rx_msg rx_msg[USB_EP_OUT_NUM];
+
+#ifdef CONFIG_USBDEV_TX_RX_THREAD
+usb_osal_mq_t usbd_tx_rx_mq;
+usb_osal_thread_t usbd_tx_rx_thread;
+#endif
+
static void usbd_class_event_notify_handler(uint8_t event, void *arg);
static void usbd_print_setup(struct usb_setup_packet *setup)
@@ -1023,90 +1037,130 @@ void usbd_event_ep0_setup_complete_handler(uint8_t *psetup)
}
}
-void usbd_event_ep_in_complete_handler(uint8_t ep, uint32_t nbytes)
+void usbd_event_ep0_in_complete_handler(uint8_t ep, uint32_t nbytes)
{
- if (ep == USB_CONTROL_IN_EP0) {
- struct usb_setup_packet *setup = &usbd_core_cfg.setup;
+ struct usb_setup_packet *setup = &usbd_core_cfg.setup;
- usbd_core_cfg.ep0_data_buf += nbytes;
- usbd_core_cfg.ep0_data_buf_residue -= nbytes;
+ usbd_core_cfg.ep0_data_buf += nbytes;
+ usbd_core_cfg.ep0_data_buf_residue -= nbytes;
- USB_LOG_DBG("EP0 send %d bytes, %d remained\r\n", nbytes, usbd_core_cfg.ep0_data_buf_residue);
+ USB_LOG_DBG("EP0 send %d bytes, %d remained\r\n", nbytes, usbd_core_cfg.ep0_data_buf_residue);
- if (usbd_core_cfg.ep0_data_buf_residue != 0) {
- /* Start sending the remain data */
- usbd_ep_start_write(USB_CONTROL_IN_EP0, usbd_core_cfg.ep0_data_buf, usbd_core_cfg.ep0_data_buf_residue);
+ if (usbd_core_cfg.ep0_data_buf_residue != 0) {
+ /* Start sending the remain data */
+ usbd_ep_start_write(USB_CONTROL_IN_EP0, usbd_core_cfg.ep0_data_buf, usbd_core_cfg.ep0_data_buf_residue);
+ } else {
+ if (usbd_core_cfg.zlp_flag == true) {
+ usbd_core_cfg.zlp_flag = false;
+ /* Send zlp to host */
+ USB_LOG_DBG("EP0 Send zlp\r\n");
+ usbd_ep_start_write(USB_CONTROL_IN_EP0, NULL, 0);
} else {
- if (usbd_core_cfg.zlp_flag == true) {
- usbd_core_cfg.zlp_flag = false;
- /* Send zlp to host */
- USB_LOG_DBG("EP0 Send zlp\r\n");
- usbd_ep_start_write(USB_CONTROL_IN_EP0, NULL, 0);
- } else {
- /* Satisfying three conditions will jump here.
+ /* Satisfying three conditions will jump here.
* 1. send status completely
* 2. send zlp completely
* 3. send last data completely.
*/
- if (setup->wLength && ((setup->bmRequestType & USB_REQUEST_DIR_MASK) == USB_REQUEST_DIR_IN)) {
- /* if all data has sent completely, start reading out status */
- usbd_ep_start_read(USB_CONTROL_OUT_EP0, NULL, 0);
- }
+ if (setup->wLength && ((setup->bmRequestType & USB_REQUEST_DIR_MASK) == USB_REQUEST_DIR_IN)) {
+ /* if all data has sent completely, start reading out status */
+ usbd_ep_start_read(USB_CONTROL_OUT_EP0, NULL, 0);
}
}
- } else {
- if (usbd_core_cfg.in_ep_cb[ep & 0x7f]) {
- usbd_core_cfg.in_ep_cb[ep & 0x7f](ep, nbytes);
- }
}
}
-void usbd_event_ep_out_complete_handler(uint8_t ep, uint32_t nbytes)
+void usbd_event_ep0_out_complete_handler(uint8_t ep, uint32_t nbytes)
{
- if (ep == USB_CONTROL_OUT_EP0) {
- struct usb_setup_packet *setup = &usbd_core_cfg.setup;
-
- if (nbytes > 0) {
- usbd_core_cfg.ep0_data_buf += nbytes;
- usbd_core_cfg.ep0_data_buf_residue -= nbytes;
+ struct usb_setup_packet *setup = &usbd_core_cfg.setup;
- USB_LOG_DBG("EP0 recv %d bytes, %d remained\r\n", nbytes, usbd_core_cfg.ep0_data_buf_residue);
+ if (nbytes > 0) {
+ usbd_core_cfg.ep0_data_buf += nbytes;
+ usbd_core_cfg.ep0_data_buf_residue -= nbytes;
- if (usbd_core_cfg.ep0_data_buf_residue == 0) {
- /* Received all, send data to handler */
- usbd_core_cfg.ep0_data_buf = usbd_core_cfg.req_data;
- if (!usbd_setup_request_handler(setup, &usbd_core_cfg.ep0_data_buf, &usbd_core_cfg.ep0_data_buf_len)) {
- usbd_ep_set_stall(USB_CONTROL_IN_EP0);
- return;
- }
+ USB_LOG_DBG("EP0 recv %d bytes, %d remained\r\n", nbytes, usbd_core_cfg.ep0_data_buf_residue);
- /*Send status to host*/
- usbd_ep_start_write(USB_CONTROL_IN_EP0, NULL, 0);
- } else {
- /* Start reading the remain data */
- usbd_ep_start_read(USB_CONTROL_OUT_EP0, usbd_core_cfg.ep0_data_buf, usbd_core_cfg.ep0_data_buf_residue);
+ if (usbd_core_cfg.ep0_data_buf_residue == 0) {
+ /* Received all, send data to handler */
+ usbd_core_cfg.ep0_data_buf = usbd_core_cfg.req_data;
+ if (!usbd_setup_request_handler(setup, &usbd_core_cfg.ep0_data_buf, &usbd_core_cfg.ep0_data_buf_len)) {
+ usbd_ep_set_stall(USB_CONTROL_IN_EP0);
+ return;
}
+
+ /*Send status to host*/
+ usbd_ep_start_write(USB_CONTROL_IN_EP0, NULL, 0);
} else {
- /* Read out status completely, do nothing */
- USB_LOG_DBG("EP0 recv out status\r\n");
+ /* Start reading the remain data */
+ usbd_ep_start_read(USB_CONTROL_OUT_EP0, usbd_core_cfg.ep0_data_buf, usbd_core_cfg.ep0_data_buf_residue);
}
} else {
- if (usbd_core_cfg.out_ep_cb[ep & 0x7f]) {
- usbd_core_cfg.out_ep_cb[ep & 0x7f](ep, nbytes);
+ /* Read out status completely, do nothing */
+ USB_LOG_DBG("EP0 recv out status\r\n");
+ }
+}
+
+void usbd_event_ep_in_complete_handler(uint8_t ep, uint32_t nbytes)
+{
+#ifndef CONFIG_USBDEV_TX_RX_THREAD
+ if (tx_msg[ep & 0x7f].cb) {
+ tx_msg[ep & 0x7f].cb(ep, nbytes);
+ }
+#else
+ tx_msg[ep & 0x7f].nbytes = nbytes;
+ usb_osal_mq_send(usbd_tx_rx_mq, (uint32_t)&tx_msg[ep & 0x7f]);
+#endif
+}
+
+void usbd_event_ep_out_complete_handler(uint8_t ep, uint32_t nbytes)
+{
+#ifndef CONFIG_USBDEV_TX_RX_THREAD
+ if (rx_msg[ep & 0x7f].cb) {
+ rx_msg[ep & 0x7f].cb(ep, nbytes);
+ }
+#else
+ rx_msg[ep & 0x7f].nbytes = nbytes;
+ usb_osal_mq_send(usbd_tx_rx_mq, (uint32_t)&rx_msg[ep & 0x7f]);
+#endif
+}
+
+#ifdef CONFIG_USBDEV_TX_RX_THREAD
+static void usbdev_tx_rx_thread(void *argument)
+{
+ struct usbd_tx_rx_msg *msg;
+ int ret;
+
+ while (1) {
+ ret = usb_osal_mq_recv(usbd_tx_rx_mq, (uint32_t *)&msg, 0xffffffff);
+ if (ret < 0) {
+ continue;
+ }
+
+ if (msg->cb) {
+ msg->cb(msg->ep, msg->nbytes);
}
}
}
+#endif
+
#if defined(CHERRYUSB_VERSION) && (CHERRYUSB_VERSION > 0x000700)
void usbd_desc_register(struct usb_descriptor *desc)
{
usbd_core_cfg.descriptors = desc;
usbd_core_cfg.intf_offset = 0;
+ tx_msg[0].ep = 0x80;
+ tx_msg[0].cb = usbd_event_ep0_in_complete_handler;
+ rx_msg[0].ep = 0x00;
+ rx_msg[0].cb = usbd_event_ep0_out_complete_handler;
}
#else
void usbd_desc_register(const uint8_t *desc)
{
usbd_core_cfg.descriptors = desc;
usbd_core_cfg.intf_offset = 0;
+ tx_msg[0].ep = 0x80;
+ tx_msg[0].cb = usbd_event_ep0_in_complete_handler;
+ rx_msg[0].ep = 0x00;
+ rx_msg[0].cb = usbd_event_ep0_out_complete_handler;
}
/* Register MS OS Descriptors version 1 */
@@ -1137,9 +1191,11 @@ void usbd_add_interface(struct usbd_interface *intf)
void usbd_add_endpoint(struct usbd_endpoint *ep)
{
if (ep->ep_addr & 0x80) {
- usbd_core_cfg.in_ep_cb[ep->ep_addr & 0x7f] = ep->ep_cb;
+ tx_msg[ep->ep_addr & 0x7f].ep = ep->ep_addr;
+ tx_msg[ep->ep_addr & 0x7f].cb = ep->ep_cb;
} else {
- usbd_core_cfg.out_ep_cb[ep->ep_addr & 0x7f] = ep->ep_cb;
+ rx_msg[ep->ep_addr & 0x7f].ep = ep->ep_addr;
+ rx_msg[ep->ep_addr & 0x7f].cb = ep->ep_cb;
}
}
@@ -1150,6 +1206,16 @@ bool usb_device_is_configured(void)
int usbd_initialize(void)
{
+#ifdef CONFIG_USBDEV_TX_RX_THREAD
+ usbd_tx_rx_mq = usb_osal_mq_create(32);
+ if (usbd_tx_rx_mq == NULL) {
+ return -1;
+ }
+ usbd_tx_rx_thread = usb_osal_thread_create("usbd_tx_rx", CONFIG_USBDEV_TX_RX_STACKSIZE, CONFIG_USBDEV_TX_RX_PRIO, usbdev_tx_rx_thread, NULL);
+ if (usbd_tx_rx_thread == NULL) {
+ return -1;
+ }
+#endif
return usb_dc_init();
}
@@ -1158,5 +1224,7 @@ int usbd_deinitialize(void)
usbd_core_cfg.intf_offset = 0;
usb_slist_init(&usbd_intf_head);
usb_dc_deinit();
+#ifdef CONFIG_USBDEV_TX_RX_THREAD
+#endif
return 0;
}
diff --git a/demo/stm32/usb_device/stm32f429igt6/Core/Inc/usb_config.h b/demo/stm32/usb_device/stm32f429igt6/Core/Inc/usb_config.h
index b9c57985..c55bf494 100644
--- a/demo/stm32/usb_device/stm32f429igt6/Core/Inc/usb_config.h
+++ b/demo/stm32/usb_device/stm32f429igt6/Core/Inc/usb_config.h
@@ -44,6 +44,17 @@
/* Enable test mode */
// #define CONFIG_USBDEV_TEST_MODE
+//#define CONFIG_USBDEV_TX_RX_THREAD
+
+#ifdef CONFIG_USBDEV_TX_RX_THREAD
+#ifndef CONFIG_USBDEV_TX_RX_PRIO
+#define CONFIG_USBDEV_TX_RX_PRIO 4
+#endif
+#ifndef CONFIG_USBDEV_TX_RX_STACKSIZE
+#define CONFIG_USBDEV_TX_RX_STACKSIZE 2048
+#endif
+#endif
+
#ifndef CONFIG_USBDEV_MSC_BLOCK_SIZE
#define CONFIG_USBDEV_MSC_BLOCK_SIZE 512
#endif
diff --git a/demo/stm32/usb_device/stm32f429igt6/Core/Src/main.c b/demo/stm32/usb_device/stm32f429igt6/Core/Src/main.c
index 30ca582a..3e4f60ed 100644
--- a/demo/stm32/usb_device/stm32f429igt6/Core/Src/main.c
+++ b/demo/stm32/usb_device/stm32f429igt6/Core/Src/main.c
@@ -24,6 +24,8 @@
/* USER CODE BEGIN Includes */
#include "usbd_core.h"
#include "usbd_cdc.h"
+#include "FreeRTOS.h"
+#include "task.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
@@ -126,10 +128,13 @@ int main(void)
//MX_USB_OTG_HS_PCD_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
-
+
extern void cdc_acm_msc_init(void);
cdc_acm_msc_init();
+#ifdef CONFIG_USBDEV_TX_RX_THREAD
+ vTaskStartScheduler();
+#endif
/* USER CODE END 2 */
/* Infinite loop */
diff --git a/demo/stm32/usb_device/stm32f429igt6/Core/Src/stm32f4xx_it.c b/demo/stm32/usb_device/stm32f429igt6/Core/Src/stm32f4xx_it.c
index a884d6ee..212ae849 100644
--- a/demo/stm32/usb_device/stm32f429igt6/Core/Src/stm32f4xx_it.c
+++ b/demo/stm32/usb_device/stm32f429igt6/Core/Src/stm32f4xx_it.c
@@ -23,6 +23,8 @@
#include "stm32f4xx_it.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
+#include "FreeRTOS.h"
+#include "task.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
@@ -142,15 +144,15 @@ void UsageFault_Handler(void)
/**
* @brief This function handles System service call via SWI instruction.
*/
-void SVC_Handler(void)
-{
- /* USER CODE BEGIN SVCall_IRQn 0 */
+//void SVC_Handler(void)
+//{
+// /* USER CODE BEGIN SVCall_IRQn 0 */
- /* USER CODE END SVCall_IRQn 0 */
- /* USER CODE BEGIN SVCall_IRQn 1 */
+// /* USER CODE END SVCall_IRQn 0 */
+// /* USER CODE BEGIN SVCall_IRQn 1 */
- /* USER CODE END SVCall_IRQn 1 */
-}
+// /* USER CODE END SVCall_IRQn 1 */
+//}
/**
* @brief This function handles Debug monitor.
@@ -168,15 +170,15 @@ void DebugMon_Handler(void)
/**
* @brief This function handles Pendable request for system service.
*/
-void PendSV_Handler(void)
-{
- /* USER CODE BEGIN PendSV_IRQn 0 */
+//void PendSV_Handler(void)
+//{
+// /* USER CODE BEGIN PendSV_IRQn 0 */
- /* USER CODE END PendSV_IRQn 0 */
- /* USER CODE BEGIN PendSV_IRQn 1 */
+// /* USER CODE END PendSV_IRQn 0 */
+// /* USER CODE BEGIN PendSV_IRQn 1 */
- /* USER CODE END PendSV_IRQn 1 */
-}
+// /* USER CODE END PendSV_IRQn 1 */
+//}
/**
* @brief This function handles System tick timer.
@@ -184,7 +186,15 @@ void PendSV_Handler(void)
void SysTick_Handler(void)
{
/* USER CODE BEGIN SysTick_IRQn 0 */
-
+extern void xPortSysTickHandler(void);
+ #if (INCLUDE_xTaskGetSchedulerState == 1 )
+ if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
+ {
+ #endif /* INCLUDE_xTaskGetSchedulerState */
+ xPortSysTickHandler();
+ #if (INCLUDE_xTaskGetSchedulerState == 1 )
+ }
+ #endif /* INCLUDE_xTaskGetSchedulerState */
/* USER CODE END SysTick_IRQn 0 */
HAL_IncTick();
/* USER CODE BEGIN SysTick_IRQn 1 */
diff --git a/demo/stm32/usb_device/stm32f429igt6/MDK-ARM/stm32f429igt6.uvoptx b/demo/stm32/usb_device/stm32f429igt6/MDK-ARM/stm32f429igt6.uvoptx
index 3b7bdaf7..1c2e2b70 100644
--- a/demo/stm32/usb_device/stm32f429igt6/MDK-ARM/stm32f429igt6.uvoptx
+++ b/demo/stm32/usb_device/stm32f429igt6/MDK-ARM/stm32f429igt6.uvoptx
@@ -157,6 +157,22 @@
<Bp>
<Number>0</Number>
<Type>0</Type>
+ <LineNumber>810</LineNumber>
+ <EnabledFlag>1</EnabledFlag>
+ <Address>0</Address>
+ <ByteObject>0</ByteObject>
+ <HtxType>0</HtxType>
+ <ManyObjects>0</ManyObjects>
+ <SizeOfObject>0</SizeOfObject>
+ <BreakByAccess>0</BreakByAccess>
+ <BreakIfRCount>0</BreakIfRCount>
+ <Filename>..\..\..\..\..\class\msc\usbd_msc.c</Filename>
+ <ExecCommand></ExecCommand>
+ <Expression></Expression>
+ </Bp>
+ <Bp>
+ <Number>1</Number>
+ <Type>0</Type>
<LineNumber>899</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>0</Address>
@@ -225,7 +241,7 @@
<Group>
<GroupName>Application/MDK-ARM</GroupName>
- <tvExp>1</tvExp>
+ <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
@@ -585,6 +601,134 @@
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
+ <File>
+ <GroupNumber>5</GroupNumber>
+ <FileNumber>28</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\..\..\..\osal\usb_osal_freertos.c</PathWithFileName>
+ <FilenameWithoutPath>usb_osal_freertos.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>FreeRTOS</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>6</GroupNumber>
+ <FileNumber>29</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\..\..\..\third_party\FreeRTOS-10.4\croutine.c</PathWithFileName>
+ <FilenameWithoutPath>croutine.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>6</GroupNumber>
+ <FileNumber>30</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\..\..\..\third_party\FreeRTOS-10.4\event_groups.c</PathWithFileName>
+ <FilenameWithoutPath>event_groups.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>6</GroupNumber>
+ <FileNumber>31</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\..\..\..\third_party\FreeRTOS-10.4\list.c</PathWithFileName>
+ <FilenameWithoutPath>list.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>6</GroupNumber>
+ <FileNumber>32</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\..\..\..\third_party\FreeRTOS-10.4\queue.c</PathWithFileName>
+ <FilenameWithoutPath>queue.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>6</GroupNumber>
+ <FileNumber>33</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\..\..\..\third_party\FreeRTOS-10.4\stream_buffer.c</PathWithFileName>
+ <FilenameWithoutPath>stream_buffer.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>6</GroupNumber>
+ <FileNumber>34</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\..\..\..\third_party\FreeRTOS-10.4\tasks.c</PathWithFileName>
+ <FilenameWithoutPath>tasks.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>6</GroupNumber>
+ <FileNumber>35</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\..\..\..\third_party\FreeRTOS-10.4\timers.c</PathWithFileName>
+ <FilenameWithoutPath>timers.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>6</GroupNumber>
+ <FileNumber>36</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\..\..\..\third_party\FreeRTOS-10.4\portable\MemMang\heap_4.c</PathWithFileName>
+ <FilenameWithoutPath>heap_4.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>6</GroupNumber>
+ <FileNumber>37</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\..\..\..\third_party\FreeRTOS-10.4\portable\GCC\ARM_CM4F\port.c</PathWithFileName>
+ <FilenameWithoutPath>port.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
</Group>
<Group>
diff --git a/demo/stm32/usb_device/stm32f429igt6/MDK-ARM/stm32f429igt6.uvprojx b/demo/stm32/usb_device/stm32f429igt6/MDK-ARM/stm32f429igt6.uvprojx
index e2e72950..3213a49d 100644
--- a/demo/stm32/usb_device/stm32f429igt6/MDK-ARM/stm32f429igt6.uvprojx
+++ b/demo/stm32/usb_device/stm32f429igt6/MDK-ARM/stm32f429igt6.uvprojx
@@ -340,7 +340,7 @@
<MiscControls></MiscControls>
<Define>USE_HAL_DRIVER,STM32F429xx,CONFIG_USB_DWC2_PORT=HS_PORT</Define>
<Undefine></Undefine>
- <IncludePath>../Core/Inc;../Drivers/STM32F4xx_HAL_Driver/Inc;../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy;../Drivers/CMSIS/Device/ST/STM32F4xx/Include;../Drivers/CMSIS/Include;..\..\..\..\..\core;..\..\..\..\..\common;..\..\..\..\..\class\cdc;..\..\..\..\..\class\msc;..\..\..\..\..\class\hid;..\..\..\..\..\class\audio;..\..\..\..\..\class\video</IncludePath>
+ <IncludePath>../Core/Inc;../Drivers/STM32F4xx_HAL_Driver/Inc;../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy;../Drivers/CMSIS/Device/ST/STM32F4xx/Include;../Drivers/CMSIS/Include;..\..\..\..\..\core;..\..\..\..\..\common;..\..\..\..\..\class\cdc;..\..\..\..\..\class\msc;..\..\..\..\..\class\hid;..\..\..\..\..\class\audio;..\..\..\..\..\class\video;..\..\..\..\..\third_party\FreeRTOS-10.4\include;..\..\..\..\..\third_party\FreeRTOS-10.4\portable\GCC\ARM_CM4F;..\..\..\..\..\osal</IncludePath>
</VariousControls>
</Cads>
<Aads>
@@ -590,6 +590,61 @@
<FileType>1</FileType>
<FilePath>..\..\..\..\..\port\dwc2\usb_dc_dwc2.c</FilePath>
</File>
+ <File>
+ <FileName>usb_osal_freertos.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\..\..\osal\usb_osal_freertos.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>FreeRTOS</GroupName>
+ <Files>
+ <File>
+ <FileName>croutine.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\..\..\third_party\FreeRTOS-10.4\croutine.c</FilePath>
+ </File>
+ <File>
+ <FileName>event_groups.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\..\..\third_party\FreeRTOS-10.4\event_groups.c</FilePath>
+ </File>
+ <File>
+ <FileName>list.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\..\..\third_party\FreeRTOS-10.4\list.c</FilePath>
+ </File>
+ <File>
+ <FileName>queue.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\..\..\third_party\FreeRTOS-10.4\queue.c</FilePath>
+ </File>
+ <File>
+ <FileName>stream_buffer.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\..\..\third_party\FreeRTOS-10.4\stream_buffer.c</FilePath>
+ </File>
+ <File>
+ <FileName>tasks.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\..\..\third_party\FreeRTOS-10.4\tasks.c</FilePath>
+ </File>
+ <File>
+ <FileName>timers.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\..\..\third_party\FreeRTOS-10.4\timers.c</FilePath>
+ </File>
+ <File>
+ <FileName>heap_4.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\..\..\third_party\FreeRTOS-10.4\portable\MemMang\heap_4.c</FilePath>
+ </File>
+ <File>
+ <FileName>port.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\..\..\third_party\FreeRTOS-10.4\portable\GCC\ARM_CM4F\port.c</FilePath>
+ </File>
</Files>
</Group>
<Group>