From f278032e9fc703f9409d85cc5feea4d24820870f Mon Sep 17 00:00:00 2001 From: Benjamin Freeman Date: Thu, 14 Feb 2019 12:40:04 +0100 Subject: [PATCH] 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 --- hpl/usb/hpl_usb.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/hpl/usb/hpl_usb.c b/hpl/usb/hpl_usb.c index 6bf09ab..cc6cc41 100644 --- a/hpl/usb/hpl_usb.c +++ b/hpl/usb/hpl_usb.c @@ -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. */