cherry-embedded / CherryUSB

CherryUSB is a tiny and portable USB Stack (device & host) for embedded system with USB IP
https://cherryusb.readthedocs.io/
Apache License 2.0
1.14k stars 245 forks source link

BL616 USB MSC Long Delay Write Issue #205

Closed WGR7 closed 1 month ago

WGR7 commented 1 month ago

Hi,

I'm using a BL616 with USB HS mode. I've updated component to more recent master CherryUSB branch.

I have a very slow media: a NOR Flash SPI. I'm getting a issue while writing to the media. In the middle of transfer I get a type of reconfig of interfaces with these messages. They are the same message when the USB cable is plugged in USB port. The file to write is large, about 40MBytes.

[D/USB] write lba:152 [D/USB] EP0 send 18 bytes, 0 remained [D/USB] EP0 send 18 bytes, 0 remained [D/USB] EP0 send 64 bytes, 34 remained [D/USB] EP0 send 34 bytes, 0 remained [D/USB] EP0 send 22 bytes, 0 remained [I/USB] Open ep:0x86 type:3 mps:8 [I/USB] Open ep:0x02 type:2 mps:512 [I/USB] Open ep:0x81 type:2 mps:512 [I/USB] Open ep:0x04 type:2 mps:512 [I/USB] Open ep:0x83 type:2 mps:512

To isolate the problem I did take the example of the composite device cdc_mscram and in the final of the write function I've added a vTaksDelay(200).

int usbd_msc_sector_write(uint8_t busid, uint8_t lun, uint32_t sector, uint8_t *buffer, uint32_t length)
{
    if (sector < 10)
        memcpy(mass_block[sector].BlockSpace, buffer, length);

    vTaskDelay(200);
    return 0;
}

The issue is still the same, the device is reconfigured and the transfer stops.

