mirror of
https://github.com/hathach/tinyusb.git
synced 2025-02-07 05:54:11 +08:00
ported board stm32f412g discovery
- added soft connect for enable pull up register dcd stm32f4
This commit is contained in:
parent
642ff56b32
commit
4663f9084d
@ -113,6 +113,11 @@ static void SystemClock_Config(void)
|
|||||||
|
|
||||||
void board_init(void)
|
void board_init(void)
|
||||||
{
|
{
|
||||||
|
SystemClock_Config();
|
||||||
|
|
||||||
|
// Notify runtime of frequency change.
|
||||||
|
SystemCoreClockUpdate();
|
||||||
|
|
||||||
#if CFG_TUSB_OS == OPT_OS_NONE
|
#if CFG_TUSB_OS == OPT_OS_NONE
|
||||||
// 1ms tick timer
|
// 1ms tick timer
|
||||||
SysTick_Config(SystemCoreClock / 1000);
|
SysTick_Config(SystemCoreClock / 1000);
|
||||||
@ -121,13 +126,9 @@ void board_init(void)
|
|||||||
//NVIC_SetPriority(USB0_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY );
|
//NVIC_SetPriority(USB0_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
SystemClock_Config();
|
|
||||||
|
|
||||||
// Notify runtime of frequency change.
|
|
||||||
SystemCoreClockUpdate();
|
|
||||||
|
|
||||||
__HAL_RCC_GPIOA_CLK_ENABLE(); // button, USB D+/D-
|
__HAL_RCC_GPIOA_CLK_ENABLE(); // button, USB D+/D-
|
||||||
__HAL_RCC_GPIOE_CLK_ENABLE(); // LED
|
__HAL_RCC_GPIOE_CLK_ENABLE(); // LED
|
||||||
|
__HAL_RCC_GPIOG_CLK_ENABLE(); // USB power switch IO pin
|
||||||
|
|
||||||
GPIO_InitTypeDef GPIO_InitStruct;
|
GPIO_InitTypeDef GPIO_InitStruct;
|
||||||
|
|
||||||
@ -147,9 +148,6 @@ void board_init(void)
|
|||||||
GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
|
GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
|
||||||
HAL_GPIO_Init(BUTTON_PORT, &GPIO_InitStruct);
|
HAL_GPIO_Init(BUTTON_PORT, &GPIO_InitStruct);
|
||||||
|
|
||||||
// Enable USB OTG clock
|
|
||||||
__HAL_RCC_USB_OTG_FS_CLK_ENABLE();
|
|
||||||
|
|
||||||
/* Configure USB FS GPIOs */
|
/* Configure USB FS GPIOs */
|
||||||
/* Configure USB D+ D- Pins */
|
/* Configure USB D+ D- Pins */
|
||||||
GPIO_InitStruct.Pin = GPIO_PIN_11 | GPIO_PIN_12;
|
GPIO_InitStruct.Pin = GPIO_PIN_11 | GPIO_PIN_12;
|
||||||
@ -165,13 +163,22 @@ void board_init(void)
|
|||||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||||
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
||||||
|
|
||||||
/* This for ID line debug */
|
/* ID Pin */
|
||||||
GPIO_InitStruct.Pin = GPIO_PIN_10;
|
GPIO_InitStruct.Pin = GPIO_PIN_10;
|
||||||
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
|
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
|
||||||
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
||||||
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
|
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
|
||||||
GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;
|
GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;
|
||||||
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
||||||
|
|
||||||
|
/* Configure POWER_SWITCH IO pin */
|
||||||
|
GPIO_InitStruct.Pin = GPIO_PIN_8;
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
|
||||||
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||||
|
HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
|
||||||
|
|
||||||
|
// Enable USB OTG clock
|
||||||
|
__HAL_RCC_USB_OTG_FS_CLK_ENABLE();
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
* The MIT License (MIT)
|
* The MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Copyright (c) 2018 Scott Shawcroft, 2019 William D. Jones for Adafruit Industries
|
* Copyright (c) 2018 Scott Shawcroft, 2019 William D. Jones for Adafruit Industries
|
||||||
|
* Copyright (c) 2019 Ha Thach (tinyusb.org)
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
@ -39,6 +40,11 @@
|
|||||||
#define IN_EP_BASE (USB_OTG_INEndpointTypeDef *) (USB_OTG_FS_PERIPH_BASE + USB_OTG_IN_ENDPOINT_BASE)
|
#define IN_EP_BASE (USB_OTG_INEndpointTypeDef *) (USB_OTG_FS_PERIPH_BASE + USB_OTG_IN_ENDPOINT_BASE)
|
||||||
#define FIFO_BASE(_x) (volatile uint32_t *) (USB_OTG_FS_PERIPH_BASE + USB_OTG_FIFO_BASE + (_x) * USB_OTG_FIFO_SIZE)
|
#define FIFO_BASE(_x) (volatile uint32_t *) (USB_OTG_FS_PERIPH_BASE + USB_OTG_FIFO_BASE + (_x) * USB_OTG_FIFO_SIZE)
|
||||||
|
|
||||||
|
// TODO Merge with OTG_HS
|
||||||
|
// Max endpoints for each direction
|
||||||
|
// USB_OTG_FS_TOTAL_FIFO_SIZE
|
||||||
|
#define EP_MAX USB_OTG_FS_MAX_IN_ENDPOINTS
|
||||||
|
|
||||||
static TU_ATTR_ALIGNED(4) uint32_t _setup_packet[6];
|
static TU_ATTR_ALIGNED(4) uint32_t _setup_packet[6];
|
||||||
static uint8_t _setup_offs; // We store up to 3 setup packets.
|
static uint8_t _setup_offs; // We store up to 3 setup packets.
|
||||||
|
|
||||||
@ -52,7 +58,7 @@ typedef struct {
|
|||||||
|
|
||||||
typedef volatile uint32_t * usb_fifo_t;
|
typedef volatile uint32_t * usb_fifo_t;
|
||||||
|
|
||||||
xfer_ctl_t xfer_status[4][2];
|
xfer_ctl_t xfer_status[EP_MAX][2];
|
||||||
#define XFER_CTL_BASE(_ep, _dir) &xfer_status[_ep][_dir]
|
#define XFER_CTL_BASE(_ep, _dir) &xfer_status[_ep][_dir]
|
||||||
|
|
||||||
|
|
||||||
@ -61,7 +67,7 @@ static void bus_reset(void) {
|
|||||||
USB_OTG_DeviceTypeDef * dev = DEVICE_BASE;
|
USB_OTG_DeviceTypeDef * dev = DEVICE_BASE;
|
||||||
USB_OTG_OUTEndpointTypeDef * out_ep = OUT_EP_BASE;
|
USB_OTG_OUTEndpointTypeDef * out_ep = OUT_EP_BASE;
|
||||||
|
|
||||||
for(int n = 0; n < 4; n++) {
|
for(uint8_t n = 0; n < EP_MAX; n++) {
|
||||||
out_ep[n].DOEPCTL |= USB_OTG_DOEPCTL_SNAK;
|
out_ep[n].DOEPCTL |= USB_OTG_DOEPCTL_SNAK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -151,7 +157,7 @@ void dcd_init (uint8_t rhport)
|
|||||||
// the core to stop working/require reset.
|
// the core to stop working/require reset.
|
||||||
USB_OTG_FS->GINTMSK |= /* USB_OTG_GINTMSK_OTGINT | */ USB_OTG_GINTMSK_MMISM;
|
USB_OTG_FS->GINTMSK |= /* USB_OTG_GINTMSK_OTGINT | */ USB_OTG_GINTMSK_MMISM;
|
||||||
|
|
||||||
USB_OTG_DeviceTypeDef * dev = ((USB_OTG_DeviceTypeDef *) (USB_OTG_FS_PERIPH_BASE + USB_OTG_DEVICE_BASE));
|
USB_OTG_DeviceTypeDef * dev = DEVICE_BASE;
|
||||||
|
|
||||||
// If USB host misbehaves during status portion of control xfer
|
// If USB host misbehaves during status portion of control xfer
|
||||||
// (non zero-length packet), send STALL back and discard. Full speed.
|
// (non zero-length packet), send STALL back and discard. Full speed.
|
||||||
@ -161,12 +167,15 @@ void dcd_init (uint8_t rhport)
|
|||||||
USB_OTG_GINTMSK_SOFM | USB_OTG_GINTMSK_RXFLVLM /* SB_OTG_GINTMSK_ESUSPM | \
|
USB_OTG_GINTMSK_SOFM | USB_OTG_GINTMSK_RXFLVLM /* SB_OTG_GINTMSK_ESUSPM | \
|
||||||
USB_OTG_GINTMSK_USBSUSPM */;
|
USB_OTG_GINTMSK_USBSUSPM */;
|
||||||
|
|
||||||
// Enable pullup, enable peripheral.
|
// Enable VBus hardware sensing,
|
||||||
#ifdef USB_OTG_GCCFG_VBDEN
|
#ifdef USB_OTG_GCCFG_VBDEN
|
||||||
USB_OTG_FS->GCCFG |= USB_OTG_GCCFG_VBDEN | USB_OTG_GCCFG_PWRDWN;
|
USB_OTG_FS->GCCFG |= USB_OTG_GCCFG_VBDEN | USB_OTG_GCCFG_PWRDWN;
|
||||||
#else
|
#else
|
||||||
USB_OTG_FS->GCCFG |= USB_OTG_GCCFG_VBUSBSEN | USB_OTG_GCCFG_PWRDWN;
|
USB_OTG_FS->GCCFG |= USB_OTG_GCCFG_VBUSBSEN | USB_OTG_GCCFG_PWRDWN;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Soft Connect -> Enable pullup on D+/D-
|
||||||
|
dev->DCTL &= ~USB_OTG_DCTL_SDIS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dcd_int_enable (uint8_t rhport)
|
void dcd_int_enable (uint8_t rhport)
|
||||||
@ -220,7 +229,7 @@ bool dcd_edpt_open (uint8_t rhport, tusb_desc_endpoint_t const * desc_edpt)
|
|||||||
uint8_t const dir = tu_edpt_dir(desc_edpt->bEndpointAddress);
|
uint8_t const dir = tu_edpt_dir(desc_edpt->bEndpointAddress);
|
||||||
|
|
||||||
// Unsupported endpoint numbers/size.
|
// Unsupported endpoint numbers/size.
|
||||||
if((desc_edpt->wMaxPacketSize.size > 64) || (epnum > 3)) {
|
if((desc_edpt->wMaxPacketSize.size > 64) || (epnum > EP_MAX)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -551,8 +560,9 @@ static void read_rx_fifo(USB_OTG_OUTEndpointTypeDef * out_ep) {
|
|||||||
static void handle_epout_ints(USB_OTG_DeviceTypeDef * dev, USB_OTG_OUTEndpointTypeDef * out_ep) {
|
static void handle_epout_ints(USB_OTG_DeviceTypeDef * dev, USB_OTG_OUTEndpointTypeDef * out_ep) {
|
||||||
// DAINT for a given EP clears when DOEPINTx is cleared.
|
// DAINT for a given EP clears when DOEPINTx is cleared.
|
||||||
// OEPINT will be cleared when DAINT's out bits are cleared.
|
// OEPINT will be cleared when DAINT's out bits are cleared.
|
||||||
for(int n = 0; n < 4; n++) {
|
for(uint8_t n = 0; n < EP_MAX; n++) {
|
||||||
xfer_ctl_t * xfer = XFER_CTL_BASE(n, TUSB_DIR_OUT);
|
xfer_ctl_t * xfer = XFER_CTL_BASE(n, TUSB_DIR_OUT);
|
||||||
|
|
||||||
if(dev->DAINT & (1 << (USB_OTG_DAINT_OEPINT_Pos + n))) {
|
if(dev->DAINT & (1 << (USB_OTG_DAINT_OEPINT_Pos + n))) {
|
||||||
// SETUP packet Setup Phase done.
|
// SETUP packet Setup Phase done.
|
||||||
if(out_ep[n].DOEPINT & USB_OTG_DOEPINT_STUP) {
|
if(out_ep[n].DOEPINT & USB_OTG_DOEPINT_STUP) {
|
||||||
@ -588,7 +598,7 @@ static void handle_epout_ints(USB_OTG_DeviceTypeDef * dev, USB_OTG_OUTEndpointTy
|
|||||||
static void handle_epin_ints(USB_OTG_DeviceTypeDef * dev, USB_OTG_INEndpointTypeDef * in_ep) {
|
static void handle_epin_ints(USB_OTG_DeviceTypeDef * dev, USB_OTG_INEndpointTypeDef * in_ep) {
|
||||||
// DAINT for a given EP clears when DIEPINTx is cleared.
|
// DAINT for a given EP clears when DIEPINTx is cleared.
|
||||||
// IEPINT will be cleared when DAINT's out bits are cleared.
|
// IEPINT will be cleared when DAINT's out bits are cleared.
|
||||||
for(uint8_t n = 0; n < 4; n++) {
|
for(uint8_t n = 0; n < EP_MAX; n++) {
|
||||||
xfer_ctl_t * xfer = XFER_CTL_BASE(n, TUSB_DIR_IN);
|
xfer_ctl_t * xfer = XFER_CTL_BASE(n, TUSB_DIR_IN);
|
||||||
|
|
||||||
if(dev->DAINT & (1 << (USB_OTG_DAINT_IEPINT_Pos + n))) {
|
if(dev->DAINT & (1 << (USB_OTG_DAINT_IEPINT_Pos + n))) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user