From c97928007ddef04895aa245ee4dd2c812eead5c2 Mon Sep 17 00:00:00 2001 From: sakumisu <1203593632@qq.com> Date: Fri, 18 Feb 2022 22:56:06 +0800 Subject: [PATCH] add volatile for dev_addr --- port/ch32/usb_dc_usbfs.c | 20 +++++++++----------- port/ch32/usb_dc_usbhs.c | 2 +- port/fsdev/usb_dc_fsdev.c | 12 ++++++------ port/synopsys/usb_dc_synopsys.c | 4 ++-- port/template/usb_dc.c | 1 + 5 files changed, 19 insertions(+), 20 deletions(-) diff --git a/port/ch32/usb_dc_usbfs.c b/port/ch32/usb_dc_usbfs.c index 63840d6b..b8019570 100644 --- a/port/ch32/usb_dc_usbfs.c +++ b/port/ch32/usb_dc_usbfs.c @@ -18,22 +18,20 @@ struct usb_dc_ep_state { /* Driver state */ struct usb_dc_config_priv { - uint8_t dev_addr; + volatile uint8_t dev_addr; struct usb_dc_ep_state in_ep[USB_NUM_BIDIR_ENDPOINTS]; /*!< IN endpoint parameters*/ struct usb_dc_ep_state out_ep[USB_NUM_BIDIR_ENDPOINTS]; /*!< OUT endpoint parameters */ } usb_dc_cfg; -// clang-format off /* Endpoint Buffer */ -__attribute__ ((aligned(4))) uint8_t EP0_DatabufHD[64]; //ep0(64) -__attribute__ ((aligned(4))) uint8_t EP1_DatabufHD[64+64]; //ep1_out(64)+ep1_in(64) -__attribute__ ((aligned(4))) uint8_t EP2_DatabufHD[64+64]; //ep2_out(64)+ep2_in(64) -__attribute__ ((aligned(4))) uint8_t EP3_DatabufHD[64+64]; //ep3_out(64)+ep3_in(64) -__attribute__ ((aligned(4))) uint8_t EP4_DatabufHD[64+64]; //ep4_out(64)+ep4_in(64) -__attribute__ ((aligned(4))) uint8_t EP5_DatabufHD[64+64]; //ep5_out(64)+ep5_in(64) -__attribute__ ((aligned(4))) uint8_t EP6_DatabufHD[64+64]; //ep6_out(64)+ep6_in(64) -__attribute__ ((aligned(4))) uint8_t EP7_DatabufHD[64+64]; //ep7_out(64)+ep7_in(64) -// clang-format on +__attribute__((aligned(4))) uint8_t EP0_DatabufHD[64]; //ep0(64) +__attribute__((aligned(4))) uint8_t EP1_DatabufHD[64 + 64]; //ep1_out(64)+ep1_in(64) +__attribute__((aligned(4))) uint8_t EP2_DatabufHD[64 + 64]; //ep2_out(64)+ep2_in(64) +__attribute__((aligned(4))) uint8_t EP3_DatabufHD[64 + 64]; //ep3_out(64)+ep3_in(64) +__attribute__((aligned(4))) uint8_t EP4_DatabufHD[64 + 64]; //ep4_out(64)+ep4_in(64) +__attribute__((aligned(4))) uint8_t EP5_DatabufHD[64 + 64]; //ep5_out(64)+ep5_in(64) +__attribute__((aligned(4))) uint8_t EP6_DatabufHD[64 + 64]; //ep6_out(64)+ep6_in(64) +__attribute__((aligned(4))) uint8_t EP7_DatabufHD[64 + 64]; //ep7_out(64)+ep7_in(64) void OTG_FS_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); diff --git a/port/ch32/usb_dc_usbhs.c b/port/ch32/usb_dc_usbhs.c index 1a3a85a2..70b8875d 100644 --- a/port/ch32/usb_dc_usbhs.c +++ b/port/ch32/usb_dc_usbhs.c @@ -18,7 +18,7 @@ struct usb_dc_ep_state { /* Driver state */ struct usb_dc_config_priv { - uint8_t dev_addr; + volatile uint8_t dev_addr; struct usb_dc_ep_state in_ep[USB_NUM_BIDIR_ENDPOINTS]; /*!< IN endpoint parameters*/ struct usb_dc_ep_state out_ep[USB_NUM_BIDIR_ENDPOINTS]; /*!< OUT endpoint parameters */ } usb_dc_cfg; diff --git a/port/fsdev/usb_dc_fsdev.c b/port/fsdev/usb_dc_fsdev.c index e16577f2..908f0173 100644 --- a/port/fsdev/usb_dc_fsdev.c +++ b/port/fsdev/usb_dc_fsdev.c @@ -40,10 +40,10 @@ struct usb_dc_ep_state { /* Driver state */ struct usb_dc_config_priv { USB_TypeDef *Instance; /*!< Register base address */ - __IO uint8_t USB_Address; /*!< USB Address */ + volatile uint8_t dev_addr; /*!< USB Address */ + volatile uint32_t pma_offset; /*!< pma offset */ struct usb_dc_ep_state in_ep[USB_NUM_BIDIR_ENDPOINTS]; /*!< IN endpoint parameters*/ struct usb_dc_ep_state out_ep[USB_NUM_BIDIR_ENDPOINTS]; /*!< OUT endpoint parameters */ - uint32_t pma_offset; } usb_dc_cfg; __WEAK void usb_dc_low_level_init(void) @@ -116,7 +116,7 @@ int usbd_set_address(const uint8_t addr) USBx->DADDR = (uint16_t)USB_DADDR_EF; } - usb_dc_cfg.USB_Address = addr; + usb_dc_cfg.dev_addr = addr; return 0; } @@ -348,9 +348,9 @@ void USBD_IRQHandler(void) /* DIR = 0 implies that (EP_CTR_TX = 1) always */ PCD_CLEAR_TX_EP_CTR(USBx, 0); usbd_event_notify_handler(USBD_EVENT_EP0_IN_NOTIFY, NULL); - if ((usb_dc_cfg.USB_Address > 0U) && (PCD_GET_EP_TX_CNT(USBx, 0) == 0U)) { - USBx->DADDR = ((uint16_t)usb_dc_cfg.USB_Address | USB_DADDR_EF); - usb_dc_cfg.USB_Address = 0U; + if ((usb_dc_cfg.dev_addr > 0U) && (PCD_GET_EP_TX_CNT(USBx, 0) == 0U)) { + USBx->DADDR = ((uint16_t)usb_dc_cfg.dev_addr | USB_DADDR_EF); + usb_dc_cfg.dev_addr = 0U; } } else { /* DIR = 1 */ diff --git a/port/synopsys/usb_dc_synopsys.c b/port/synopsys/usb_dc_synopsys.c index 7877c44e..0963e859 100644 --- a/port/synopsys/usb_dc_synopsys.c +++ b/port/synopsys/usb_dc_synopsys.c @@ -99,10 +99,10 @@ struct usb_dc_ep_state { /* Driver state */ struct usb_dc_config_priv { - USB_OTG_GlobalTypeDef *Instance; /*!< Register base address */ + USB_OTG_GlobalTypeDef *Instance; /*!< Register base address */ + volatile uint32_t grxstsp; struct usb_dc_ep_state in_ep[USB_NUM_BIDIR_ENDPOINTS]; /*!< IN endpoint parameters*/ struct usb_dc_ep_state out_ep[USB_NUM_BIDIR_ENDPOINTS]; /*!< OUT endpoint parameters */ - volatile uint32_t grxstsp; } usb_dc_cfg; static int usb_flush_rxfifo(USB_OTG_GlobalTypeDef *USBx); diff --git a/port/template/usb_dc.c b/port/template/usb_dc.c index 3c45591d..863e5452 100644 --- a/port/template/usb_dc.c +++ b/port/template/usb_dc.c @@ -17,6 +17,7 @@ struct usb_dc_ep_state { /* Driver state */ struct usb_dc_config_priv { + volatile uint8_t dev_addr; struct usb_dc_ep_state in_ep[USB_NUM_BIDIR_ENDPOINTS]; /*!< IN endpoint parameters*/ struct usb_dc_ep_state out_ep[USB_NUM_BIDIR_ENDPOINTS]; /*!< OUT endpoint parameters */ } usb_dc_cfg;