add volatile for dev_addr

This commit is contained in:
sakumisu
2022-02-18 22:56:06 +08:00
parent c2d048f130
commit c97928007d
5 changed files with 19 additions and 20 deletions

View File

@@ -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")));

View File

@@ -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;

View File

@@ -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 */

View File

@@ -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);

View File

@@ -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;