diff options
| author | Ha Thach <[email protected]> | 2021-08-14 01:59:38 +0700 |
|---|---|---|
| committer | GitHub <[email protected]> | 2021-08-14 01:59:38 +0700 |
| commit | 48f17efa77b84ed7c977b3655b7a067385fffcc1 (patch) | |
| tree | 95d660604628c297b11c3a26d97288e3e2f2aa29 /src | |
| parent | 89e4586653663b374272d9fd64a447b84352ae53 (diff) | |
| parent | 6af1950c8d90c41664b079ad78a0918b4821ea92 (diff) | |
Merge pull request #1021 from tringis/fix-synopsys-change-addr
Fix dcd_set_address bug when called more than once
Diffstat (limited to 'src')
| -rw-r--r-- | src/portable/st/synopsys/dcd_synopsys.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/src/portable/st/synopsys/dcd_synopsys.c b/src/portable/st/synopsys/dcd_synopsys.c index c15694eba..5a5645dd4 100644 --- a/src/portable/st/synopsys/dcd_synopsys.c +++ b/src/portable/st/synopsys/dcd_synopsys.c @@ -192,6 +192,10 @@ static void bus_reset(uint8_t rhport) out_ep[n].DOEPCTL |= USB_OTG_DOEPCTL_SNAK; } + // clear device address + dev->DCFG &= ~USB_OTG_DCFG_DAD_Msk; + + // TODO should probably assign value when reset rather than OR dev->DAINTMSK |= (1 << USB_OTG_DAINTMSK_OEPM_Pos) | (1 << USB_OTG_DAINTMSK_IEPM_Pos); dev->DOEPMSK |= USB_OTG_DOEPMSK_STUPM | USB_OTG_DOEPMSK_XFRCM; dev->DIEPMSK |= USB_OTG_DIEPMSK_TOM | USB_OTG_DIEPMSK_XFRCM; @@ -519,7 +523,7 @@ void dcd_int_disable (uint8_t rhport) void dcd_set_address (uint8_t rhport, uint8_t dev_addr) { USB_OTG_DeviceTypeDef * dev = DEVICE_BASE(rhport); - dev->DCFG |= (dev_addr << USB_OTG_DCFG_DAD_Pos) & USB_OTG_DCFG_DAD_Msk; + dev->DCFG = (dev->DCFG & ~USB_OTG_DCFG_DAD_Msk) | (dev_addr << USB_OTG_DCFG_DAD_Pos); // Response with status after changing device address dcd_edpt_xfer(rhport, tu_edpt_addr(0, TUSB_DIR_IN), NULL, 0); |
