From 43a45fc2fca33c0e2682ba1874ab93bdf6e318a3 Mon Sep 17 00:00:00 2001
From: sakimisu <1203593632@qq.com>
Date: Sun, 11 Dec 2022 21:19:48 +0800
Subject: [PATCH] add usb tx rx thread for device
---
cherryusb_config_template.h | 23 ++-
class/msc/usbd_msc.c | 114 +----------
core/usbd_core.c | 180 ++++++++++++------
.../stm32f429igt6/Core/Inc/usb_config.h | 11 ++
.../usb_device/stm32f429igt6/Core/Src/main.c | 7 +-
.../stm32f429igt6/Core/Src/stm32f4xx_it.c | 40 ++--
.../MDK-ARM/stm32f429igt6.uvoptx | 146 +++++++++++++-
.../MDK-ARM/stm32f429igt6.uvprojx | 57 +++++-
8 files changed, 379 insertions(+), 199 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_ep0_out_complete_handler(uint8_t ep, uint32_t nbytes)
+{
+ 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;
+
+ USB_LOG_DBG("EP0 recv %d bytes, %d remained\r\n", nbytes, 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 {
+ /* 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 {
+ /* 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)
{
- if (ep == USB_CONTROL_OUT_EP0) {
- struct usb_setup_packet *setup = &usbd_core_cfg.setup;
+#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
+}
- if (nbytes > 0) {
- usbd_core_cfg.ep0_data_buf += nbytes;
- usbd_core_cfg.ep0_data_buf_residue -= nbytes;
+#ifdef CONFIG_USBDEV_TX_RX_THREAD
+static void usbdev_tx_rx_thread(void *argument)
+{
+ struct usbd_tx_rx_msg *msg;
+ int ret;
- USB_LOG_DBG("EP0 recv %d bytes, %d remained\r\n", nbytes, 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 {
- /* 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 {
- /* Read out status completely, do nothing */
- USB_LOG_DBG("EP0 recv out status\r\n");
+ while (1) {
+ ret = usb_osal_mq_recv(usbd_tx_rx_mq, (uint32_t *)&msg, 0xffffffff);
+ if (ret < 0) {
+ continue;
}
- } else {
- if (usbd_core_cfg.out_ep_cb[ep & 0x7f]) {
- usbd_core_cfg.out_ep_cb[ep & 0x7f](ep, nbytes);
+
+ 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 @@
0
0
+ 810
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ ..\..\..\..\..\class\msc\usbd_msc.c
+
+
+
+
+ 1
+ 0
899
1
0
@@ -225,7 +241,7 @@
Application/MDK-ARM
- 1
+ 0
0
0
0
@@ -585,6 +601,134 @@
0
0
+
+ 5
+ 28
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\..\osal\usb_osal_freertos.c
+ usb_osal_freertos.c
+ 0
+ 0
+
+
+
+
+ FreeRTOS
+ 0
+ 0
+ 0
+ 0
+
+ 6
+ 29
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\..\third_party\FreeRTOS-10.4\croutine.c
+ croutine.c
+ 0
+ 0
+
+
+ 6
+ 30
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\..\third_party\FreeRTOS-10.4\event_groups.c
+ event_groups.c
+ 0
+ 0
+
+
+ 6
+ 31
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\..\third_party\FreeRTOS-10.4\list.c
+ list.c
+ 0
+ 0
+
+
+ 6
+ 32
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\..\third_party\FreeRTOS-10.4\queue.c
+ queue.c
+ 0
+ 0
+
+
+ 6
+ 33
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\..\third_party\FreeRTOS-10.4\stream_buffer.c
+ stream_buffer.c
+ 0
+ 0
+
+
+ 6
+ 34
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\..\third_party\FreeRTOS-10.4\tasks.c
+ tasks.c
+ 0
+ 0
+
+
+ 6
+ 35
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\..\third_party\FreeRTOS-10.4\timers.c
+ timers.c
+ 0
+ 0
+
+
+ 6
+ 36
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\..\third_party\FreeRTOS-10.4\portable\MemMang\heap_4.c
+ heap_4.c
+ 0
+ 0
+
+
+ 6
+ 37
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\..\third_party\FreeRTOS-10.4\portable\GCC\ARM_CM4F\port.c
+ port.c
+ 0
+ 0
+
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 @@
USE_HAL_DRIVER,STM32F429xx,CONFIG_USB_DWC2_PORT=HS_PORT
- ../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
+ ../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
@@ -590,6 +590,61 @@
1
..\..\..\..\..\port\dwc2\usb_dc_dwc2.c
+
+ usb_osal_freertos.c
+ 1
+ ..\..\..\..\..\osal\usb_osal_freertos.c
+
+
+
+
+ FreeRTOS
+
+
+ croutine.c
+ 1
+ ..\..\..\..\..\third_party\FreeRTOS-10.4\croutine.c
+
+
+ event_groups.c
+ 1
+ ..\..\..\..\..\third_party\FreeRTOS-10.4\event_groups.c
+
+
+ list.c
+ 1
+ ..\..\..\..\..\third_party\FreeRTOS-10.4\list.c
+
+
+ queue.c
+ 1
+ ..\..\..\..\..\third_party\FreeRTOS-10.4\queue.c
+
+
+ stream_buffer.c
+ 1
+ ..\..\..\..\..\third_party\FreeRTOS-10.4\stream_buffer.c
+
+
+ tasks.c
+ 1
+ ..\..\..\..\..\third_party\FreeRTOS-10.4\tasks.c
+
+
+ timers.c
+ 1
+ ..\..\..\..\..\third_party\FreeRTOS-10.4\timers.c
+
+
+ heap_4.c
+ 1
+ ..\..\..\..\..\third_party\FreeRTOS-10.4\portable\MemMang\heap_4.c
+
+
+ port.c
+ 1
+ ..\..\..\..\..\third_party\FreeRTOS-10.4\portable\GCC\ARM_CM4F\port.c
+