29
29
30
30
#if CFG_TUD_ENABLED && defined(TUP_USBIP_RUSB2 )
31
31
32
- // Since TinyUSB doesn't use SOF for now, and this interrupt too often (1ms interval)
33
- // We disable SOF for now until needed later on
34
- #define USE_SOF 0
35
-
36
32
#include "device/dcd.h"
37
33
#include "rusb2_type.h"
38
34
@@ -74,6 +70,8 @@ typedef struct
74
70
{
75
71
pipe_state_t pipe [PIPE_COUNT ];
76
72
uint8_t ep [2 ][16 ]; /* a lookup table for a pipe index from an endpoint address */
73
+ // Track whether sof has been manually enabled
74
+ bool sof_enabled ;
77
75
} dcd_data_t ;
78
76
79
77
static dcd_data_t _dcd ;
@@ -664,6 +662,10 @@ void dcd_init(uint8_t rhport)
664
662
rusb2_reg_t * rusb = RUSB2_REG (rhport );
665
663
rusb2_module_start (rhport , true);
666
664
665
+ // We disable SOF for now until needed later on.
666
+ // Since TinyUSB doesn't use SOF for now, and this interrupt often (1ms interval)
667
+ _dcd .sof_enabled = false;
668
+
667
669
#ifdef RUSB2_SUPPORT_HIGHSPEED
668
670
if ( rusb2_is_highspeed_rhport (rhport ) ) {
669
671
rusb -> SYSCFG_b .HSE = 1 ;
@@ -708,7 +710,7 @@ void dcd_init(uint8_t rhport)
708
710
709
711
rusb -> INTSTS0 = 0 ;
710
712
rusb -> INTENB0 = RUSB2_INTSTS0_VBINT_Msk | RUSB2_INTSTS0_BRDY_Msk | RUSB2_INTSTS0_BEMP_Msk |
711
- RUSB2_INTSTS0_DVST_Msk | RUSB2_INTSTS0_CTRT_Msk | (USE_SOF ? RUSB2_INTSTS0_SOFR_Msk : 0 ) |
713
+ RUSB2_INTSTS0_DVST_Msk | RUSB2_INTSTS0_CTRT_Msk | (_dcd . sof_enabled ? RUSB2_INTSTS0_SOFR_Msk : 0 ) |
712
714
RUSB2_INTSTS0_RESM_Msk ;
713
715
rusb -> BEMPENB = 1 ;
714
716
rusb -> BRDYENB = 1 ;
@@ -756,10 +758,9 @@ void dcd_disconnect(uint8_t rhport)
756
758
757
759
void dcd_sof_enable (uint8_t rhport , bool en )
758
760
{
759
- (void ) rhport ;
760
- (void ) en ;
761
-
762
- // TODO implement later
761
+ rusb2_reg_t * rusb = RUSB2_REG (rhport );
762
+ _dcd .sof_enabled = en ;
763
+ rusb -> INTENB0_b .SOFE = en ? 1 : 0 ;
763
764
}
764
765
765
766
//--------------------------------------------------------------------+
@@ -949,18 +950,19 @@ void dcd_int_handler(uint8_t rhport)
949
950
// Resumed
950
951
if ( is0 & RUSB2_INTSTS0_RESM_Msk ) {
951
952
dcd_event_bus_signal (rhport , DCD_EVENT_RESUME , true);
952
- #if ( 0 == USE_SOF )
953
- rusb -> INTENB0_b .SOFE = 0 ;
954
- #endif
953
+ if (! _dcd . sof_enabled ) {
954
+ rusb -> INTENB0_b .SOFE = 0 ;
955
+ }
955
956
}
956
957
957
958
// SOF received
958
959
if ( (is0 & RUSB2_INTSTS0_SOFR_Msk ) && rusb -> INTENB0_b .SOFE ) {
959
960
// USBD will exit suspended mode when SOF event is received
960
- dcd_event_bus_signal (rhport , DCD_EVENT_SOF , true);
961
- #if (0 == USE_SOF )
962
- rusb -> INTENB0_b .SOFE = 0 ;
963
- #endif
961
+ const uint32_t frame = rusb -> FRMNUM_b .FRNM ;
962
+ dcd_event_sof (rhport , frame , true);
963
+ if (!_dcd .sof_enabled ) {
964
+ rusb -> INTENB0_b .SOFE = 0 ;
965
+ }
964
966
}
965
967
966
968
// Device state changes
@@ -979,9 +981,9 @@ void dcd_int_handler(uint8_t rhport)
979
981
case RUSB2_INTSTS0_DVSQ_STATE_SUSP2 :
980
982
case RUSB2_INTSTS0_DVSQ_STATE_SUSP3 :
981
983
dcd_event_bus_signal (rhport , DCD_EVENT_SUSPEND , true);
982
- #if ( 0 == USE_SOF )
983
- rusb -> INTENB0_b .SOFE = 1 ;
984
- #endif
984
+ if (! _dcd . sof_enabled ) {
985
+ rusb -> INTENB0_b .SOFE = 1 ;
986
+ }
985
987
986
988
default : break ;
987
989
}
0 commit comments