fix USB transfer

this ASFv4 USB library change fixes USB transfer.
two transfer-size issues existed:
- on multi-packet transfer if the last packet was less than the
USB transfer packet size, the packet would be received but not
acknowledged
- during normal transfer the packet size of a previous packet set
the size of the current packet, ignoring the actual transfer size

transfer with a combination of partial or full USB single packet,
USB multi-packet, max transfer, and control endpoint sizes was
successfully tested (in bytes): 4, 32, 64, 128, 129, 512, 516,
544, 576, 640, 641, 1024, 1028

Change-Id: Ic4e64168e865362e12e0b76386f964895b8b6c20
This commit is contained in:
Benjamin Freeman 2019-02-14 12:40:04 +01:00 committed by Kévin Redon
parent 26037ab23b
commit f278032e9f
1 changed files with 1 additions and 3 deletions

View File

@ -1135,6 +1135,7 @@ static void _usb_d_dev_out_next(struct _usb_d_dev_ep *ept, bool isr)
/* Short packet. */
ept->flags.bits.need_zlp = 0;
ept->trans_count += last_trans;
_usbd_ep_set_out_trans(epn, 0, ept->size, 0);
} else {
/* Full packets. */
ept->trans_count += trans_size;
@ -1154,9 +1155,6 @@ static void _usb_d_dev_out_next(struct _usb_d_dev_ep *ept, bool isr)
if (trans_next > ept->size) {
if (trans_next > USB_D_DEV_TRANS_MAX) {
trans_next = USB_D_DEV_TRANS_MAX;
} else {
/* Must expect multiple of ep size. */
trans_next -= trans_next & size_mask;
}
} else if (trans_next < ept->size) {
/* Last un-aligned packet should be cached. */