implement msc device thread,remove other unused os thread

This commit is contained in:
sakimisu
2023-08-27 14:19:50 +08:00
committed by sakumisu
parent 9029f8c5b1
commit 14f5dd2dd3
3 changed files with 74 additions and 103 deletions

View File

@@ -44,27 +44,6 @@
/* Enable test mode */ /* Enable test mode */
// #define CONFIG_USBDEV_TEST_MODE // #define CONFIG_USBDEV_TEST_MODE
//#define CONFIG_USBDEV_TX_THREAD
//#define CONFIG_USBDEV_RX_THREAD
#ifdef CONFIG_USBDEV_TX_THREAD
#ifndef CONFIG_USBDEV_TX_PRIO
#define CONFIG_USBDEV_TX_PRIO 4
#endif
#ifndef CONFIG_USBDEV_TX_STACKSIZE
#define CONFIG_USBDEV_TX_STACKSIZE 2048
#endif
#endif
#ifdef CONFIG_USBDEV_RX_THREAD
#ifndef CONFIG_USBDEV_RX_PRIO
#define CONFIG_USBDEV_RX_PRIO 4
#endif
#ifndef CONFIG_USBDEV_RX_STACKSIZE
#define CONFIG_USBDEV_RX_STACKSIZE 2048
#endif
#endif
#ifndef CONFIG_USBDEV_MSC_BLOCK_SIZE #ifndef CONFIG_USBDEV_MSC_BLOCK_SIZE
#define CONFIG_USBDEV_MSC_BLOCK_SIZE 512 #define CONFIG_USBDEV_MSC_BLOCK_SIZE 512
#endif #endif
@@ -81,6 +60,16 @@
#define CONFIG_USBDEV_MSC_VERSION_STRING "0.01" #define CONFIG_USBDEV_MSC_VERSION_STRING "0.01"
#endif #endif
// #define CONFIG_USBDEV_MSC_THREAD
#ifndef CONFIG_USBDEV_MSC_PRIO
#define CONFIG_USBDEV_MSC_PRIO 4
#endif
#ifndef CONFIG_USBDEV_MSC_STACKSIZE
#define CONFIG_USBDEV_MSC_STACKSIZE 2048
#endif
#ifndef CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE #ifndef CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE
#define CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE 156 #define CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE 156
#endif #endif

View File

