From 67e3452855d8446bab1ebf9f07cb8891f250fb6c Mon Sep 17 00:00:00 2001 From: Gareth McMullin Date: Tue, 15 Mar 2011 07:12:46 +1300 Subject: Added simple USB example for STM32F107. --- examples/stm32/stm32-h107/usb_simple/usb_simple.c | 118 ++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 examples/stm32/stm32-h107/usb_simple/usb_simple.c (limited to 'examples/stm32/stm32-h107/usb_simple/usb_simple.c') diff --git a/examples/stm32/stm32-h107/usb_simple/usb_simple.c b/examples/stm32/stm32-h107/usb_simple/usb_simple.c new file mode 100644 index 0000000..517f37e --- /dev/null +++ b/examples/stm32/stm32-h107/usb_simple/usb_simple.c @@ -0,0 +1,118 @@ +/* + * This file is part of the libopencm3 project. + * + * Copyright (C) 2011 Gareth McMullin + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include + +#include + +const struct usb_device_descriptor dev = { + .bLength = USB_DT_DEVICE_SIZE, + .bDescriptorType = USB_DT_DEVICE, + .bcdUSB = 0x0200, + .bDeviceClass = 0xFF, + .bDeviceSubClass = 0, + .bDeviceProtocol = 0, + .bMaxPacketSize0 = 64, + .idVendor = 0xCAFE, + .idProduct = 0xCAFE, + .bcdDevice = 0x0200, + .iManufacturer = 1, + .iProduct = 2, + .iSerialNumber = 3, + .bNumConfigurations = 1, +}; + +const struct usb_interface_descriptor iface = { + .bLength = USB_DT_INTERFACE_SIZE, + .bDescriptorType = USB_DT_INTERFACE, + .bInterfaceNumber = 0, + .bAlternateSetting = 0, + .bNumEndpoints = 0, + .bInterfaceClass = 0xFF, + .bInterfaceSubClass = 0, + .bInterfaceProtocol = 0, + .iInterface = 0, +}; + +const struct usb_interface ifaces[] = {{ + .num_altsetting = 1, + .altsetting = &iface, +}}; + +const struct usb_config_descriptor config = { + .bLength = USB_DT_CONFIGURATION_SIZE, + .bDescriptorType = USB_DT_CONFIGURATION, + .wTotalLength = 0, + .bNumInterfaces = 1, + .bConfigurationValue = 1, + .iConfiguration = 0, + .bmAttributes = 0x80, + .bMaxPower = 0x32, + + .interface = ifaces, +}; + +const char *usb_strings[] = { + "x", + "Black Sphere Technologies", + "Simple Device", + "1001" +}; + +static int simple_control_callback(struct usb_setup_data *req, u8 **buf, + u16 *len, void (**complete)(struct usb_setup_data *req)) +{ + (void)buf; + (void)len; + (void)complete; + + if(req->bmRequestType != 0x40) + return 0; /* Only accept vendor request */ + + if(req->wValue & 1) + gpio_set(GPIOC, GPIO6); + else + gpio_clear(GPIOC, GPIO6); + + return 1; +} + +int main(void) +{ + rcc_clock_setup_in_hse_8mhz_out_72mhz(); + + rcc_peripheral_enable_clock(&RCC_AHBENR, RCC_AHBENR_OTGFSEN); + rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_IOPAEN); + rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_IOPCEN); + + /* LED output */ + gpio_set_mode(GPIOC, GPIO_MODE_OUTPUT_2_MHZ, + GPIO_CNF_OUTPUT_PUSHPULL, GPIO6); + + usbd_init(&stm32f107_usb_driver, &dev, &config, usb_strings); + usbd_register_control_callback( + USB_REQ_TYPE_VENDOR, + USB_REQ_TYPE_TYPE, + simple_control_callback); + + while (1) + usbd_poll(); +} + -- cgit v1.2.3