diff options
| -rw-r--r-- | SConscript | 2 | ||||
| -rw-r--r-- | class/msc/usbd_msc.c | 36 | ||||
| -rw-r--r-- | platform/daplink/dap_main.c | 41 |
3 files changed, 51 insertions, 28 deletions
@@ -105,7 +105,7 @@ if GetDepend(['PKG_CHERRYUSB_DEVICE']): src += Glob('port/renesas/device/r_usb_device.c') src += Glob('port/renesas/device/usb_dc_rensas.c') if GetDepend(['PKG_CHERRYUSB_DEVICE_CH32']): - if GetDepend(['PKG_CHERRYUSB_DEVICE_HS']): + if GetDepend(['PKG_CHERRYUSB_DEVICE_SPEED_HS']): src += Glob('port/ch32/usb_dc_usbhs.c') else: src += Glob('port/ch32/usb_dc_usbfs.c') diff --git a/class/msc/usbd_msc.c b/class/msc/usbd_msc.c index 99cec5fa..58e78c2c 100644 --- a/class/msc/usbd_msc.c +++ b/class/msc/usbd_msc.c @@ -505,6 +505,39 @@ static bool SCSI_readCapacity10(uint8_t busid, uint8_t **data, uint32_t *len) return true; } +static bool SCSI_readCapacity16(uint8_t busid, uint8_t **data, uint32_t *len) +{ + uint8_t capacity16[32]; + uint32_t last_lba; + uint32_t blk_size; + + /* service action 0x10 = READ CAPACITY(16); other service actions unsupported */ + if ((g_usbd_msc[busid].cbw.dDataLength == 0U) || + ((g_usbd_msc[busid].cbw.CB[1] & 0x1fU) != 0x10U)) { + SCSI_SetSenseData(busid, SCSI_KCQIR_INVALIDCOMMAND); + return false; + } + + last_lba = g_usbd_msc[busid].scsi_blk_nbr[g_usbd_msc[busid].cbw.bLUN] - 1U; + blk_size = g_usbd_msc[busid].scsi_blk_size[g_usbd_msc[busid].cbw.bLUN]; + + memset(capacity16, 0, sizeof(capacity16)); + /* 8-byte LBA (project volume < 4G, upper 4 bytes stay 0) */ + capacity16[4] = (uint8_t)((last_lba >> 24) & 0xff); + capacity16[5] = (uint8_t)((last_lba >> 16) & 0xff); + capacity16[6] = (uint8_t)((last_lba >> 8) & 0xff); + capacity16[7] = (uint8_t)(last_lba & 0xff); + /* 4-byte block length */ + capacity16[8] = (uint8_t)((blk_size >> 24) & 0xff); + capacity16[9] = (uint8_t)((blk_size >> 16) & 0xff); + capacity16[10] = (uint8_t)((blk_size >> 8) & 0xff); + capacity16[11] = (uint8_t)(blk_size & 0xff); + + memcpy(*data, (uint8_t *)capacity16, sizeof(capacity16)); + *len = sizeof(capacity16); + return true; +} + static bool SCSI_read10(uint8_t busid, uint8_t **data, uint32_t *len) { (void)data; @@ -728,6 +761,9 @@ static bool SCSI_CBWDecode(uint8_t busid, uint32_t nbytes) case SCSI_CMD_READCAPACITY10: ret = SCSI_readCapacity10(busid, &buf2send, &len2send); break; + case SCSI_CMD_READCAPACITY16: + ret = SCSI_readCapacity16(busid, &buf2send, &len2send); + break; case SCSI_CMD_READ10: ret = SCSI_read10(busid, NULL, 0); break; diff --git a/platform/daplink/dap_main.c b/platform/daplink/dap_main.c index 27e0355b..b145c223 100644 --- a/platform/daplink/dap_main.c +++ b/platform/daplink/dap_main.c @@ -335,17 +335,16 @@ static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t USB_Request[DAP_PACKET_COU static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t USB_Response[DAP_PACKET_COUNT][DAP_PACKET_SIZE]; // Response Buffer static uint16_t USB_RespSize[DAP_PACKET_COUNT]; // Response Size -volatile struct cdc_line_coding g_cdc_lincoding; -volatile uint8_t config_uart = 0; -volatile uint8_t config_uart_transfer = 0; - USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t uartrx_ringbuffer[CONFIG_UARTRX_RINGBUF_SIZE]; USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t usbrx_ringbuffer[CONFIG_USBRX_RINGBUF_SIZE]; USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t usb_tmpbuffer[DAP_PACKET_SIZE]; +static volatile struct cdc_line_coding g_cdc_lincoding; +static volatile uint8_t config_uart = 0; +static volatile uint8_t config_uart_transfer = 0; static volatile uint8_t usbrx_idle_flag = 0; -static volatile uint8_t usbtx_idle_flag = 0; -static volatile uint8_t uarttx_idle_flag = 0; +static volatile uint8_t usbtx_idle_flag = 1; +static volatile uint8_t uarttx_idle_flag = 1; USB_NOCACHE_RAM_SECTION chry_ringbuffer_t g_uartrx; USB_NOCACHE_RAM_SECTION chry_ringbuffer_t g_usbrx; @@ -356,9 +355,6 @@ void usbd_event_handler(uint8_t busid, uint8_t event) switch (event) { case USBD_EVENT_RESET: usbrx_idle_flag = 0; - usbtx_idle_flag = 0; - uarttx_idle_flag = 0; - config_uart_transfer = 0; break; case USBD_EVENT_CONNECTED: break; @@ -437,20 +433,13 @@ void usbd_cdc_acm_bulk_out(uint8_t busid, uint8_t ep, uint32_t nbytes) void usbd_cdc_acm_bulk_in(uint8_t busid, uint8_t ep, uint32_t nbytes) { (void)busid; - uint32_t size; - uint8_t *buffer; chry_ringbuffer_linear_read_done(&g_uartrx, nbytes); if ((nbytes % DAP_PACKET_SIZE) == 0 && nbytes) { /* send zlp */ usbd_ep_start_write(0, CDC_IN_EP, NULL, 0); } else { - if (chry_ringbuffer_get_used(&g_uartrx)) { - buffer = chry_ringbuffer_linear_read_setup(&g_uartrx, &size); - usbd_ep_start_write(0, CDC_IN_EP, buffer, size); - } else { - usbtx_idle_flag = 1; - } + usbtx_idle_flag = 1; } } @@ -624,7 +613,8 @@ void chry_dap_handle(void) void usbd_cdc_acm_set_line_coding(uint8_t busid, uint8_t intf, struct cdc_line_coding *line_coding) { (void)busid; - if (memcmp(line_coding, (uint8_t *)&g_cdc_lincoding, sizeof(struct cdc_line_coding)) != 0) { + + if (memcmp((uint8_t *)&g_cdc_lincoding, line_coding, sizeof(struct cdc_line_coding)) != 0 && line_coding->dwDTERate != 0) { memcpy((uint8_t *)&g_cdc_lincoding, line_coding, sizeof(struct cdc_line_coding)); config_uart = 1; config_uart_transfer = 0; @@ -642,6 +632,10 @@ void chry_dap_usb2uart_handle(void) uint32_t size; uint8_t *buffer; + if (usb_device_is_configured(0) == 0) { + return; + } + if (config_uart) { /* disable irq here */ config_uart = 0; @@ -700,16 +694,9 @@ __WEAK void chry_dap_usb2uart_uart_config_callback(struct cdc_line_coding *line_ /* called by user */ void chry_dap_usb2uart_uart_send_complete(uint32_t size) { - uint8_t *buffer; - chry_ringbuffer_linear_read_done(&g_usbrx, size); - if (chry_ringbuffer_get_used(&g_usbrx)) { - buffer = chry_ringbuffer_linear_read_setup(&g_usbrx, &size); - chry_dap_usb2uart_uart_send_bydma(buffer, size); - } else { - uarttx_idle_flag = 1; - } + uarttx_idle_flag = 1; } /* implment by user */ @@ -746,4 +733,4 @@ int usbd_msc_sector_write(uint32_t sector, uint8_t *buffer, uint32_t length) memcpy(mass_block[sector].BlockSpace, buffer, length); return 0; } -#endif +#endif
\ No newline at end of file |
