| Index: umsboot/src/protocol/usb/usb.c | 
| — | — | @@ -377,7 +377,7 @@ | 
| 378 | 378 | { | 
| 379 | 379 | int epidx; | 
| 380 | 380 | int ifidx; | 
| 381 |  | -        const struct usb_endpoint* endpoint = usb_find_endpoint(data, epnum, &epidx, &ifidx); | 
|  | 381 | +        const struct usb_endpoint* endpoint = usb_find_endpoint(data, epnum, &ifidx, &epidx); | 
| 382 | 382 | if (!endpoint) data->driver->unconfigure_ep(data, epnum); | 
| 383 | 383 | else if (endpoint->timeout) endpoint->timeout(data, ifidx, epidx, bytesleft); | 
| 384 | 384 | } | 
| — | — | @@ -404,7 +404,7 @@ | 
| 405 | 405 | { | 
| 406 | 406 | int epidx; | 
| 407 | 407 | int ifidx; | 
| 408 |  | -        const struct usb_endpoint* endpoint = usb_find_endpoint(data, epnum, &epidx, &ifidx); | 
|  | 408 | +        const struct usb_endpoint* endpoint = usb_find_endpoint(data, epnum, &ifidx, &epidx); | 
| 409 | 409 | if (!endpoint) usb_unconfigure_ep(data, epnum); | 
| 410 | 410 | else if (endpoint->xfer_complete) endpoint->xfer_complete(data, ifidx, epidx, bytesleft); | 
| 411 | 411 | } | 
| — | — | @@ -420,7 +420,7 @@ | 
| 421 | 421 | { | 
| 422 | 422 | int epidx; | 
| 423 | 423 | int ifidx; | 
| 424 |  | -        const struct usb_endpoint* endpoint = usb_find_endpoint(data, epnum, &epidx, &ifidx); | 
|  | 424 | +        const struct usb_endpoint* endpoint = usb_find_endpoint(data, epnum, &ifidx, &epidx); | 
| 425 | 425 | if (!endpoint) usb_unconfigure_ep(data, epnum); | 
| 426 | 426 | else if (endpoint->setup_received) endpoint->setup_received(data, ifidx, epidx); | 
| 427 | 427 | } | 
| Index: emcore/trunk/usb/usbdebug.c | 
| — | — | @@ -174,9 +174,9 @@ | 
| 175 | 175 | case 1:  // START MEMORY TRANSFER | 
| 176 | 176 | bulk_state[bulk_ctrlreq_ep].addr = (void*)buf[1]; | 
| 177 | 177 | bulk_state[bulk_ctrlreq_ep].size = buf[2]; | 
| 178 |  | -            usbdebug_bulk_xfer_complete(data, 0, bulk_ctrlreq_ep, 0);  // Convenient way to start a transfer.
 | 
