summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsakumisu <[email protected]>2022-02-18 22:56:06 +0800
committersakumisu <[email protected]>2022-02-18 22:56:06 +0800
commitc97928007ddef04895aa245ee4dd2c812eead5c2 (patch)
tree3942d67e9b2b5d6ee4774bce6ed71a458b34b50a
parentc2d048f130af51efa3be42c1abdedcf0b3f21e43 (diff)
add volatile for dev_addr
-rw-r--r--port/ch32/usb_dc_usbfs.c20
-rw-r--r--port/ch32/usb_dc_usbhs.c2
-rw-r--r--port/fsdev/usb_dc_fsdev.c12
-rw-r--r--port/synopsys/usb_dc_synopsys.c4
-rw-r--r--port/template/usb_dc.c1
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;