diff options
| author | sakumisu <[email protected]> | 2024-08-08 18:03:30 +0800 |
|---|---|---|
| committer | sakumisu <[email protected]> | 2024-08-08 18:03:30 +0800 |
| commit | b4bbe69d120db0c8585046879564e54750b97c61 (patch) | |
| tree | 025e98ea6a3ad255ca951438c1d8e3740489efd1 | |
| parent | e1cbccc58a1400a55fa779501cf03e5c54962ca8 (diff) | |
feat(class/msc/usbd_msc): add msc polling mode to move read & write from isr to while1
| -rw-r--r-- | cherryusb_config_template.h | 4 | ||||
| -rw-r--r-- | class/msc/usbd_msc.c | 52 | ||||
| -rw-r--r-- | class/msc/usbd_msc.h | 2 |
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 |