@@ -6,6 +6,9 @@
#include "usbd_core.h" #include "usbd_core.h"
#include "usbd_msc.h" #include "usbd_msc.h"
#include "usb_scsi.h" #include "usb_scsi.h"
#if defined(CONFIG_USBDEV_MSC_THREAD)
#include "usb_osal.h"
#endif
#define MSD_OUT_EP_IDX 0 #define MSD_OUT_EP_IDX 0
#define MSD_IN_EP_IDX 1 #define MSD_IN_EP_IDX 1
@@ -41,6 +44,12 @@ USB_NOCACHE_RAM_SECTION struct usbd_msc_priv {
uint32_t scsi_blk_nbr; uint32_t scsi_blk_nbr;
USB_MEM_ALIGNX uint8_t block_buffer[CONFIG_USBDEV_MSC_BLOCK_SIZE]; USB_MEM_ALIGNX uint8_t block_buffer[CONFIG_USBDEV_MSC_BLOCK_SIZE];
#if defined(CONFIG_USBDEV_MSC_THREAD)
usb_osal_mq_t usbd_msc_mq;
usb_osal_thread_t usbd_msc_thread;
uint32_t nbytes;
#endif
} g_usbd_msc; } g_usbd_msc;
static void usbd_msc_reset(void) static void usbd_msc_reset(void)
@@ -481,7 +490,12 @@ static bool SCSI_read10(uint8_t **data, uint32_t *len)
return false; return false;
} }
g_usbd_msc.stage = MSC_DATA_IN; g_usbd_msc.stage = MSC_DATA_IN;
#ifdef CONFIG_USBDEV_MSC_THREAD
usb_osal_mq_send(g_usbd_msc.usbd_msc_mq, MSC_DATA_IN);
return true;
#else
return SCSI_processRead(); return SCSI_processRead();
#endif
} }
static bool SCSI_read12(uint8_t **data, uint32_t *len) static bool SCSI_read12(uint8_t **data, uint32_t *len)
@@ -508,7 +522,12 @@ static bool SCSI_read12(uint8_t **data, uint32_t *len)
return false; return false;
} }
g_usbd_msc.stage = MSC_DATA_IN; g_usbd_msc.stage = MSC_DATA_IN;
#ifdef CONFIG_USBDEV_MSC_THREAD
usb_osal_mq_send(g_usbd_msc.usbd_msc_mq, MSC_DATA_IN);
return true;
#else
return SCSI_processRead(); return SCSI_processRead();
#endif
} }
static bool SCSI_write10(uint8_t **data, uint32_t *len) static bool SCSI_write10(uint8_t **data, uint32_t *len)
@@ -764,9 +783,14 @@ void mass_storage_bulk_out(uint8_t ep, uint32_t nbytes)
switch (g_usbd_msc.cbw.CB[0]) { switch (g_usbd_msc.cbw.CB[0]) {
case SCSI_CMD_WRITE10: case SCSI_CMD_WRITE10:
case SCSI_CMD_WRITE12: case SCSI_CMD_WRITE12:
#ifdef CONFIG_USBDEV_MSC_THREAD
g_usbd_msc.nbytes = nbytes;
usb_osal_mq_send(g_usbd_msc.usbd_msc_mq, MSC_DATA_OUT);
#else
if (SCSI_processWrite(nbytes) == false) { if (SCSI_processWrite(nbytes) == false) {
usbd_msc_send_csw(CSW_STATUS_CMD_FAILED); /* send fail status to host,and the host will retry*/ usbd_msc_send_csw(CSW_STATUS_CMD_FAILED); /* send fail status to host,and the host will retry*/
} }
#endif
break; break;
default: default:
break; break;
@@ -784,10 +808,14 @@ void mass_storage_bulk_in(uint8_t ep, uint32_t nbytes)
switch (g_usbd_msc.cbw.CB[0]) { switch (g_usbd_msc.cbw.CB[0]) {
case SCSI_CMD_READ10: case SCSI_CMD_READ10:
case SCSI_CMD_READ12: case SCSI_CMD_READ12:
#ifdef CONFIG_USBDEV_MSC_THREAD
usb_osal_mq_send(g_usbd_msc.usbd_msc_mq, MSC_DATA_IN);
#else
if (SCSI_processRead() == false) { if (SCSI_processRead() == false) {
usbd_msc_send_csw(CSW_STATUS_CMD_FAILED); /* send fail status to host,and the host will retry*/ usbd_msc_send_csw(CSW_STATUS_CMD_FAILED); /* send fail status to host,and the host will retry*/
return; return;
} }
#endif
break; break;
default: default:
break; break;
@@ -810,6 +838,32 @@ void mass_storage_bulk_in(uint8_t ep, uint32_t nbytes)
} }
} }
#ifdef CONFIG_USBDEV_MSC_THREAD
static void usbdev_msc_thread(void *argument)
{
uintptr_t event;
int ret;
while (1) {
ret = usb_osal_mq_recv(g_usbd_msc.usbd_msc_mq, (uintptr_t *)&event, 0xffffffff);
if (ret < 0) {
continue;
}
USB_LOG_DBG("%d\r\n", event);
if (event == MSC_DATA_OUT) {
if (SCSI_processWrite(g_usbd_msc.nbytes) == false) {
usbd_msc_send_csw(CSW_STATUS_CMD_FAILED); /* send fail status to host,and the host will retry*/
}
} else if (event == MSC_DATA_IN) {
if (SCSI_processRead() == false) {
usbd_msc_send_csw(CSW_STATUS_CMD_FAILED); /* send fail status to host,and the host will retry*/
}
} else {
}
}
}
#endif
struct usbd_interface *usbd_msc_init_intf(struct usbd_interface *intf, const uint8_t out_ep, const uint8_t in_ep) 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; intf->class_interface_handler = msc_storage_class_interface_request_handler;
@@ -834,6 +888,16 @@ struct usbd_interface *usbd_msc_init_intf(struct usbd_interface *intf, const uin
return NULL; return NULL;
} }
#ifdef CONFIG_USBDEV_MSC_THREAD
g_usbd_msc.usbd_msc_mq = usb_osal_mq_create(1);
if (g_usbd_msc.usbd_msc_mq == NULL) {
return NULL;
}
g_usbd_msc.usbd_msc_thread = usb_osal_thread_create("usbd_msc", CONFIG_USBDEV_MSC_STACKSIZE, CONFIG_USBDEV_MSC_PRIO, usbdev_msc_thread, NULL);
if (g_usbd_msc.usbd_msc_thread == NULL) {
return NULL;
}
#endif
return intf; return intf;
} }

View File