| 179 | 178 | usb_set_stall(data, ep0out, true); | 
| 180 | 179 | usb_ep0_start_tx(data, NULL, 0, NULL); | 
|  | 180 | +            usbdebug_bulk_xfer_complete(data, 0, bulk_ctrlreq_ep, 0);  // Convenient way to start a transfer. | 
| 181 | 181 | break; | 
| 182 | 182 | default: | 
| 183 | 183 | usb_set_stall(data, ep0out, true); | 
| Index: emcore/trunk/usb/usb.c | 
| — | — | @@ -377,7 +377,7 @@ | 
| 378 | 378 | { | 
| 379 | 379 | int epidx; | 
| 380 | 380 | int ifidx; | 
| 381 |  | -        const struct usb_endpoint* endpoint = usb_find_endpoint(data, epnum, &epidx, &ifidx); | 
|  | 381 | +        const struct usb_endpoint* endpoint = usb_find_endpoint(data, epnum, &ifidx, &epidx); | 
| 382 | 382 | if (!endpoint) data->driver->unconfigure_ep(data, epnum); | 
| 383 | 383 | else if (endpoint->timeout) endpoint->timeout(data, ifidx, epidx, bytesleft); | 
| 384 | 384 | } | 
| — | — | @@ -404,7 +404,7 @@ | 
| 405 | 405 | { | 
| 406 | 406 | int epidx; | 
| 407 | 407 | int ifidx; | 
| 408 |  | -        const struct usb_endpoint* endpoint = usb_find_endpoint(data, epnum, &epidx, &ifidx); | 
|  | 408 | +        const struct usb_endpoint* endpoint = usb_find_endpoint(data, epnum, &ifidx, &epidx); | 
| 409 | 409 | if (!endpoint) usb_unconfigure_ep(data, epnum); | 
| 410 | 410 | else if (endpoint->xfer_complete) endpoint->xfer_complete(data, ifidx, epidx, bytesleft); | 
| 411 | 411 | } | 
| — | — | @@ -420,7 +420,7 @@ | 
| 421 | 421 | { | 
| 422 | 422 | int epidx; | 
| 423 | 423 | int ifidx; | 
| 424 |  | -        const struct usb_endpoint* endpoint = usb_find_endpoint(data, epnum, &epidx, &ifidx); | 
|  | 424 | +        const struct usb_endpoint* endpoint = usb_find_endpoint(data, epnum, &ifidx, &epidx); | 
| 425 | 425 | if (!endpoint) usb_unconfigure_ep(data, epnum); | 
| 426 | 426 | else if (endpoint->setup_received) endpoint->setup_received(data, ifidx, epidx); | 
| 427 | 427 | } | 
| Index: emcore/trunk/tools/libemcore.py | 
| — | — | @@ -127,7 +127,7 @@ | 
| 128 | 128 | """ | 
| 129 | 129 | return self.lib.monitorcommand(struct.pack("<IIII%ds" % len(data), 5, addr, len(data), 0, data), "III", (None, None, None)) | 
| 130 | 130 |  | 
| 131 |  | -    @command()
 | 
|  | 131 | +    @command(timeout = 10000) | 
| 132 | 132 | def _readmem_bulk(self, addr, size): | 
| 133 | 133 | """ Reads the memory from location 'addr' with size 'size' | 
| 134 | 134 | from the device. Can handle unlimited amounts of bytes, | 
| — | — | @@ -135,7 +135,7 @@ | 
| 136 | 136 | """ | 
| 137 | 137 | return self.lib.recvbulk(struct.pack("<III", 1, addr, size), size) | 
| 138 | 138 |  | 
| 139 |  | -    @command()
 | 
|  | 139 | +    @command(timeout = 10000) | 
| 140 | 140 | def _writemem_bulk(self, addr, data): | 
| 141 | 141 | """ Writes the data in 'data' to the location 'addr' | 
| 142 | 142 | in the memory of the device. Can handle unlimited amounts of bytes, | 
| — | — | @@ -199,10 +199,11 @@ | 
| 200 | 200 | size -= align | 
| 201 | 201 | align = size & 63 | 
| 202 | 202 | size -= align | 
| 203 |  | -                data += self._readmem_bulk(addr, size)
 | 
| 204 |  | -                addr += size
 | 
|  | 203 | +                if size: | 
|  | 204 | +                    data += self._readmem_bulk(addr, size) | 
|  | 205 | +                    addr += size | 
| 205 | 206 | size = align | 
| 206 |  | -        except: self.logger.warn("Bulk read interface failed, falling back to slow reads\n")
 | 
|  | 207 | +        except: raise#self.logger.warn("Bulk read interface failed, falling back to slow reads\n") | 
| 207 | 208 | while size > 0: | 
| 208 | 209 | readsize = min(size, 0xf00) | 
| 209 | 210 | data += self._readmem(addr, readsize) | 
| — | — | @@ -228,9 +229,10 @@ | 
| 229 | 230 | size -= align | 
| 230 | 231 | align = size & 63 | 
| 231 | 232 | size -= align | 
| 232 |  | -                self._writemem_bulk(addr, data[offset:offset+size])
 | 
| 233 |  | -                offset += size
 | 
| 234 |  | -                addr += size
 | 
