summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsakumisu <[email protected]>2022-05-21 13:43:57 +0800
committersakumisu <[email protected]>2022-05-21 13:43:57 +0800
commitd4fd7c5e811170374fd010cf1eb6f0b72c9847cd (patch)
tree8a49bcbbb1f0ec54745ee876084878b2f5a4a05e
parent42ae5b1b74f81a9fd6fb85ec356f0328ac337668 (diff)
complete msc device with os
-rw-r--r--class/msc/usbd_msc.c59
-rw-r--r--usb_config.h11
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 */