#include <cstring>
#include "stm32f30x.h"
#include "stm32f30x_bitmask.h"
#include "f3usb.h"
#include "usbdevice.h"
#include "descriptor.h"
auto dev_desc = device_desc(0x200, 0, 0, 0, 64, 0xDEAD, 0xBEEF, 0, 0, 0, 0, 1);
auto config_desc = configuration_desc(1, 1, 0, 0xc0, 0,
interface_desc(0, 0, 2, 0, 0x00, 0x00, 0,
endpoint_desc(0x01, 0x02, 64, 0), // OUT
endpoint_desc(0x81, 0x02, 64, 0) // IN
)
);
using namespace USB;
class MyUSBDeviceDriver : public USBDeviceDriver
{
private:
uint8_t buf[64];
public:
//using USBDeviceDriver::USBDeviceDriver; // when gcc 4.8 is available
MyUSBDeviceDriver(const uint8_t *d_desc, const uint8_t *c_desc, USBHardwareDriver *drv) : USBDeviceDriver(d_desc, c_desc, drv) {}
virtual void init() override
{
// do stuff
USBDeviceDriver::init();
}
virtual void process() override
{
// do stuff
USBDeviceDriver::process();
}
virtual void onWriteComplete(int ep) override
{
if(ep == 1)
{
setOutTokenHandshake(ep, ACK);
}
}
virtual void onReadReady(int ep, uint32_t len) override
{
read(ep, buf, len);
write(ep, buf, len);
}
virtual void onSetupRequest(int ep, const SetupPacket &setup) override
{
write(ep, nullptr, 0);
}
};
#define GPIO_OSPEEDR_OSPEEDR_2MHZ ((uint32_t)0x00)
#define GPIO_OSPEEDR_OSPEEDR_10MHZ ((uint32_t)0x01)
#define GPIO_OSPEEDR_OSPEEDR_50MHZ ((uint32_t)0x03)
#define GPIO_MODER_MODER_IN ((uint32_t)0x0)
#define GPIO_MODER_MODER_OUT ((uint32_t)0x1)
#define GPIO_MODER_MODER_AF ((uint32_t)0x2)
#define GPIO_MODER_MODER_ANALOG ((uint32_t)0x3)
int main()
{
// enable PORTA/PORTE clock
RCC->AHBENR |= RCC_AHBENR_GPIOEEN_gm | RCC_AHBENR_GPIOAEN_gm;
// PE9/PE13 to low speed
GPIOE->OSPEEDR =
(GPIOE->OSPEEDR & ~(GPIO_OSPEEDR_OSPEEDR13_gm | GPIO_OSPEEDR_OSPEEDR9_gm))
| (GPIO_OSPEEDR_OSPEEDR_2MHZ << GPIO_OSPEEDR_OSPEEDR9_gp)
| (GPIO_OSPEEDR_OSPEEDR_2MHZ << GPIO_OSPEEDR_OSPEEDR13_gp)
;
// PA11/PA12 to high speed
GPIOA->OSPEEDR =
(GPIOA->OSPEEDR & ~(GPIO_OSPEEDR_OSPEEDR11_gm | GPIO_OSPEEDR_OSPEEDR12_gm))
| (GPIO_OSPEEDR_OSPEEDR_50MHZ << GPIO_OSPEEDR_OSPEEDR11_gp)
| (GPIO_OSPEEDR_OSPEEDR_50MHZ << GPIO_OSPEEDR_OSPEEDR12_gp)
;
// PE13 to output
GPIOE->MODER =
(GPIOE->MODER & ~GPIO_MODER_MODER13_gm)
| (GPIO_MODER_MODER_OUT << GPIO_MODER_MODER13_gp)
;
// PA11/PA12 to alternate function mode
GPIOA->MODER =
(GPIOA->MODER & ~(GPIO_MODER_MODER11_gm | GPIO_MODER_MODER12_gm))
| (GPIO_MODER_MODER_AF << GPIO_MODER_MODER11_gp)
| (GPIO_MODER_MODER_AF << GPIO_MODER_MODER12_gp)
;
// PA11/PA12 to alternate function 14 (USB_DM/USB_DP)
GPIOA->AFR[1] =
(GPIOA->AFR[1] & ~(GPIO_AFRH_AFRH11_gm | GPIO_AFRH_AFRH12_gm))
| (14 << GPIO_AFRH_AFRH11_gp)
| (14 << GPIO_AFRH_AFRH12_gp)
;
// enable USB clock, sys clock is 72MHz, default prescaler 1.5 = 48MHz
RCC->APB1ENR |= RCC_APB1ENR_USBEN_gm;
F3USB hw_driver;
MyUSBDeviceDriver device_driver((uint8_t *)&dev_desc, (uint8_t *)&config_desc, &hw_driver);
device_driver.init();
for(;;)
{
device_driver.process();
}
}