@@ -23,12 +23,16 @@ typedef union _USB_Setup {
23
23
}
24
24
USB_Setup_TypeDef ;
25
25
26
+ #define MAX_CAN_MSGS_PER_BULK_TRANSFER 4U
27
+
26
28
void usb_init (void );
27
29
int usb_cb_control_msg (USB_Setup_TypeDef * setup , uint8_t * resp , bool hardwired );
28
30
int usb_cb_ep1_in (void * usbdata , int len , bool hardwired );
29
31
void usb_cb_ep2_out (void * usbdata , int len , bool hardwired );
30
32
void usb_cb_ep3_out (void * usbdata , int len , bool hardwired );
33
+ void usb_cb_ep3_out_complete (void );
31
34
void usb_cb_enumeration_complete (void );
35
+ void usb_outep3_resume_if_paused (void );
32
36
33
37
// **** supporting defines ****
34
38
@@ -380,6 +384,7 @@ USB_Setup_TypeDef setup;
380
384
uint8_t usbdata [0x100 ];
381
385
uint8_t * ep0_txdata = NULL ;
382
386
uint16_t ep0_txlen = 0 ;
387
+ bool outep3_processing = false;
383
388
384
389
// Store the current interface alt setting.
385
390
int current_int0_alt_setting = 0 ;
@@ -744,6 +749,7 @@ void usb_irqhandler(void) {
744
749
}
745
750
746
751
if (endpoint == 3 ) {
752
+ outep3_processing = true;
747
753
usb_cb_ep3_out (usbdata , len , 1 );
748
754
}
749
755
} else if (status == STS_SETUP_UPDT ) {
@@ -816,15 +822,17 @@ void usb_irqhandler(void) {
816
822
#ifdef DEBUG_USB
817
823
puts (" OUT3 PACKET XFRC\n" );
818
824
#endif
819
- USBx_OUTEP (3 )-> DOEPTSIZ = (1U << 19 ) | 0x40U ;
820
- USBx_OUTEP (3 )-> DOEPCTL |= USB_OTG_DOEPCTL_EPENA | USB_OTG_DOEPCTL_CNAK ;
825
+ // NAK cleared by process_can (if tx buffers have room)
826
+ outep3_processing = false;
827
+ usb_cb_ep3_out_complete ();
821
828
} else if ((USBx_OUTEP (3 )-> DOEPINT & 0x2000 ) != 0 ) {
822
829
#ifdef DEBUG_USB
823
830
puts (" OUT3 PACKET WTF\n" );
824
831
#endif
825
832
// if NAK was set trigger this, unknown interrupt
826
- USBx_OUTEP (3 )-> DOEPTSIZ = (1U << 19 ) | 0x40U ;
827
- USBx_OUTEP (3 )-> DOEPCTL |= USB_OTG_DOEPCTL_CNAK ;
833
+ // TODO: why was this here? fires when TX buffers when we can't clear NAK
834
+ // USBx_OUTEP(3)->DOEPTSIZ = (1U << 19) | 0x40U;
835
+ // USBx_OUTEP(3)->DOEPCTL |= USB_OTG_DOEPCTL_CNAK;
828
836
} else if ((USBx_OUTEP (3 )-> DOEPINT ) != 0 ) {
829
837
puts ("OUTEP3 error " );
830
838
puth (USBx_OUTEP (3 )-> DOEPINT );
@@ -932,6 +940,13 @@ void usb_irqhandler(void) {
932
940
//USBx->GINTMSK = 0xFFFFFFFF & ~(USB_OTG_GINTMSK_NPTXFEM | USB_OTG_GINTMSK_PTXFEM | USB_OTG_GINTSTS_SOF | USB_OTG_GINTSTS_EOPF);
933
941
}
934
942
943
+ void usb_outep3_resume_if_paused () {
944
+ if (!outep3_processing && (USBx_OUTEP (3 )-> DOEPCTL & USB_OTG_DOEPCTL_NAKSTS ) != 0 ) {
945
+ USBx_OUTEP (3 )-> DOEPTSIZ = (1U << 19 ) | 0x40U ;
946
+ USBx_OUTEP (3 )-> DOEPCTL |= USB_OTG_DOEPCTL_EPENA | USB_OTG_DOEPCTL_CNAK ;
947
+ }
948
+ }
949
+
935
950
void OTG_FS_IRQ_Handler (void ) {
936
951
NVIC_DisableIRQ (OTG_FS_IRQn );
937
952
//__disable_irq();
0 commit comments