summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsakumisu <[email protected]>2022-09-25 19:47:41 +0800
committersakumisu <[email protected]>2022-09-25 19:47:41 +0800
commit2c541094250a2927d0df64a46fe7973ae64a88f4 (patch)
tree5f95cf60f9a0afc71ead66fc5c9a33e95e1be875
parentebeffc536882a9c4885bd5124aab6bc0ff2ff5e6 (diff)
add msc readonly feature
-rw-r--r--class/msc/usbd_msc.c10
-rw-r--r--class/msc/usbd_msc.h5
2 files changed, 12 insertions, 3 deletions
diff --git a/class/msc/usbd_msc.c b/class/msc/usbd_msc.c
index bbd2d7c9..708f8d09 100644
--- a/class/msc/usbd_msc.c
+++ b/class/msc/usbd_msc.c
@@ -40,6 +40,7 @@ USB_NOCACHE_RAM_SECTION struct usbd_msc_cfg_priv {
USB_MEM_ALIGNX struct CBW cbw;
USB_MEM_ALIGNX struct CSW csw;
+ bool readonly;
uint8_t sKey; /* Sense key */
uint8_t ASC; /* Additional Sense Code */
uint8_t ASQ; /* Additional Sense Qualifier */
@@ -62,6 +63,7 @@ static volatile uint32_t current_byte_read;
static void usbd_msc_reset(void)
{
usbd_msc_cfg.stage = MSC_READ_CBW;
+ usbd_msc_cfg.readonly = false;
}
static int msc_storage_class_interface_request_handler(struct usb_setup_packet *setup, uint8_t **data, uint32_t *len)
@@ -365,6 +367,9 @@ static bool SCSI_modeSense6(uint8_t **data, uint32_t *len)
uint8_t sense6[SCSIRESP_MODEPARAMETERHDR6_SIZEOF] = { 0x03, 0x00, 0x00, 0x00 };
+ if (usbd_msc_cfg.readonly) {
+ sense6[2] = 0x80;
+ }
memcpy(*data, (uint8_t *)sense6, data_len);
*len = data_len;
return true;
@@ -950,4 +955,9 @@ struct usbd_interface *usbd_msc_alloc_intf(const uint8_t out_ep, const uint8_t i
#endif
return intf;
+}
+
+void usbd_msc_set_readonly(bool readonly)
+{
+ usbd_msc_cfg.readonly = readonly;
} \ No newline at end of file
diff --git a/class/msc/usbd_msc.h b/class/msc/usbd_msc.h
index d22e099d..53ec4692 100644
--- a/class/msc/usbd_msc.h
+++ b/class/msc/usbd_msc.h
@@ -15,13 +15,12 @@ extern "C" {
/* Alloc msc interface driver */
struct usbd_interface *usbd_msc_alloc_intf(const uint8_t out_ep, const uint8_t in_ep);
-void mass_storage_bulk_out(uint8_t ep, uint32_t nbytes);
-void mass_storage_bulk_in(uint8_t ep, uint32_t nbytes);
-
void usbd_msc_get_cap(uint8_t lun, uint32_t *block_num, uint16_t *block_size);
int usbd_msc_sector_read(uint32_t sector, uint8_t *buffer, uint32_t length);
int usbd_msc_sector_write(uint32_t sector, uint8_t *buffer, uint32_t length);
+void usbd_msc_set_readonly(bool readonly);
+
#ifdef __cplusplus
}
#endif