diff options
| author | sakumisu <[email protected]> | 2022-05-21 13:43:57 +0800 |
|---|---|---|
| committer | sakumisu <[email protected]> | 2022-05-21 13:43:57 +0800 |
| commit | d4fd7c5e811170374fd010cf1eb6f0b72c9847cd (patch) | |
| tree | 8a49bcbbb1f0ec54745ee876084878b2f5a4a05e | |
| parent | 42ae5b1b74f81a9fd6fb85ec356f0328ac337668 (diff) | |
complete msc device with os
| -rw-r--r-- | class/msc/usbd_msc.c | 59 | ||||
| -rw-r--r-- | usb_config.h | 11 |
2 files changed, 42 insertions, 28 deletions
diff --git a/class/msc/usbd_msc.c b/class/msc/usbd_msc.c index c5c2b74f..b3c44b61 100644 --- a/class/msc/usbd_msc.c +++ b/class/msc/usbd_msc.c @@ -23,7 +23,7 @@ #include "usbd_core.h" #include "usbd_msc.h" #include "usb_scsi.h" -#if CONFIG_USBDEV_MSC_THREAD_ENABLE +#ifdef CONFIG_USBDEV_MSC_THREAD #include "usb_osal.h" #endif @@ -34,9 +34,9 @@ #define MASS_STORAGE_BULK_EP_MPS 512 #endif -#define THREAD_OP_READ_QUEUED 1 -#define THREAD_OP_WRITE_QUEUED 2 -#define THREAD_OP_WRITE_DONE 3 +#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 @@ -76,7 +76,7 @@ struct usbd_msc_cfg_priv { /*memory OK (after a usbd_msc_memory_verify)*/ static bool memOK; -#if CONFIG_USBDEV_MSC_THREAD_ENABLE +#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; @@ -216,17 +216,19 @@ static void SCSI_SetSenseData(uint32_t KCQ) usbd_msc_cfg.ASQ = (uint8_t)(KCQ); } -#if CONFIG_USBDEV_MSC_THREAD_ENABLE +#ifdef CONFIG_USBDEV_MSC_THREAD static void usbd_msc_thread_memory_read_done(void) { + size_t flags; uint32_t transfer_len; + uint32_t offset; USB_LOG_DBG("read addr:%d\r\n", usbd_msc_cfg.scsi_blk_addr); - transfer_len = MIN(usbd_msc_cfg.scsi_blk_len, MASS_STORAGE_BULK_EP_MPS); + flags = usb_osal_enter_critical_section(); - usbd_ep_write(mass_ep_data[MSD_IN_EP_IDX].ep_addr, - &usbd_msc_cfg.block_buffer[usbd_msc_cfg.scsi_blk_addr % usbd_msc_cfg.scsi_blk_size], transfer_len, NULL); + transfer_len = MIN(usbd_msc_cfg.scsi_blk_len, MASS_STORAGE_BULK_EP_MPS); + offset = usbd_msc_cfg.scsi_blk_addr % usbd_msc_cfg.scsi_blk_size; usbd_msc_cfg.scsi_blk_addr += transfer_len; usbd_msc_cfg.scsi_blk_len -= transfer_len; @@ -235,6 +237,10 @@ static void usbd_msc_thread_memory_read_done(void) if (usbd_msc_cfg.scsi_blk_len == 0) { usbd_msc_cfg.stage = MSC_SEND_CSW; } + usb_osal_leave_critical_section(flags); + + usbd_ep_write(mass_ep_data[MSD_IN_EP_IDX].ep_addr, + &usbd_msc_cfg.block_buffer[offset], transfer_len, NULL); } #endif @@ -248,8 +254,8 @@ static bool SCSI_processRead(void) /* we read an entire block */ if (!(usbd_msc_cfg.scsi_blk_addr % usbd_msc_cfg.scsi_blk_size)) { -#if CONFIG_USBDEV_MSC_THREAD_ENABLE - thread_op = THREAD_OP_READ_QUEUED; +#ifdef CONFIG_USBDEV_MSC_THREAD + thread_op = MSC_THREAD_OP_READ_MEM; usb_osal_sem_give(msc_sem); return true; #else @@ -274,25 +280,30 @@ static bool SCSI_processRead(void) return true; } -#if CONFIG_USBDEV_MSC_THREAD_ENABLE +#ifdef CONFIG_USBDEV_MSC_THREAD static void usbd_msc_thread_memory_write_done() { + size_t flags; uint32_t bytes_read; USB_LOG_DBG("write addr:%d\r\n", usbd_msc_cfg.scsi_blk_addr); + flags = usb_osal_enter_critical_section(); + bytes_read = current_byte_read; usbd_msc_cfg.scsi_blk_addr += bytes_read; usbd_msc_cfg.scsi_blk_len -= bytes_read; usbd_msc_cfg.csw.dDataResidue -= bytes_read; - if (usbd_msc_cfg.scsi_blk_len == 0) { - sendCSW(CSW_STATUS_CMD_PASSED); - } + usb_osal_leave_critical_section(flags); - thread_op = THREAD_OP_WRITE_DONE; + thread_op = MSC_THREAD_OP_WRITE_DONE; /*set ep ack to recv next data*/ usbd_ep_read(mass_ep_data[MSD_OUT_EP_IDX].ep_addr, NULL, 0, NULL); + + if (usbd_msc_cfg.scsi_blk_len == 0) { + sendCSW(CSW_STATUS_CMD_PASSED); + } } #endif @@ -307,8 +318,8 @@ static bool SCSI_processWrite() /* if the array is filled, write it in memory */ if ((usbd_msc_cfg.scsi_blk_addr % usbd_msc_cfg.scsi_blk_size) + bytes_read >= usbd_msc_cfg.scsi_blk_size) { -#if CONFIG_USBDEV_MSC_THREAD_ENABLE - thread_op = THREAD_OP_WRITE_QUEUED; +#ifdef CONFIG_USBDEV_MSC_THREAD + thread_op = MSC_THREAD_OP_WRITE_MEM; current_byte_read = bytes_read; usb_osal_sem_give(msc_sem); return true; @@ -975,8 +986,8 @@ static void mass_storage_bulk_out(uint8_t ep) break; } -#if CONFIG_USBDEV_MSC_THREAD_ENABLE - if (thread_op != THREAD_OP_WRITE_QUEUED) { +#ifdef CONFIG_USBDEV_MSC_THREAD + if (thread_op != MSC_THREAD_OP_WRITE_MEM) { /*set ep ack to recv next data*/ usbd_ep_read(ep, NULL, 0, NULL); } @@ -1040,20 +1051,20 @@ void msc_storage_notify_handler(uint8_t event, void *arg) } } -#if CONFIG_USBDEV_MSC_THREAD_ENABLE +#ifdef CONFIG_USBDEV_MSC_THREAD static void usbd_msc_thread(void *argument) { while (1) { usb_osal_sem_take(msc_sem, 0xffffffff); switch (thread_op) { - case THREAD_OP_READ_QUEUED: + case MSC_THREAD_OP_READ_MEM: if (usbd_msc_sector_read((usbd_msc_cfg.scsi_blk_addr / usbd_msc_cfg.scsi_blk_size), usbd_msc_cfg.block_buffer, usbd_msc_cfg.scsi_blk_size) != 0) { SCSI_SetSenseData(SCSI_KCQHE_UREINRESERVEDAREA); } usbd_msc_thread_memory_read_done(); break; - case THREAD_OP_WRITE_QUEUED: + case MSC_THREAD_OP_WRITE_MEM: if (usbd_msc_sector_write((usbd_msc_cfg.scsi_blk_addr / usbd_msc_cfg.scsi_blk_size), usbd_msc_cfg.block_buffer, usbd_msc_cfg.scsi_blk_size) != 0) { SCSI_SetSenseData(SCSI_KCQHE_WRITEFAULT); } @@ -1096,7 +1107,7 @@ void usbd_msc_class_init(uint8_t out_ep, uint8_t in_ep) usbd_msc_cfg.block_buffer = usb_iomalloc(usbd_msc_cfg.scsi_blk_size * sizeof(uint8_t)); } -#if CONFIG_USBDEV_MSC_THREAD_ENABLE +#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) { diff --git a/usb_config.h b/usb_config.h index be7eee0d..e619e6ce 100644 --- a/usb_config.h +++ b/usb_config.h @@ -15,6 +15,9 @@ #define CONFIG_USBDEV_TEST_MODE 0 #endif +/* cdc class */ +// #define CONFIG_USBDEV_CDC_ACM_UART + /* msc class */ #ifndef CONFIG_USBDEV_MSC_MANUFACTURER_STRING #define CONFIG_USBDEV_MSC_MANUFACTURER_STRING "" @@ -28,16 +31,16 @@ #define CONFIG_USBDEV_MSC_VERSION_STRING "0.01" #endif -#ifndef CONFIG_USBDEV_MSC_THREAD_ENABLE -#define CONFIG_USBDEV_MSC_THREAD_ENABLE 0 -#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 10 +#define CONFIG_USBDEV_MSC_PRIO 4 +#endif #endif /* audio class */ |
