diff options
Diffstat (limited to 'libmaple/usb')
-rw-r--r-- | libmaple/usb/usb.c | 54 | ||||
-rw-r--r-- | libmaple/usb/usb.h | 35 | ||||
-rw-r--r-- | libmaple/usb/usb_cdcacm.c | 63 | ||||
-rw-r--r-- | libmaple/usb/usb_lib_globals.h | 21 |
4 files changed, 94 insertions, 79 deletions
diff --git a/libmaple/usb/usb.c b/libmaple/usb/usb.c index 0206bb8..6a22cdf 100644 --- a/libmaple/usb/usb.c +++ b/libmaple/usb/usb.c @@ -49,21 +49,14 @@ static void dispatch_ctr_lp(void); * usb_lib/ globals */ -volatile uint16 wIstr = 0; -uint8 EPindex; /* current endpoint */ -DEVICE_INFO *pInformation; -DEVICE_PROP *pProperty; +volatile uint16 wIstr = 0; /* most recently read value of wIstr */ uint16 SaveTState; /* caches TX status for later use */ uint16 SaveRState; /* caches RX status for later use */ -uint16 wInterrupt_Mask; -DEVICE_INFO Device_Info; -USER_STANDARD_REQUESTS *pUser_Standard_Requests; /* * Other state */ -volatile uint32 bDeviceState = UNCONNECTED; volatile uint32 bIntPackSOF = 0; struct { @@ -71,18 +64,31 @@ struct { volatile uint8 bESOFcnt; } ResumeS; +static usblib_dev usblib = { + .irq_mask = USB_ISR_MSK, + .state = USB_UNCONNECTED, +}; +usblib_dev *USBLIB = &usblib; + /* * Routines */ -void usb_init_usblib(DEVICE_PROP *device, USER_STANDARD_REQUESTS *user) { +void usb_init_usblib(void (**ep_int_in)(void), void (**ep_int_out)(void)) { rcc_clk_enable(RCC_USB); + USBLIB->ep_int_in = ep_int_in; + USBLIB->ep_int_out = ep_int_out; + + /* usb_lib/ declares both and then assumes that pFoo points to Foo + * (even though the names don't always match), which is stupid for + * all of the obvious reasons, but whatever. Here we are. */ pInformation = &Device_Info; + pProperty = &Device_Property; + pUser_Standard_Requests = &User_Standard_Requests; + pInformation->ControlState = 2; /* FIXME [0.0.12] use CONTROL_STATE enumerator */ - pProperty = device; - pUser_Standard_Requests = user; pProperty->Init(); } @@ -97,7 +103,7 @@ void usbSuspend(void) { cntr |= USB_CNTR_LP_MODE; USB_BASE->CNTR = cntr; - bDeviceState = SUSPENDED; + USBLIB->state = USB_SUSPENDED; } void usbResumeInit(void) { @@ -167,33 +173,33 @@ void __irq_usb_lp_can_rx0(void) { /* Use USB_ISR_MSK to only include code for bits we care about. */ #if (USB_ISR_MSK & USB_ISTR_RESET) - if (wIstr & USB_ISTR_RESET & wInterrupt_Mask) { + if (wIstr & USB_ISTR_RESET & USBLIB->irq_mask) { USB_BASE->ISTR = ~USB_ISTR_RESET; pProperty->Reset(); } #endif #if (USB_ISR_MSK & USB_ISTR_PMAOVR) - if (wIstr & ISTR_PMAOVR & wInterrupt_Mask) { + if (wIstr & ISTR_PMAOVR & USBLIB->irq_mask) { USB_BASE->ISTR = ~USB_ISTR_PMAOVR; } #endif #if (USB_ISR_MSK & USB_ISTR_ERR) - if (wIstr & USB_ISTR_ERR & wInterrupt_Mask) { + if (wIstr & USB_ISTR_ERR & USBLIB->irq_mask) { USB_BASE->ISTR = ~USB_ISTR_ERR; } #endif #if (USB_ISR_MSK & USB_ISTR_WKUP) - if (wIstr & USB_ISTR_WKUP & wInterrupt_Mask) { + if (wIstr & USB_ISTR_WKUP & USBLIB->irq_mask) { USB_BASE->ISTR = ~USB_ISTR_WKUP; usbResume(RESUME_EXTERNAL); } #endif #if (USB_ISR_MSK & USB_ISTR_SUSP) - if (wIstr & USB_ISTR_SUSP & wInterrupt_Mask) { + if (wIstr & USB_ISTR_SUSP & USBLIB->irq_mask) { /* check if SUSPEND is possible */ if (SUSPEND_ENABLED) { usbSuspend(); @@ -207,14 +213,14 @@ void __irq_usb_lp_can_rx0(void) { #endif #if (USB_ISR_MSK & USB_ISTR_SOF) - if (wIstr & USB_ISTR_SOF & wInterrupt_Mask) { + if (wIstr & USB_ISTR_SOF & USBLIB->irq_mask) { USB_BASE->ISTR = ~USB_ISTR_SOF; bIntPackSOF++; } #endif #if (USB_ISR_MSK & USB_ISTR_ESOF) - if (wIstr & USB_ISTR_ESOF & wInterrupt_Mask) { + if (wIstr & USB_ISTR_ESOF & USBLIB->irq_mask) { USB_BASE->ISTR = ~USB_ISTR_ESOF; /* resume handling timing is made with ESOFs */ usbResume(RESUME_ESOF); /* request without change of the machine state */ @@ -226,7 +232,7 @@ void __irq_usb_lp_can_rx0(void) { */ #if (USB_ISR_MSK & USB_ISTR_CTR) - if (wIstr & USB_ISTR_CTR & wInterrupt_Mask) { + if (wIstr & USB_ISTR_CTR & USBLIB->irq_mask) { dispatch_ctr_lp(); } #endif @@ -239,11 +245,11 @@ void usbWaitReset(void) { } uint8 usbIsConfigured() { - return (bDeviceState == CONFIGURED); + return USBLIB->state == USB_CONFIGURED; } uint8 usbIsConnected() { - return (bDeviceState != UNCONNECTED); + return USBLIB->state != USB_UNCONNECTED; } /* @@ -349,11 +355,11 @@ static inline void dispatch_endpt(uint8 ep) { * TODO try to find out if neither being set is possible. */ if (epr & USB_EP_CTR_RX) { usb_clear_ctr_rx(ep); - (pEpInt_OUT[ep - 1])(); + (USBLIB->ep_int_out[ep - 1])(); } if (epr & USB_EP_CTR_TX) { usb_clear_ctr_tx(ep); - (pEpInt_IN[ep - 1])(); + (USBLIB->ep_int_in[ep - 1])(); } } diff --git a/libmaple/usb/usb.h b/libmaple/usb/usb.h index 8ab40f0..b073156 100644 --- a/libmaple/usb/usb.h +++ b/libmaple/usb/usb.h @@ -39,6 +39,25 @@ extern "C" { #define USB_ISR_MSK 0xBF00 #endif +typedef enum usb_dev_state { + USB_UNCONNECTED, + USB_ATTACHED, + USB_POWERED, + USB_SUSPENDED, + USB_ADDRESSED, + USB_CONFIGURED +} usb_dev_state; + +/* Encapsulates global state formerly handled by usb_lib/ + * functionality */ +typedef struct usblib_dev { + uint32 irq_mask; + void (**ep_int_in)(void); + void (**ep_int_out)(void); + usb_dev_state state; +} usblib_dev; + +extern usblib_dev *USBLIB; /* * Convenience routines, etc. @@ -55,21 +74,7 @@ typedef enum { RESUME_ESOF } RESUME_STATE; -typedef enum { - UNCONNECTED, - ATTACHED, - POWERED, - SUSPENDED, - ADDRESSED, - CONFIGURED -} DEVICE_STATE; - -extern volatile uint32 bDeviceState; - -struct _DEVICE_PROP; -struct _USER_STANDARD_REQUESTS; -void usb_init_usblib(struct _DEVICE_PROP*, - struct _USER_STANDARD_REQUESTS*); +void usb_init_usblib(void (**ep_int_in)(void), void (**ep_int_out)(void)); void usbSuspend(void); void usbResumeInit(void); diff --git a/libmaple/usb/usb_cdcacm.c b/libmaple/usb/usb_cdcacm.c index bf73c68..46d56bb 100644 --- a/libmaple/usb/usb_cdcacm.c +++ b/libmaple/usb/usb_cdcacm.c @@ -118,6 +118,11 @@ typedef enum { DTR_LOW } RESET_STATE; +/* Some forward-declared callbacks */ +void vcomDataTxCb(void); +void vcomDataRxCb(void); +void vcomManagementCb(void); + const USB_Descriptor_Device usbVcomDescriptor_Device = { .bLength = sizeof(USB_Descriptor_Device), .bDescriptorType = USB_DESCRIPTOR_TYPE_DEVICE, @@ -302,6 +307,24 @@ volatile uint32 newBytes = 0; RESET_STATE reset_state = DTR_UNSET; uint8 line_dtr_rts = 0; +static void (*ep_int_in[7])(void) = + {vcomDataTxCb, + vcomManagementCb, + NOP_Process, + NOP_Process, + NOP_Process, + NOP_Process, + NOP_Process}; + +static void (*ep_int_out[7])(void) = + {NOP_Process, + NOP_Process, + vcomDataRxCb, + NOP_Process, + NOP_Process, + NOP_Process, + NOP_Process}; + /* * VCOM callbacks */ @@ -388,11 +411,11 @@ void vcomSetLineState(void) { RESULT usbPowerOn(void) { USB_BASE->CNTR = USB_CNTR_FRES; - wInterrupt_Mask = 0; - USB_BASE->CNTR = wInterrupt_Mask; + USBLIB->irq_mask = 0; + USB_BASE->CNTR = USBLIB->irq_mask; USB_BASE->ISTR = 0; - wInterrupt_Mask = USB_CNTR_RESETM | USB_CNTR_SUSPM | USB_CNTR_WKUPM; - USB_BASE->CNTR = wInterrupt_Mask; + USBLIB->irq_mask = USB_CNTR_RESETM | USB_CNTR_SUSPM | USB_CNTR_WKUPM; + USB_BASE->CNTR = USBLIB->irq_mask; return USB_SUCCESS; } @@ -402,11 +425,11 @@ void usbInit(void) { usbPowerOn(); USB_BASE->ISTR = 0; - wInterrupt_Mask = USB_ISR_MSK; - USB_BASE->CNTR = wInterrupt_Mask; + USBLIB->irq_mask = USB_ISR_MSK; + USB_BASE->CNTR = USBLIB->irq_mask; nvic_irq_enable(NVIC_USB_LP_CAN_RX0); - bDeviceState = UNCONNECTED; + USBLIB->state = USB_UNCONNECTED; } /* choose addresses to give endpoints the max 64 byte buffers */ @@ -450,7 +473,7 @@ void usbReset(void) { usb_set_ep_tx_stat(VCOM_TX_ENDP, USB_EP_STAT_TX_NAK); usb_set_ep_rx_stat(VCOM_TX_ENDP, USB_EP_STAT_RX_DISABLED); - bDeviceState = ATTACHED; + USBLIB->state = USB_ATTACHED; SetDeviceAddress(0); /* reset the rx fifo */ @@ -585,12 +608,12 @@ u8* usbGetStringDescriptor(u16 length) { /* internal callbacks to respond to standard requests */ void usbSetConfiguration(void) { if (pInformation->Current_Configuration != 0) { - bDeviceState = CONFIGURED; + USBLIB->state = USB_CONFIGURED; } } void usbSetDeviceAddress(void) { - bDeviceState = ADDRESSED; + USBLIB->state = USB_ADDRESSED; } /* @@ -628,24 +651,6 @@ USER_STANDARD_REQUESTS User_Standard_Requests = NOP_Process, usbSetDeviceAddress}; -void (*pEpInt_IN[7])(void) = - {vcomDataTxCb, - vcomManagementCb, - NOP_Process, - NOP_Process, - NOP_Process, - NOP_Process, - NOP_Process}; - -void (*pEpInt_OUT[7])(void) = - {NOP_Process, - NOP_Process, - vcomDataRxCb, - NOP_Process, - NOP_Process, - NOP_Process, - NOP_Process}; - /* * CDC ACM routines */ @@ -656,7 +661,7 @@ void usb_cdcacm_enable(gpio_dev *disc_dev, uint8 disc_bit) { gpio_write_bit(disc_dev, disc_bit, 0); // presents us to the host /* initialize USB peripheral */ - usb_init_usblib(&Device_Property, &User_Standard_Requests); + usb_init_usblib(ep_int_in, ep_int_out); } void usb_cdcacm_disable(gpio_dev *disc_dev, uint8 disc_bit) { diff --git a/libmaple/usb/usb_lib_globals.h b/libmaple/usb/usb_lib_globals.h index 854cb12..a494817 100644 --- a/libmaple/usb/usb_lib_globals.h +++ b/libmaple/usb/usb_lib_globals.h @@ -34,19 +34,18 @@ extern "C" { #endif -extern void (*pEpInt_IN[7])(void); -extern void (*pEpInt_OUT[7])(void); -extern DEVICE_PROP Device_Property; -extern USER_STANDARD_REQUESTS User_Standard_Requests; -extern DEVICE Device_Table; -extern DEVICE_INFO Device_Info; +extern USER_STANDARD_REQUESTS User_Standard_Requests; +extern USER_STANDARD_REQUESTS *pUser_Standard_Requests; + +extern DEVICE_PROP Device_Property; +extern DEVICE_PROP *pProperty; + +extern DEVICE_INFO Device_Info; +extern DEVICE_INFO *pInformation; + +extern DEVICE Device_Table; extern u16 SaveRState; extern u16 SaveTState; -extern DEVICE_INFO* pInformation; -extern DEVICE_PROP* pProperty; -extern USER_STANDARD_REQUESTS *pUser_Standard_Requests; -extern u16 SaveState ; -extern u16 wInterrupt_Mask; #ifdef __cplusplus } |