[D/USB] 2 [D/USB] read lba:196 [D/USB] 2 [D/USB] read lba:197 [D/USB] 2 [D/USB] read lba:198 [D/USB] 2 [D/USB] read lba:199 [D/USB] Send csw [D/USB] Start reading cbw [D/USB] Decode CB:0x28 [D/USB] lba: 0x0100 [D/USB] nsectors: 0x08 [D/USB] 2 [D/USB] read lba:256 [D/USB] 2 [D/USB] read lba:257 [D/USB] 2 [D/USB] read lba:258 [D/USB] 2 [D/USB] read lba:259 [D/USB] 2 [D/USB] read lba:260 [D/USB] 2 [D/USB] read lba:261 [D/USB] 2 [D/USB] read lba:262 [D/USB] 2 [D/USB] read lba:263 [D/USB] Send csw [D/USB] Start reading cbw [D/USB] Decode CB:0x2a [D/USB] lba: 0x0000 [D/USB] nsectors: 0xc8 [D/USB] 1 [D/USB] write lba:0 [D/USB] 1 [D/USB] write lba:1 [D/USB] 1 [D/USB] write lba:2 [D/USB] 1 [D/USB] write lba:3 [D/USB] 1 [D/USB] write lba:4 [D/USB] 1 [D/USB] write lba:5 [D/USB] 1 [D/USB] write lba:6 [D/USB] 1 [D/USB] write lba:7 [D/USB] 1 [D/USB] write lba:8 [D/USB] 1 [D/USB] write lba:9 [D/USB] 1 [D/USB] write lba:10 [D/USB] 1 [D/USB] write lba:11 [D/USB] 1 [D/USB] write lba:12 [D/USB] 1 [D/USB] write lba:13 [D/USB] 1 [D/USB] write lba:14 [D/USB] 1 [D/USB] write lba:15 [D/USB] 1 [D/USB] write lba:16 [D/USB] 1 [D/USB] write lba:17 [D/USB] 1 [D/USB] write lba:18 [D/USB] 1 [D/USB] write lba:19 [D/USB] 1 [D/USB] write lba:20 [D/USB] 1 [D/USB] write lba:21 [D/USB] 1 [D/USB] write lba:22 [D/USB] 1 [D/USB] write lba:23 [D/USB] 1 [D/USB] write lba:24 [D/USB] 1 [D/USB] write lba:25 [D/USB] 1 [D/USB] write lba:26 [D/USB] 1 [D/USB] write lba:27 [D/USB] 1 [D/USB] write lba:28 [D/USB] 1 [D/USB] write lba:29 [D/USB] 1 [D/USB] write lba:30 [D/USB] 1 [D/USB] write lba:31 [D/USB] 1 [D/USB] write lba:32 [D/USB] 1 [D/USB] write lba:33 [D/USB] 1 [D/USB] write lba:34 [D/USB] 1 [D/USB] write lba:35 [D/USB] 1 [D/USB] write lba:36 [D/USB] 1 [D/USB] write lba:37 [D/USB] 1 [D/USB] write lba:38 [D/USB] 1 [D/USB] write lba:39 [D/USB] 1 [D/USB] write lba:40 [D/USB] 1 [D/USB] write lba:41 [D/USB] 1 [D/USB] write lba:42 [D/USB] 1 [D/USB] write lba:43 [D/USB] 1 [D/USB] write lba:44 [D/USB] 1 [D/USB] write lba:45 [D/USB] 1 [D/USB] write lba:46 [D/USB] 1 [D/USB] write lba:47 [D/USB] 1 [D/USB] write lba:48 [D/USB] 1 [D/USB] write lba:49 [D/USB] 1 [D/USB] write lba:50 [D/USB] 1 [D/USB] write lba:51 [D/USB] 1 [D/USB] write lba:52 [D/USB] 1 [D/USB] write lba:53 [D/USB] 1 [D/USB] write lba:54 [D/USB] 1 [D/USB] write lba:55 [D/USB] 1 [D/USB] write lba:56 [D/USB] 1 [D/USB] write lba:57 [D/USB] 1 [D/USB] write lba:58 [D/USB] 1 [D/USB] write lba:59 [D/USB] 1 [D/USB] write lba:60 [D/USB] 1 [D/USB] write lba:61 [D/USB] 1 [D/USB] write lba:62 [D/USB] 1 [D/USB] write lba:63 [D/USB] 1 [D/USB] write lba:64 [D/USB] 1 [D/USB] write lba:65 [D/USB] 1 [D/USB] write lba:66 [D/USB] 1 [D/USB] write lba:67 [D/USB] 1 [D/USB] write lba:68 [D/USB] 1 [D/USB] write lba:69 [D/USB] 1 [D/USB] write lba:70 [D/USB] 1 [D/USB] write lba:71 [D/USB] 1 [D/USB] write lba:72 [D/USB] 1 [D/USB] write lba:73 [D/USB] 1 [D/USB] write lba:74 [D/USB] 1 [D/USB] write lba:75 [D/USB] 1 [D/USB] write lba:76 [D/USB] 1 [D/USB] write lba:77 [D/USB] 1 [D/USB] write lba:78 [D/USB] 1 [D/USB] write lba:79 [D/USB] 1 [D/USB] write lba:80 [D/USB] 1 [D/USB] write lba:81 [D/USB] 1 [D/USB] write lba:82 [D/USB] 1 [D/USB] write lba:83 [D/USB] 1 [D/USB] write lba:84 [D/USB] 1 [D/USB] write lba:85 [D/USB] 1 [D/USB] write lba:86 [D/USB] 1 [D/USB] write lba:87 [D/USB] 1 [D/USB] write lba:88 [D/USB] 1 [D/USB] write lba:89 [D/USB] 1 [D/USB] write lba:90 [D/USB] 1 [D/USB] write lba:91 [D/USB] 1 [D/USB] write lba:92 [D/USB] 1 [D/USB] write lba:93 [D/USB] 1 [D/USB] write lba:94 [D/USB] 1 [D/USB] write lba:95 [D/USB] 1 [D/USB] write lba:96 [D/USB] 1 [D/USB] write lba:97 [D/USB] 1 [D/USB] write lba:98 [D/USB] 1 [D/USB] write lba:99 [D/USB] 1 [D/USB] write lba:100 [D/USB] 1 [D/USB] write lba:101 [D/USB] 1 [D/USB] write lba:102 [D/USB] 1 [D/USB] write lba:103 [D/USB] 1 [D/USB] write lba:104 [D/USB] 1 [D/USB] write lba:105 [D/USB] 1 [D/USB] write lba:106 [D/USB] 1 [D/USB] write lba:107 [D/USB] 1 [D/USB] write lba:108 [D/USB] 1 [D/USB] write lba:109 [D/USB] 1 [D/USB] write lba:110 [D/USB] 1 [D/USB] write lba:111 [D/USB] 1 [D/USB] write lba:112 [D/USB] 1 [D/USB] write lba:113 [D/USB] 1 [D/USB] write lba:114 [D/USB] 1 [D/USB] write lba:115 [D/USB] 1 [D/USB] write lba:116 [D/USB] 1 [D/USB] write lba:117 [D/USB] 1 [D/USB] write lba:118 [D/USB] 1 [D/USB] write lba:119 [D/USB] 1 [D/USB] write lba:120 [D/USB] 1 [D/USB] write lba:121 [D/USB] 1 [D/USB] write lba:122 [D/USB] 1 [D/USB] write lba:123 [D/USB] 1 [D/USB] write lba:124 [D/USB] 1 [D/USB] write lba:125 [D/USB] 1 [D/USB] write lba:126 [D/USB] 1 [D/USB] write lba:127 [D/USB] 1 [D/USB] write lba:128 [D/USB] 1 [D/USB] write lba:129 [D/USB] 1 [D/USB] write lba:130 [D/USB] 1 [D/USB] write lba:131 [D/USB] 1 [D/USB] write lba:132 [D/USB] 1 [D/USB] write lba:133 [D/USB] 1 [D/USB] write lba:134 [D/USB] 1 [D/USB] write lba:135 [D/USB] 1 [D/USB] write lba:136 [D/USB] 1 [D/USB] write lba:137 [D/USB] 1 [D/USB] write lba:138 [D/USB] 1 [D/USB] write lba:139 [D/USB] 1 [D/USB] write lba:140 [D/USB] 1 [D/USB] write lba:141 [D/USB] 1 [D/USB] write lba:142 [D/USB] 1 [D/USB] write lba:143 [D/USB] 1 [D/USB] write lba:144 [D/USB] 1 [D/USB] write lba:145 [D/USB] 1 [D/USB] write lba:146 [D/USB] 1 [D/USB] write lba:147 [D/USB] 1 [D/USB] write lba:148 [D/USB] 1 [D/USB] write lba:149 [D/USB] 1 [D/USB] write lba:150 [D/USB] 1 [D/USB] write lba:151 [D/USB] 1 [D/USB] write lba:152 [D/USB] 1 [D/USB] write lba:153 [D/USB] 1 [D/USB] write lba:154 [D/USB] 1 [D/USB] write lba:155 [D/USB] 1 [D/USB] write lba:156 [D/USB] 1 [D/USB] write lba:157 [D/USB] 1 [D/USB] write lba:158 [D/USB] 1 [D/USB] write lba:159 [D/USB] 1 [D/USB] write lba:160 [D/USB] EP0 send 18 bytes, 0 remained [D/USB] EP0 send 18 bytes, 0 remained [D/USB] EP0 send 64 bytes, 34 remained [D/USB] EP0 send 34 bytes, 0 remained [D/USB] EP0 send 22 bytes, 0 remained [I/USB] Open ep:0x86 type:3 mps:8 [I/USB] Open ep:0x02 type:2 mps:512 [I/USB] Open ep:0x81 type:2 mps:512 [I/USB] Open ep:0x04 type:2 mps:512 [I/USB] Open ep:0x83 type:2 mps:512 [D/USB] Start reading cbw [D/USB] Start reading 7 bytes from ep0 [D/USB] EP0 recv 7 bytes, 0 remained [D/USB] CDC Class request: bRequest 0x20 [D/USB] Set intf:0 linecoding <9600 8 N 1> [D/USB] Decode CB:0x2a [D/USB] lba: 0x0000 [D/USB] nsectors: 0xc8 [D/USB] 1 [D/USB] write lba:0 [D/USB] 1 [D/USB] write lba:1 [D/USB] 1 [D/USB] write lba:2 [D/USB] 1 [D/USB] write lba:3 [D/USB] 1 [D/USB] write lba:4 [D/USB] 1 [D/USB] write lba:5 [D/USB] 1 [D/USB] write lba:6 [D/USB] 1 [D/USB] write lba:7 [D/USB] 1 [D/USB] write lba:8 [D/USB] 1 [D/USB] write lba:9 [D/USB] 1 [D/USB] write lba:10 [D/USB] 1 [D/USB] write lba:11 [D/USB] 1 [D/USB] write lba:12 [D/USB] 1 [D/USB] write lba:13 [D/USB] 1 [D/USB] write lba:14 [D/USB] 1 [D/USB] write lba:15 [D/USB] 1 [D/USB] write lba:16 [D/USB] 1 [D/USB] write lba:17 [D/USB] 1 [D/USB] write lba:18 [D/USB] 1 [D/USB] write lba:19 [D/USB] 1 [D/USB] write lba:20 [D/USB] 1 [D/USB] write lba:21 [D/USB] 1 [D/USB] write lba:22 [D/USB] 1 [D/USB] write lba:23 [D/USB] 1 [D/USB] write lba:24 [D/USB] 1 [D/USB] write lba:25 [D/USB] 1 [D/USB] write lba:26 [D/USB] 1 [D/USB] write lba:27 [D/USB] 1 [D/USB] write lba:28 [D/USB] 1 [D/USB] write lba:29 [D/USB] 1 [D/USB] write lba:30 [D/USB] 1 [D/USB] write lba:31 [D/USB] 1 [D/USB] write lba:32 [D/USB] 1 [D/USB] write lba:33 [D/USB] 1 [D/USB] write lba:34 [D/USB] 1 [D/USB] write lba:35 [D/USB] 1 [D/USB] write lba:36 [D/USB] 1 [D/USB] write lba:37 [D/USB] 1 [D/USB] write lba:38 [D/USB] 1 [D/USB] write lba:39 [D/USB] 1 [D/USB] write lba:40 [D/USB] 1 [D/USB] write lba:41 [D/USB] 1 [D/USB] write lba:42 [D/USB] 1 [D/USB] write lba:43 [D/USB] 1 [D/USB] write lba:44 [D/USB] 1 [D/USB] write lba:45 [D/USB] 1 [D/USB] write lba:46 [D/USB] 1 [D/USB] write lba:47 [D/USB] 1 [D/USB] write lba:48 [D/USB] 1 [D/USB] write lba:49 [D/USB] 1 [D/USB] write lba:50 [D/USB] 1 [D/USB] write lba:51 [D/USB] 1 [D/USB] write lba:52 [D/USB] 1 [D/USB] write lba:53 [D/USB] 1 [D/USB] write lba:54 [D/USB] 1 [D/USB] write lba:55 [D/USB] 1 [D/USB] write lba:56 [D/USB] 1 [D/USB] write lba:57 [D/USB] 1 [D/USB] write lba:58 [D/USB] 1 [D/USB] write lba:59 [D/USB] 1 [D/USB] write lba:60 [D/USB] 1 [D/USB] write lba:61 [D/USB] 1 [D/USB] write lba:62 [D/USB] 1 [D/USB] write lba:63 [D/USB] 1 [D/USB] write lba:64 [D/USB] 1 [D/USB] write lba:65 [D/USB] 1 [D/USB] write lba:66 [D/USB] 1 [D/USB] write lba:67 [D/USB] 1 [D/USB] write lba:68 [D/USB] 1 [D/USB] write lba:69 [D/USB] 1 [D/USB] write lba:70 [D/USB] 1 [D/USB] write lba:71 [D/USB] 1 [D/USB] write lba:72 [D/USB] 1 [D/USB] write lba:73 [D/USB] 1 [D/USB] write lba:74 [D/USB] 1 [D/USB] write lba:75 [D/USB] 1 [D/USB] write lba:76 [D/USB] 1 [D/USB] write lba:77 [D/USB] 1 [D/USB] write lba:78 [D/USB] 1 [D/USB] write lba:79 [D/USB] 1 [D/USB] write lba:80 [D/USB] 1 [D/USB] write lba:81 [D/USB] 1 [D/USB] write lba:82 [D/USB] 1 [D/USB] write lba:83 [D/USB] 1 [D/USB] write lba:84 [D/USB] 1 [D/USB] write lba:85 [D/USB] 1 [D/USB] write lba:86 [D/USB] 1 [D/USB] write lba:87 [D/USB] 1 [D/USB] write lba:88 [D/USB] 1 [D/USB] write lba:89 [D/USB] 1 [D/USB] write lba:90 [D/USB] 1 [D/USB] write lba:91 [D/USB] 1 [D/USB] write lba:92 [D/USB] 1 [D/USB] write lba:93 [D/USB] 1 [D/USB] write lba:94 [D/USB] 1 [D/USB] write lba:95 [D/USB] 1 [D/USB] write lba:96 [D/USB] 1 [D/USB] write lba:97 [D/USB] 1 [D/USB] write lba:98 [D/USB] 1 [D/USB] write lba:99 [D/USB] 1 [D/USB] write lba:100 [D/USB] 1 [D/USB] write lba:101 [D/USB] 1 [D/USB] write lba:102 [D/USB] 1 [D/USB] write lba:103 [D/USB] 1 [D/USB] write lba:104 [D/USB] 1 [D/USB] write lba:105 [D/USB] 1 [D/USB] write lba:106 [D/USB] 1 [D/USB] write lba:107 [D/USB] 1 [D/USB] write lba:108 [D/USB] 1 [D/USB] write lba:109 [D/USB] 1 [D/USB] write lba:110 [D/USB] 1 [D/USB] write lba:111 [D/USB] 1 [D/USB] write lba:112 [D/USB] 1 [D/USB] write lba:113 [D/USB] 1 [D/USB] write lba:114 [D/USB] 1 [D/USB] write lba:115 [D/USB] 1 [D/USB] write lba:116 [D/USB] 1 [D/USB] write lba:117 [D/USB] 1 [D/USB] write lba:118 [D/USB] 1 [D/USB] write lba:119 [D/USB] 1 [D/USB] write lba:120 [D/USB] 1 [D/USB] write lba:121 [D/USB] 1 [D/USB] write lba:122 [D/USB] 1 [D/USB] write lba:123 [D/USB] 1 [D/USB] write lba:124 [D/USB] 1 [D/USB] write lba:125 [D/USB] 1 [D/USB] write lba:126 [D/USB] 1 [D/USB] write lba:127 [D/USB] 1 [D/USB] write lba:128 [D/USB] 1 [D/USB] write lba:129 [D/USB] 1 [D/USB] write lba:130 [D/USB] 1 [D/USB] write lba:131 [D/USB] 1 [D/USB] write lba:132 [D/USB] 1 [D/USB] write lba:133 [D/USB] 1 [D/USB] write lba:134 [D/USB] 1 [D/USB] write lba:135 [D/USB] 1 [D/USB] write lba:136 [D/USB] 1 [D/USB] write lba:137 [D/USB] 1 [D/USB] write lba:138 [D/USB] 1 [D/USB] write lba:139 [D/USB] 1 [D/USB] write lba:140 [D/USB] 1 [D/USB] write lba:141 [D/USB] 1 [D/USB] write lba:142 [D/USB] 1 [D/USB] write lba:143 [D/USB] 1 [D/USB] write lba:144 [D/USB] 1 [D/USB] write lba:145 [D/USB] 1 [D/USB] write lba:146 [D/USB] 1 [D/USB] write lba:147 [D/USB] 1 [D/USB] write lba:148 [D/USB] 1 [D/USB] write lba:149 [D/USB] 1 [D/USB] write lba:150 [D/USB] 1 [D/USB] write lba:151 [D/USB] 1 [D/USB] write lba:152 [D/USB] EP0 send 18 bytes, 0 remained [D/USB] EP0 send 18 bytes, 0 remained [D/USB] EP0 send 64 bytes, 34 remained [D/USB] EP0 send 34 bytes, 0 remained [D/USB] EP0 send 22 bytes, 0 remained [I/USB] Open ep:0x86 type:3 mps:8 [I/USB] Open ep:0x02 type:2 mps:512 [I/USB] Open ep:0x81 type:2 mps:512 [I/USB] Open ep:0x04 type:2 mps:512 [I/USB] Open ep:0x83 type:2 mps:512 [D/USB] Start reading cbw [D/USB] Start reading 7 bytes from ep0 [D/USB] EP0 recv 7 bytes, 0 remained [D/USB] CDC Class request: bRequest 0x20 [D/USB] Set intf:0 linecoding <9600 8 N 1> [D/USB] MSC Class request: bRequest 0xff [E/USB] ep:83 clear halt [E/USB] ep:04 clear halt [D/USB] Decode CB:0x00 [D/USB] Send csw [D/USB] Start reading cbw

sakumisu commented 1 month ago

Host does not support too slow msc, so stop using it, and your code is incorrect because write api is in isr.

WGR7 commented 1 month ago

BL616 is used as a MSC device, insn't a host. MSC is a blocking protocol as I know, so the write can be slow. I'm using FreeRTOS.

sakumisu commented 1 month ago

BL616 is used as a MSC device, insn't a host. MSC is a blocking protocol as I know, so the write can be slow. I'm using FreeRTOS.

i have said, cherryusb write api is in isr,and host is pc.

sakumisu commented 1 month ago

usbd_msc_sector_write is in isr thanks.Please give up if your flash is too slow, it is not cherryusb problem.

WGR7 commented 1 month ago

I'll take my time and port TinyUSB. your library is a waste of time. Tks.

sakumisu commented 1 month ago

So jokes, you should study freertos first and know freertos api cannot be used in interrupt api

WGR7 commented 1 month ago

I can patch your code to deal with this issue, but I need to know how can I do NAKs to host when the MCU is writing to slow memory. Is there any specific SCSI status to return that can I inform host that device is busy?