From 2c541094250a2927d0df64a46fe7973ae64a88f4 Mon Sep 17 00:00:00 2001 From: sakumisu <1203593632@qq.com> Date: Sun, 25 Sep 2022 19:47:41 +0800 Subject: [PATCH] add msc readonly feature --- class/msc/usbd_msc.c | 10 ++++++++++ class/msc/usbd_msc.h | 5 ++--- 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