Fixed stm32f107 usb driver to allow calling usbd_poll from irq handler.

This commit is contained in:
Gareth McMullin 2011-04-04 17:39:05 +12:00
parent ef0ff192f7
commit 3d820c6ed7

View File

@ -63,8 +63,6 @@ const struct _usbd_driver stm32f107_usb_driver = {
/** Initialize the USB device controller hardware of the STM32. */ /** Initialize the USB device controller hardware of the STM32. */
static void stm32f107_usbd_init(void) static void stm32f107_usbd_init(void)
{ {
/* TODO: Enable interrupts on Reset, Transfer, Suspend and Resume */
OTG_FS_GINTSTS = OTG_FS_GINTSTS_MMIS; OTG_FS_GINTSTS = OTG_FS_GINTSTS_MMIS;
/* WARNING: Undocumented! Select internal PHY */ /* WARNING: Undocumented! Select internal PHY */
@ -93,7 +91,15 @@ static void stm32f107_usbd_init(void)
fifo_mem_top = RX_FIFO_SIZE; fifo_mem_top = RX_FIFO_SIZE;
/* Unmask interrupts for TX and RX */ /* Unmask interrupts for TX and RX */
OTG_FS_GINTMSK &= OTG_FS_GINTMSK_RXFLVLM; OTG_FS_GAHBCFG |= OTG_FS_GAHBCFG_GINT;
OTG_FS_GINTMSK = OTG_FS_GINTMSK_ENUMDNEM |
OTG_FS_GINTMSK_RXFLVLM |
OTG_FS_GINTMSK_IEPINT |
OTG_FS_GINTMSK_USBSUSPM |
OTG_FS_GINTMSK_WUIM |
OTG_FS_GINTMSK_SOFM;
OTG_FS_DAINTMSK = 0xF;
OTG_FS_DIEPMSK = OTG_FS_DIEPMSK_XFRCM;
} }
static void stm32f107_set_address(u8 addr) static void stm32f107_set_address(u8 addr)
@ -104,7 +110,7 @@ static void stm32f107_set_address(u8 addr)
static void stm32f107_ep_setup(u8 addr, u8 type, u16 max_size, static void stm32f107_ep_setup(u8 addr, u8 type, u16 max_size,
void (*callback) (u8 ep)) void (*callback) (u8 ep))
{ {
/* TODO: Configure endpoint address and type. /* Configure endpoint address and type.
* Allocate FIFO memory for endpoint. * Allocate FIFO memory for endpoint.
* Install callback funciton. * Install callback funciton.
*/ */
@ -137,7 +143,6 @@ static void stm32f107_ep_setup(u8 addr, u8 type, u16 max_size,
return; return;
} }
/* TODO: Configuration for other endpoints */
if (dir) { if (dir) {
OTG_FS_DIEPTXF(addr) = ((max_size / 4) << 16) | fifo_mem_top; OTG_FS_DIEPTXF(addr) = ((max_size / 4) << 16) | fifo_mem_top;
fifo_mem_top += max_size / 4; fifo_mem_top += max_size / 4;
@ -293,7 +298,6 @@ static void stm32f107_poll(void)
return; return;
} }
/* TODO: Handle transfer complete condition */
/* Note: RX and TX handled differently in this device. */ /* Note: RX and TX handled differently in this device. */
if (intsts & OTG_FS_GINTSTS_RXFLVL) { if (intsts & OTG_FS_GINTSTS_RXFLVL) {
/* Receive FIFO non-empty */ /* Receive FIFO non-empty */
@ -315,13 +319,11 @@ static void stm32f107_poll(void)
if (_usbd_device.user_callback_ctr[ep][type]) if (_usbd_device.user_callback_ctr[ep][type])
_usbd_device.user_callback_ctr[ep][type] (ep); _usbd_device.user_callback_ctr[ep][type] (ep);
/* TODO: clear any interrupt flag */
} }
/* There is no global interrupt flag for transmit complete. /* There is no global interrupt flag for transmit complete.
* the XFRC bit must be checked in each OTG_FS_DIEPINT(x) * the XFRC bit must be checked in each OTG_FS_DIEPINT(x)
*/ */
/* TODO: Check on endpoint interrupt... */
for (i = 0; i < 4; i++) { /* Iterate over endpoints */ for (i = 0; i < 4; i++) { /* Iterate over endpoints */
if(OTG_FS_DIEPINT(i) & OTG_FS_DIEPINTX_XFRC) { if(OTG_FS_DIEPINT(i) & OTG_FS_DIEPINTX_XFRC) {
/* Transfer complete */ /* Transfer complete */
@ -331,20 +333,19 @@ static void stm32f107_poll(void)
} }
} }
/* TODO: Handle suspend condition */ if (intsts & OTG_FS_GINTSTS_USBSUSP) {
if (0) {
/* TODO: Clear suspend interrupt flag */
if (_usbd_device.user_callback_suspend) if (_usbd_device.user_callback_suspend)
_usbd_device.user_callback_suspend(); _usbd_device.user_callback_suspend();
OTG_FS_GINTSTS = OTG_FS_GINTSTS_USBSUSP;
} }
/* TODO: Handle wakeup condition */ if (intsts & OTG_FS_GINTSTS_WKUPINT) {
if (0) {
/* TODO: Clear wakeup interrupt flag */
if (_usbd_device.user_callback_resume) if (_usbd_device.user_callback_resume)
_usbd_device.user_callback_resume(); _usbd_device.user_callback_resume();
OTG_FS_GINTSTS = OTG_FS_GINTSTS_WKUPINT;
} }
/* TODO: Handle SOF condition */ if (intsts & OTG_FS_GINTSTS_SOF)
OTG_FS_GINTSTS = OTG_FS_GINTSTS_SOF;
} }