[ create a new paste ] login | about

Link: http://codepad.org/buOZpUPq    [ raw code | fork ]

C++, pasted on Feb 11:
#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();
    }
}


Create a new paste based on this one


Comments: