summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsakumisu <[email protected]>2024-08-08 18:03:30 +0800
committersakumisu <[email protected]>2024-08-08 18:03:30 +0800
commitb4bbe69d120db0c8585046879564e54750b97c61 (patch)
tree025e98ea6a3ad255ca951438c1d8e3740489efd1
parente1cbccc58a1400a55fa779501cf03e5c54962ca8 (diff)
feat(class/msc/usbd_msc): add msc polling mode to move read & write from isr to while1
-rw-r--r--cherryusb_config_template.h4
-rw-r--r--class/msc/usbd_msc.c52
-rw-r--r--class/msc/usbd_msc.h2
3 files changed, 50 insertions, 8 deletions
diff --git a/cherryusb_config_template.h b/cherryusb_config_template.h
index 05fcc79b..013b85b8 100644
--- a/cherryusb_config_template.h
+++ b/cherryusb_config_template.h
@@ -69,6 +69,10 @@
#define CONFIG_USBDEV_MSC_VERSION_STRING "0.01"
#endif
+/* move msc read & write from isr to while(1), you should call usbd_msc_polling in while(1) */
+// #define CONFIG_USBDEV_MSC_POLLING
+
+/* move msc read & write from isr to thread */
// #define CONFIG_USBDEV_MSC_THREAD
#ifndef CONFIG_USBDEV_MSC_PRIO
diff --git a/class/msc/usbd_msc.c b/class/msc/usbd_msc.c
index 055cdc4e..9c641f0b 100644
--- a/class/msc/usbd_msc.c
+++ b/class/msc/usbd_msc.c
@@ -9,6 +9,8 @@
#include "usb_scsi.h"
#if defined(CONFIG_USBDEV_MSC_THREAD)
#include "usb_osal.h"
+#elif defined(CONFIG_USBDEV_MSC_POLLING)
+#include "chry_ringbuffer.h"
#endif
#define MSD_OUT_EP_IDX 0
@@ -50,6 +52,10 @@ USB_NOCACHE_RAM_SECTION struct usbd_msc_priv {
usb_osal_mq_t usbd_msc_mq;
usb_osal_thread_t usbd_msc_thread;
uint32_t nbytes;
+#elif defined(CONFIG_USBDEV_MSC_POLLING)
+ chry_ringbuffer_t msc_rb;
+ uint8_t msc_rb_pool[2];
+ uint32_t nbytes;
#endif
} g_usbd_msc[CONFIG_USBDEV_MAX_BUS];
@@ -96,7 +102,7 @@ void msc_storage_notify_handler(uint8_t busid, uint8_t event, void *arg)
{
switch (event) {
case USBD_EVENT_INIT:
-#ifdef CONFIG_USBDEV_MSC_THREAD
+#if defined(CONFIG_USBDEV_MSC_THREAD)
g_usbd_msc[busid].usbd_msc_mq = usb_osal_mq_create(1);
if (g_usbd_msc[busid].usbd_msc_mq == NULL) {
USB_LOG_ERR("No memory to alloc for g_usbd_msc[busid].usbd_msc_mq\r\n");
@@ -105,10 +111,12 @@ void msc_storage_notify_handler(uint8_t busid, uint8_t event, void *arg)
if (g_usbd_msc[busid].usbd_msc_thread == NULL) {
USB_LOG_ERR("No memory to alloc for g_usbd_msc[busid].usbd_msc_thread\r\n");
}
+#elif defined(CONFIG_USBDEV_MSC_POLLING)
+ chry_ringbuffer_init(&g_usbd_msc[busid].msc_rb, g_usbd_msc[busid].msc_rb_pool, sizeof(g_usbd_msc[busid].msc_rb_pool));
#endif
break;
case USBD_EVENT_DEINIT:
-#ifdef CONFIG_USBDEV_MSC_THREAD
+#if defined(CONFIG_USBDEV_MSC_THREAD)
if (g_usbd_msc[busid].usbd_msc_mq) {
usb_osal_mq_delete(g_usbd_msc[busid].usbd_msc_mq);
}
@@ -522,8 +530,10 @@ static bool SCSI_read10(uint8_t busid, uint8_t **data, uint32_t *len)
return false;
}
g_usbd_msc[busid].stage = MSC_DATA_IN;
-#ifdef CONFIG_USBDEV_MSC_THREAD
+#if defined(CONFIG_USBDEV_MSC_THREAD)
usb_osal_mq_send(g_usbd_msc[busid].usbd_msc_mq, MSC_DATA_IN);
+#elif defined(CONFIG_USBDEV_MSC_POLLING)
+ chry_ringbuffer_write_byte(&g_usbd_msc[busid].msc_rb, MSC_DATA_IN);
return true;
#else
return SCSI_processRead(busid);
@@ -554,8 +564,10 @@ static bool SCSI_read12(uint8_t busid, uint8_t **data, uint32_t *len)
return false;
}
g_usbd_msc[busid].stage = MSC_DATA_IN;
-#ifdef CONFIG_USBDEV_MSC_THREAD
+#if defined(CONFIG_USBDEV_MSC_THREAD)
usb_osal_mq_send(g_usbd_msc[busid].usbd_msc_mq, MSC_DATA_IN);
+#elif defined(CONFIG_USBDEV_MSC_POLLING)
+ chry_ringbuffer_write_byte(&g_usbd_msc[busid].msc_rb, MSC_DATA_IN);
return true;
#else
return SCSI_processRead(busid);
@@ -815,9 +827,12 @@ void mass_storage_bulk_out(uint8_t busid, uint8_t ep, uint32_t nbytes)
switch (g_usbd_msc[busid].cbw.CB[0]) {
case SCSI_CMD_WRITE10:
case SCSI_CMD_WRITE12:
-#ifdef CONFIG_USBDEV_MSC_THREAD
+#if defined(CONFIG_USBDEV_MSC_THREAD)
g_usbd_msc[busid].nbytes = nbytes;
usb_osal_mq_send(g_usbd_msc[busid].usbd_msc_mq, MSC_DATA_OUT);
+#elif defined(CONFIG_USBDEV_MSC_POLLING)
+ g_usbd_msc[busid].nbytes = nbytes;
+ chry_ringbuffer_write_byte(&g_usbd_msc[busid].msc_rb, MSC_DATA_OUT);
#else
if (SCSI_processWrite(busid, nbytes) == false) {
usbd_msc_send_csw(busid, CSW_STATUS_CMD_FAILED); /* send fail status to host,and the host will retry*/
@@ -840,8 +855,10 @@ void mass_storage_bulk_in(uint8_t busid, uint8_t ep, uint32_t nbytes)
switch (g_usbd_msc[busid].cbw.CB[0]) {
case SCSI_CMD_READ10:
case SCSI_CMD_READ12:
-#ifdef CONFIG_USBDEV_MSC_THREAD
+#if defined(CONFIG_USBDEV_MSC_THREAD)
usb_osal_mq_send(g_usbd_msc[busid].usbd_msc_mq, MSC_DATA_IN);
+#elif defined(CONFIG_USBDEV_MSC_POLLING)
+ chry_ringbuffer_write_byte(&g_usbd_msc[busid].msc_rb, MSC_DATA_IN);
#else
if (SCSI_processRead(busid) == false) {
usbd_msc_send_csw(busid, CSW_STATUS_CMD_FAILED); /* send fail status to host,and the host will retry*/
@@ -870,7 +887,7 @@ void mass_storage_bulk_in(uint8_t busid, uint8_t ep, uint32_t nbytes)
}
}
-#ifdef CONFIG_USBDEV_MSC_THREAD
+#if defined(CONFIG_USBDEV_MSC_THREAD)
static void usbdev_msc_thread(void *argument)
{
uintptr_t event;
@@ -882,7 +899,26 @@ static void usbdev_msc_thread(void *argument)
if (ret < 0) {
continue;
}
- USB_LOG_DBG("%d\r\n", event);
+ USB_LOG_DBG("event:%d\r\n", event);
+ if (event == MSC_DATA_OUT) {
+ if (SCSI_processWrite(busid, g_usbd_msc[busid].nbytes) == false) {
+ usbd_msc_send_csw(busid, CSW_STATUS_CMD_FAILED); /* send fail status to host,and the host will retry*/
+ }
+ } else if (event == MSC_DATA_IN) {
+ if (SCSI_processRead(busid) == false) {
+ usbd_msc_send_csw(busid, CSW_STATUS_CMD_FAILED); /* send fail status to host,and the host will retry*/
+ }
+ } else {
+ }
+ }
+}
+#elif defined(CONFIG_USBDEV_MSC_POLLING)
+void usbd_msc_polling(uint8_t busid)
+{
+ uint8_t event;
+
+ if (chry_ringbuffer_read_byte(&g_usbd_msc[busid].msc_rb, &event)) {
+ USB_LOG_DBG("event:%d\r\n", event);
if (event == MSC_DATA_OUT) {
if (SCSI_processWrite(busid, g_usbd_msc[busid].nbytes) == false) {
usbd_msc_send_csw(busid, CSW_STATUS_CMD_FAILED); /* send fail status to host,and the host will retry*/
diff --git a/class/msc/usbd_msc.h b/class/msc/usbd_msc.h
index c71f64a2..e43e951a 100644
--- a/class/msc/usbd_msc.h
+++ b/class/msc/usbd_msc.h
@@ -25,6 +25,8 @@ int usbd_msc_sector_write(uint8_t busid, uint8_t lun, uint32_t sector, uint8_t *
void usbd_msc_set_readonly(uint8_t busid, bool readonly);
bool usbd_msc_set_popup(uint8_t busid);
+void usbd_msc_polling(uint8_t busid);
+
#ifdef __cplusplus
}
#endif