|  | 233 | +                if size: | 
|  | 234 | +                    self._writemem_bulk(addr, data[offset:offset+size]) | 
|  | 235 | +                    offset += size | 
|  | 236 | +                    addr += size | 
| 235 | 237 | size = align | 
| 236 | 238 | except: self.logger.warn("Bulk write interface failed, falling back to slow writes\n") | 
| 237 | 239 | while size > 0: | 
| — | — | @@ -1104,11 +1106,11 @@ | 
| 1105 | 1107 | return writelen | 
| 1106 | 1108 |  | 
| 1107 | 1109 | def sendbulk(self, cmd, data): | 
| 1108 |  | -        self.logger.debug("Sending bulk command [0x%s]\n" % base64.b16encode(cmd[3::-1]).decode("ascii"))
 | 
|  | 1110 | +        self.logger.debug("Sending bulk command [0x%s] with %d bytes\n" % (base64.b16encode(cmd[3::-1]).decode("ascii"), len(data))) | 
| 1109 | 1111 | return self.dev.sendbulk(cmd, data) | 
| 1110 | 1112 |  | 
| 1111 | 1113 | def recvbulk(self, cmd, size): | 
| 1112 |  | -        self.logger.debug("Receiving bulk command [0x%s]\n" % base64.b16encode(cmd[3::-1]).decode("ascii"))
 | 
|  | 1114 | +        self.logger.debug("Receiving bulk command [0x%s] with %d bytes\n" % (base64.b16encode(cmd[3::-1]).decode("ascii"), size)) | 
| 1113 | 1115 | return self.dev.recvbulk(cmd, size) | 
| 1114 | 1116 |  | 
| 1115 | 1117 |  | 
| — | — | @@ -1198,9 +1200,9 @@ | 
| 1199 | 1201 | return data | 
| 1200 | 1202 |  | 
| 1201 | 1203 | def sendbulk(self, cmd, data): | 
| 1202 |  | -        size = self.dev.ctrl_transfer(0x42, 0x00, 0, self.bulkout.bEndpointAddress, cmd, self.timeout)
 | 
| 1203 |  | -        if size != len(cmd):
 | 
| 1204 |  | -            raise SendError("Bulk send command could not be fully sent (%d of %d)!" % (size, len(cmd)))
 | 
|  | 1204 | +        cmdsize = self.dev.ctrl_transfer(0x42, 0x00, 0, self.bulkout.bEndpointAddress, cmd, self.timeout) | 
|  | 1205 | +        if cmdsize != len(cmd): | 
|  | 1206 | +            raise SendError("Bulk send command could not be fully sent (%d of %d)!" % (cmdsize, len(cmd))) | 
| 1205 | 1207 | size = self.bulkout.write(data, self.timeout) | 
| 1206 | 1208 | if size != len(data): | 
| 1207 | 1209 | raise SendError("Bulk data could not be fully sent (%d of %d)!" % (size, len(data))) | 
| — | — | @@ -1207,12 +1209,12 @@ | 
| 1208 | 1210 | return size | 
| 1209 | 1211 |  | 
| 1210 | 1212 | def recvbulk(self, cmd, size): | 
| 1211 |  | -        size = self.dev.ctrl_transfer(0x42, 0x00, 0, self.bulkin.bEndpointAddress, cmd, self.timeout)
 | 
| 1212 |  | -        if size != len(cmd):
 | 
| 1213 |  | -            raise ReceiveError("Bulk receive command could not be fully sent (%d of %d)!" % (size, len(cmd)))
 | 
|  | 1213 | +        cmdsize = self.dev.ctrl_transfer(0x42, 0x00, 0, self.bulkin.bEndpointAddress, cmd, self.timeout) | 
|  | 1214 | +        if cmdsize != len(cmd): | 
|  | 1215 | +            raise ReceiveError("Bulk receive command could not be fully sent (%d of %d)!" % (cmdsize, len(cmd))) | 
| 1214 | 1216 | data = self.bulkin.read(size, self.timeout) | 
| 1215 | 1217 | if len(data) != size: | 
| 1216 |  | -            raise SendError("Bulk data could not be fully received (%d of %d)!" % (len(cmd), size))
 | 
|  | 1218 | +            raise SendError("Bulk data could not be fully received (%d of %d)!" % (len(data), size)) | 
| 1217 | 1219 | return data | 
| 1218 | 1220 |  | 
| 1219 | 1221 |  |