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/Makefile | 23 ++++ examples/stm32/stm32-h107/usb_simple/README | 10 ++ examples/stm32/stm32-h107/usb_simple/usb_simple.c | 118 +++++++++++++++++++++ examples/stm32/stm32-h107/usb_simple/usb_simple.ld | 31 ++++++ 4 files changed, 182 insertions(+) create mode 100644 examples/stm32/stm32-h107/usb_simple/Makefile create mode 100644 examples/stm32/stm32-h107/usb_simple/README create mode 100644 examples/stm32/stm32-h107/usb_simple/usb_simple.c create mode 100644 examples/stm32/stm32-h107/usb_simple/usb_simple.ld (limited to 'examples/stm32') diff --git a/examples/stm32/stm32-h107/usb_simple/Makefile b/examples/stm32/stm32-h107/usb_simple/Makefile new file mode 100644 index 0000000..2d954e2 --- /dev/null +++ b/examples/stm32/stm32-h107/usb_simple/Makefile @@ -0,0 +1,23 @@ +## +## This file is part of the libopencm3 project. +## +## Copyright (C) 2009 Uwe Hermann +## +## 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 . +## + +BINARY = usb_simple + +include ../../Makefile.include + diff --git a/examples/stm32/stm32-h107/usb_simple/README b/examples/stm32/stm32-h107/usb_simple/README new file mode 100644 index 0000000..93d4f03 --- /dev/null +++ b/examples/stm32/stm32-h107/usb_simple/README @@ -0,0 +1,10 @@ +------------------------------------------------------------------------------ +README +------------------------------------------------------------------------------ + +This is small USB controlled LED blinking example program using libopencm3. + +It's intended for the ST STM32-based Olimex STM32-H107 eval board (see +http://olimex.com/dev/stm32-h107.html for details). The usbtest.py +script in this directory maybe used to control the LED. + 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(); +} + diff --git a/examples/stm32/stm32-h107/usb_simple/usb_simple.ld b/examples/stm32/stm32-h107/usb_simple/usb_simple.ld new file mode 100644 index 0000000..6c9c766 --- /dev/null +++ b/examples/stm32/stm32-h107/usb_simple/usb_simple.ld @@ -0,0 +1,31 @@ +/* + * This file is part of the libopencm3 project. + * + * Copyright (C) 2009 Uwe Hermann + * + * 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 . + */ + +/* Linker script for Olimex STM32-H107 (STM32F107VCT6, 256K flash, 64K RAM). */ + +/* Define memory regions. */ +MEMORY +{ + rom (rx) : ORIGIN = 0x08000000, LENGTH = 256K + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K +} + +/* Include the common ld script. */ +INCLUDE libopencm3_stm32.ld + -- cgit v1.2.3