@@ -6,9 +6,6 @@
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
#include "usbd_core.h" #include "usbd_core.h"
#if defined(CONFIG_USBDEV_TX_THREAD) || defined(CONFIG_USBDEV_RX_THREAD)
#include "usb_osal.h"
#endif
/* general descriptor field offsets */ /* general descriptor field offsets */
#define DESC_bLength 0 /** Length offset */ #define DESC_bLength 0 /** Length offset */
@@ -68,15 +65,6 @@ USB_NOCACHE_RAM_SECTION struct usbd_core_priv {
struct usbd_tx_rx_msg rx_msg[USB_EP_OUT_NUM]; struct usbd_tx_rx_msg rx_msg[USB_EP_OUT_NUM];
} g_usbd_core; } g_usbd_core;
#if defined(CONFIG_USBDEV_TX_THREAD)
usb_osal_mq_t usbd_tx_mq;
usb_osal_thread_t usbd_tx_thread;
#endif
#if defined(CONFIG_USBDEV_RX_THREAD)
usb_osal_mq_t usbd_rx_mq;
usb_osal_thread_t usbd_rx_thread;
#endif
static void usbd_class_event_notify_handler(uint8_t event, void *arg); static void usbd_class_event_notify_handler(uint8_t event, void *arg);
static void usbd_print_setup(struct usb_setup_packet *setup) static void usbd_print_setup(struct usb_setup_packet *setup)
@@ -1140,66 +1128,18 @@ void usbd_event_ep0_out_complete_handler(uint8_t ep, uint32_t nbytes)
void usbd_event_ep_in_complete_handler(uint8_t ep, uint32_t nbytes) void usbd_event_ep_in_complete_handler(uint8_t ep, uint32_t nbytes)
{ {
#ifndef CONFIG_USBDEV_TX_THREAD
if (g_usbd_core.tx_msg[ep & 0x7f].cb) { if (g_usbd_core.tx_msg[ep & 0x7f].cb) {
g_usbd_core.tx_msg[ep & 0x7f].cb(ep, nbytes); g_usbd_core.tx_msg[ep & 0x7f].cb(ep, nbytes);
} }
#else
g_usbd_core.tx_msg[ep & 0x7f].nbytes = nbytes;
usb_osal_mq_send(usbd_tx_mq, (uintptr_t)&g_usbd_core.tx_msg[ep & 0x7f]);
#endif
} }
void usbd_event_ep_out_complete_handler(uint8_t ep, uint32_t nbytes) void usbd_event_ep_out_complete_handler(uint8_t ep, uint32_t nbytes)
{ {
#ifndef CONFIG_USBDEV_RX_THREAD
if (g_usbd_core.rx_msg[ep & 0x7f].cb) { if (g_usbd_core.rx_msg[ep & 0x7f].cb) {
g_usbd_core.rx_msg[ep & 0x7f].cb(ep, nbytes); g_usbd_core.rx_msg[ep & 0x7f].cb(ep, nbytes);
} }
#else
g_usbd_core.rx_msg[ep & 0x7f].nbytes = nbytes;
usb_osal_mq_send(usbd_rx_mq, (uintptr_t)&g_usbd_core.rx_msg[ep & 0x7f]);
#endif
} }
#ifdef CONFIG_USBDEV_TX_THREAD
static void usbdev_tx_thread(void *argument)
{
struct usbd_tx_rx_msg *msg;
int ret;
while (1) {
ret = usb_osal_mq_recv(usbd_tx_mq, (uintptr_t *)&msg, 0xffffffff);
if (ret < 0) {
continue;
}
if (msg->cb) {
msg->cb(msg->ep, msg->nbytes);
}
}
}
#endif
#ifdef CONFIG_USBDEV_RX_THREAD
static void usbdev_rx_thread(void *argument)
{
struct usbd_tx_rx_msg *msg;
int ret;
while (1) {
ret = usb_osal_mq_recv(usbd_rx_mq, (uintptr_t *)&msg, 0xffffffff);
if (ret < 0) {
continue;
}
if (msg->cb) {
msg->cb(msg->ep, msg->nbytes);
}
}
}
#endif
#ifdef CONFIG_USBDEV_ADVANCE_DESC #ifdef CONFIG_USBDEV_ADVANCE_DESC
void usbd_desc_register(struct usb_descriptor *desc) void usbd_desc_register(struct usb_descriptor *desc)
{ {
@@ -1270,26 +1210,6 @@ bool usb_device_is_configured(void)
int usbd_initialize(void) int usbd_initialize(void)
{ {
#ifdef CONFIG_USBDEV_TX_THREAD
usbd_tx_mq = usb_osal_mq_create(16);
if (usbd_tx_mq == NULL) {
return -1;
}
usbd_tx_thread = usb_osal_thread_create("usbd_tx", CONFIG_USBDEV_TX_STACKSIZE, CONFIG_USBDEV_TX_PRIO, usbdev_tx_thread, NULL);
if (usbd_tx_thread == NULL) {
return -1;
}
#endif
#ifdef CONFIG_USBDEV_RX_THREAD
usbd_rx_mq = usb_osal_mq_create(16);
if (usbd_rx_mq == NULL) {
return -1;
}
usbd_rx_thread = usb_osal_thread_create("usbd_rx", CONFIG_USBDEV_RX_STACKSIZE, CONFIG_USBDEV_RX_PRIO, usbdev_rx_thread, NULL);
if (usbd_rx_thread == NULL) {
return -1;
}
#endif
return usb_dc_init(); return usb_dc_init();
} }
@@ -1297,8 +1217,6 @@ int usbd_deinitialize(void)
{ {
g_usbd_core.intf_offset = 0; g_usbd_core.intf_offset = 0;
usb_dc_deinit(); usb_dc_deinit();
#if defined(CONFIG_USBDEV_TX_THREAD) || defined(CONFIG_USBDEV_RX_THREAD)
#endif
return 0; return 0;
} }