summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2019-03-18 17:20:52 -0700
committerKeith Packard <keithp@keithp.com>2019-03-18 17:22:22 -0700
commit96c446b4dba6814d61317efb4d2dc99a3ca29e0c (patch)
treed260a3c4614d046c159927e10a87fa64a122223f
parente38e1a2f735a1bb4aebf0817cdd99a05567c6340 (diff)
altos/stm32f4: Working on USB
Reset now works, still no packets Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r--src/stm32f4/ao_usb_gen.c5
-rw-r--r--src/stm32f4/ao_usb_gen.h3
-rw-r--r--src/stm32f4/ao_usb_stm32f4.c175
3 files changed, 166 insertions, 17 deletions
diff --git a/src/stm32f4/ao_usb_gen.c b/src/stm32f4/ao_usb_gen.c
index 760afad9..7659dabe 100644
--- a/src/stm32f4/ao_usb_gen.c
+++ b/src/stm32f4/ao_usb_gen.c
@@ -449,7 +449,7 @@ ao_usb_int_interrupt(uint32_t mask)
}
void
-stm_usb_fs_wkup(void)
+stm_otg_fs_wkup_isr(void)
{
/* USB wakeup, just clear the bit for now */
// stm_usb.istr &= ~(1 << STM_USB_ISTR_WKUP);
@@ -547,7 +547,7 @@ _ao_usb_out_recv(void)
ao_usb_rx_pos = 0;
}
-int
+static int
_ao_usb_pollchar(void)
{
uint8_t c;
@@ -601,7 +601,6 @@ void
ao_usb_enable(void)
{
ao_usb_dev_enable();
-
ao_usb_configuration = 0;
}
diff --git a/src/stm32f4/ao_usb_gen.h b/src/stm32f4/ao_usb_gen.h
index b059ddb7..d9a9cf92 100644
--- a/src/stm32f4/ao_usb_gen.h
+++ b/src/stm32f4/ao_usb_gen.h
@@ -106,5 +106,8 @@ ao_usb_in_interrupt(uint32_t mask);
void
ao_usb_out_interrupt(uint32_t mask);
+void
+ao_usb_int_interrupt(uint32_t mask);
+
#endif /* _AO_USB_GEN_H_ */
diff --git a/src/stm32f4/ao_usb_stm32f4.c b/src/stm32f4/ao_usb_stm32f4.c
index e65c3656..7ad83e13 100644
--- a/src/stm32f4/ao_usb_stm32f4.c
+++ b/src/stm32f4/ao_usb_stm32f4.c
@@ -231,12 +231,15 @@ ao_usb_dev_ep0_out(void *data, uint16_t len)
/* Queue IN bytes to EPn */
void
-ao_usb_dev_ep_in(uint8_t ep, const void *data, uint16_t len)
+ao_usb_dev_ep_in(uint8_t ep, const void *_data, uint16_t len)
{
+ const uint8_t *data = _data;
int l = len;
while (l > 0) {
- stm_usb.dfifo[ep].fifo = *((__packed uint32_t *) data);
+ uint32_t d;
+ memcpy(&d, data, 4);
+ stm_usb.dfifo[ep].fifo = d;
l -= 4;
data += 4;
}
@@ -261,8 +264,9 @@ ao_usb_dev_ep_in_busy(uint8_t ep)
/* Receive OUT bytes from EPn */
uint16_t
-ao_usb_dev_ep_out(uint8_t ep, void *data, uint16_t len)
+ao_usb_dev_ep_out(uint8_t ep, void *_data, uint16_t len)
{
+ uint8_t *data = _data;
uint16_t received;
int l = len;
uint32_t t;
@@ -275,7 +279,9 @@ ao_usb_dev_ep_out(uint8_t ep, void *data, uint16_t len)
received = len;
while (l >= 4) {
- *((__packed uint32_t *) data) = stm_usb.dfifo[0].fifo;
+ uint32_t d;
+ d = stm_usb.dfifo[0].fifo;
+ memcpy(data, &d, 4);
l -= 4;
data += 4;
}
@@ -358,6 +364,8 @@ static void
ao_usb_device_init(void)
{
/* deactivate vbus sensing */
+ stm_usb.gccfg |= (1 << STM_USB_GCCFG_VBDEN);
+
stm_usb.gccfg &= ~(1 << STM_USB_GCCFG_VBDEN);
/* Force device mode */
@@ -393,8 +401,10 @@ ao_usb_device_init(void)
else
stm_usb.diep[i].diepctl = 0;
stm_usb.diep[i].dieptsiz = 0;
- stm_usb.diep[i].diepint = 0xfffffffful;
+ stm_usb.diep[i].diepint = 0xffu;
+ }
+ for (int i = 0; i < 6; i++) {
/* Reset OUT endpoint */
if (stm_usb.doep[i].doepctl & (1 << STM_USB_DOEPCTL_EPENA))
stm_usb.doep[i].doepctl = ((1 << STM_USB_DOEPCTL_EPDIS) |
@@ -403,9 +413,11 @@ ao_usb_device_init(void)
stm_usb.doep[i].doepctl = 0;
stm_usb.doep[i].doeptsiz = 0;
- stm_usb.doep[i].doepint = 0xfffffffful;
+ stm_usb.doep[i].doepint = 0xffu;
}
+ stm_usb.diepmsk &= ~(1 << STM_USB_DIEPMSK_TXFURM);
+
/* Disable all interrupts */
stm_usb.gintmsk = 0;
@@ -449,7 +461,6 @@ ao_usb_device_connect(void)
ao_usb_delay(20);
}
-#if 0
static void
ao_usb_device_disconnect(void)
{
@@ -457,7 +468,13 @@ ao_usb_device_disconnect(void)
stm_usb.dctl |= (1 << STM_USB_DCTL_SDIS);
ao_usb_delay(20);
}
-#endif
+
+static void
+ao_usb_dev_start(void)
+{
+ ao_usb_device_connect();
+ stm_usb.gahbcfg |= (1 << STM_USB_GAHBCFG_GINTMSK);
+}
void
ao_usb_dev_enable(void)
@@ -474,17 +491,20 @@ ao_usb_dev_enable(void)
stm_afr_set(&stm_gpioa, 11, STM_AFR_AF10);
stm_ospeedr_set(&stm_gpioa, 11, STM_OSPEEDR_HIGH);
stm_pupdr_set(&stm_gpioa, 11, STM_PUPDR_NONE);
+
stm_afr_set(&stm_gpioa, 12, STM_AFR_AF10);
stm_ospeedr_set(&stm_gpioa, 12, STM_OSPEEDR_HIGH);
stm_pupdr_set(&stm_gpioa, 12, STM_PUPDR_NONE);
/* Power on USB */
- stm_rcc.ahb2enr |= (1 << STM_RCC_AHB2ENR_OTGFSEN);
+ stm_rcc_ahb2_clk_enable(1 << STM_RCC_AHB2ENR_OTGFSEN);
/* Route interrupts */
stm_nvic_set_priority(STM_ISR_OTG_FS_POS, AO_STM_NVIC_LOW_PRIORITY);
stm_nvic_set_enable(STM_ISR_OTG_FS_POS);
+ ao_arch_release_interrupts();
+
/* Core init */
ao_usb_core_init();
@@ -497,13 +517,18 @@ ao_usb_dev_enable(void)
ao_usb_device_init();
- /* Connect */
- ao_usb_device_connect();
+ /* Disconnect */
+ ao_usb_device_disconnect();
+
+ /* Start */
+ ao_usb_dev_start();
}
void
ao_usb_dev_disable(void)
{
+ ao_usb_device_disconnect();
+
stm_usb.gusbcfg = ((1 << STM_USB_GUSBCFG_FDMOD) |
(0 << STM_USB_GUSBCFG_FHMOD) |
(6 << STM_USB_GUSBCFG_TRDT) |
@@ -519,7 +544,7 @@ ao_usb_dev_disable(void)
stm_usb.dctl = ((0 << STM_USB_DCTL_POPRGDNE) |
(1 << STM_USB_DCTL_SDIS));
- stm_rcc.ahb2enr &= ~(1 << STM_RCC_AHB2ENR_OTGFSEN);
+ stm_rcc_ahb2_clk_disable(1 << STM_RCC_AHB2ENR_OTGFSEN);
}
void
@@ -1138,7 +1163,129 @@ $5 = {
CK48MSEL = 1 PLLI2S_Q
I2CFMP1SEL = 0 APB
}
-
-
*/
+
+/*
+ *
+ * altos clock configuration
+ * (gdb) print/x stm_rcc
+ * $8 = {
+ * altos demo firmware
+ * cr = 0x0307 7d80, 0x0f077d83,
+ *
+ * PLLI2SRDY 0 1
+ * PLLI2SON 0 1
+ * PLLRDY 1 1
+ * PLLON 1 1
+ * CSSON 0 0
+ * HSEBYP 1 1
+ * HSERDY 1 1
+ * HSEON 1 1
+ * HSICAL 0x7d 0x7d
+ * HSITRIM 0x10 0x10
+ * HSIRDY 0 1
+ * HSION 0 1
+ *
+ * pllcfgr = 0x24403008, 0x27403208,
+ * PLLR 2 2
+ * PLLQ 4 7
+ * PLLSRC 1 1
+ * PLLP 0 (/2) 0 (/2)
+ * PLLN 192 200
+ * PLLM 8 8
+ *
+ * cfgr = 0x3640100a, 0x0000100a,
+ * upper bits are just MCO
+ *
+ * cir = 0x0, 0x0
+ * ahb1rstr = 0x0, 0x0
+ * ahb2rstr = 0x0, 0x0
+ * ahb3rstr = 0x0,
+ * pad_1c = 0x0,
+ * apb1rstr = 0x0,
+ * apb2rstr = 0x0,
+ * pad_28 = 0x0,
+ * pad_2c = 0x0,
+ * _ahb1enr = 0x55, 0x80
+ * _ahb2enr = 0x80, 0xc800
+ * ahbdnr = 0x0,
+ * pad_3c = 0x0,
+ * apb1enr = 0x10000400,
+ * apb2enr = 0x8020,
+ * pad_48 = 0x0,
+ * pad_4c = 0x0,
+ * ahb1lpenr = 0x6390ff, 0x6390ff
+ * ahb2lpenr = 0xd0, 0xd0
+ * ahb3lpenr = 0x3, 0x3
+ * pad_5c = 0x0,
+ * apb1lpenr = 0xfffecfff, 0xfffecfff,
+ * apb2lpenr = 0x357f9f3, 0x357f9f3,
+ * pad_68 = 0x0,
+ * pad_6c = 0x0,
+ * bdcr = 0x0, 0x8200,
+ * csr = 0x0, 0x1e000003,
+ * pad_78 = 0x0,
+ * pad_7c = 0x0,
+ * sscgr = 0x0,
+ * plli2scfgr = 0x24003010, 0x44003008,
+ * pad_88 = 0x0,
+ * dckcfgr = 0x0,
+ * ckgatenr = 0x0,
+ * dckcfgr2 = 0x8000000 0x08000000
+ * }
+ *
+ *
+ */
+
+/*
+ *
+ * main
+ * HAL_Init
+ * SystemClock_Config
+ *
+ * USBD_Init
+ * USBD_LL_Init
+ * HAL_PCD_Init
+ * HAL_PCD_MspInit
+ * __HAL_RCC_GPIOA_CLK_ENABLE
+ * HAL_GPIO_Init
+ * __HAL_RCC_USB_OTG_FS_CLK_ENABLE
+ * HAL_NVIC_SetPriority
+ * HAL_NVIC_EnableIRQ
+ * USB_CoreInit
+ * Select FS Embedded PHY
+ * USB_CoreReset
+ * Deactivate the power down
+ * USB_SetCurrentMode
+ * USB_DevInit
+ * VBUS sensing stuff
+ * Restart PHY clock
+ * USB_SetDevSpeed
+ * USB_FlushTxFifo
+ * USB_FlushRxFifo
+ * Clear pending interrupts
+ * Disable all endpoints
+ * Disable all interrupts
+ * Clear pending interrupts
+ * enable interrupts
+ * USB_DevDisconnect
+ * Turn on SDIS bit
+ * delay 3ms
+ * HAL_PCDEx_SeRxFifo
+ * HAL_PCDEx_SetTxFifo
+ * USBD_RegisterClass
+ * USBD_MSC_RegisterStorage
+ * USBD_Start
+ * USBD_LL_Start
+ * HAL_PCD_Start
+ * __HAL_LOCK
+ * USB_DevConnect
+ * Turn off SDIS bit
+ * delay 3ms
+ * __HAL_PCD_ENABLE
+ * USB_EnableGlobalInt
+ * USBx->GAHBCFG |= USB_OTG_GAHBCFG_GINT;
+ * __HAL_UNLOCK
+ *
+ */