summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--SConscript2
-rw-r--r--class/msc/usbd_msc.c36
-rw-r--r--platform/daplink/dap_main.c41
3 files changed, 51 insertions, 28 deletions
diff --git a/SConscript b/SConscript
index b1ea4906..2eeed782 100644
--- a/SConscript
+++ b/SConscript
@@ -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