diff options
| author | gdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4> | 2012-09-08 13:29:06 +0000 | 
|---|---|---|
| committer | gdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4> | 2012-09-08 13:29:06 +0000 | 
| commit | a8bb5137c0925b5c01564db192a0377519742b05 (patch) | |
| tree | 34ff3a941c13b5d7608dd96ce50975812d27a946 | |
| parent | 5caf58a184d6ffb0d08c286ab8137d224ae48ba3 (diff) | |
| download | ChibiOS-a8bb5137c0925b5c01564db192a0377519742b05.tar.gz ChibiOS-a8bb5137c0925b5c01564db192a0377519742b05.tar.bz2 ChibiOS-a8bb5137c0925b5c01564db192a0377519742b05.zip | |
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@4636 35acf78f-673a-0410-8e92-d51de3d6d3f4
| -rw-r--r-- | demos/ARMCM4-STM32F407-DISCOVERY-MEMS/.project | 52 | ||||
| -rw-r--r-- | demos/ARMCM4-STM32F407-DISCOVERY-MEMS/Makefile | 3 | ||||
| -rw-r--r-- | demos/ARMCM4-STM32F407-DISCOVERY-MEMS/halconf.h | 4 | ||||
| -rw-r--r-- | demos/ARMCM4-STM32F407-DISCOVERY-MEMS/main.c | 135 | ||||
| -rw-r--r-- | demos/ARMCM4-STM32F407-DISCOVERY-MEMS/mcuconf.h | 2 | ||||
| -rw-r--r-- | demos/ARMCM4-STM32F407-DISCOVERY-MEMS/usbcfg.c | 308 | ||||
| -rw-r--r-- | demos/ARMCM4-STM32F407-DISCOVERY-MEMS/usbcfg.h | 29 | 
7 files changed, 518 insertions, 15 deletions
| diff --git a/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/.project b/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/.project index eb135c367..20074f5a7 100644 --- a/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/.project +++ b/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/.project @@ -9,6 +9,58 @@  			<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
  			<triggers>clean,full,incremental,</triggers>
  			<arguments>
 +				<dictionary>
 +					<key>?name?</key>
 +					<value></value>
 +				</dictionary>
 +				<dictionary>
 +					<key>org.eclipse.cdt.make.core.append_environment</key>
 +					<value>true</value>
 +				</dictionary>
 +				<dictionary>
 +					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
 +					<value>all</value>
 +				</dictionary>
 +				<dictionary>
 +					<key>org.eclipse.cdt.make.core.buildArguments</key>
 +					<value>-j1</value>
 +				</dictionary>
 +				<dictionary>
 +					<key>org.eclipse.cdt.make.core.buildCommand</key>
 +					<value>make</value>
 +				</dictionary>
 +				<dictionary>
 +					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
 +					<value>clean</value>
 +				</dictionary>
 +				<dictionary>
 +					<key>org.eclipse.cdt.make.core.contents</key>
 +					<value>org.eclipse.cdt.make.core.activeConfigSettings</value>
 +				</dictionary>
 +				<dictionary>
 +					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
 +					<value>false</value>
 +				</dictionary>
 +				<dictionary>
 +					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
 +					<value>true</value>
 +				</dictionary>
 +				<dictionary>
 +					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
 +					<value>true</value>
 +				</dictionary>
 +				<dictionary>
 +					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
 +					<value>all</value>
 +				</dictionary>
 +				<dictionary>
 +					<key>org.eclipse.cdt.make.core.stopOnError</key>
 +					<value>true</value>
 +				</dictionary>
 +				<dictionary>
 +					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
 +					<value>true</value>
 +				</dictionary>
  			</arguments>
  		</buildCommand>
  		<buildCommand>
 diff --git a/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/Makefile b/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/Makefile index 95fe53ba6..1ed33ade1 100644 --- a/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/Makefile +++ b/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/Makefile @@ -85,8 +85,9 @@ CSRC = $(PORTSRC) \         $(PLATFORMSRC) \
         $(BOARDSRC) \
         $(CHIBIOS)/os/various/devices_lib/accel/lis302dl.c \
 +       $(CHIBIOS)/os/various/shell.c \
         $(CHIBIOS)/os/various/chprintf.c \
 -       main.c
 +       usbcfg.c main.c
  # C++ sources that can be compiled in ARM or THUMB mode depending on the global
  # setting.
 diff --git a/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/halconf.h b/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/halconf.h index 6fad6c6b7..d4013c7d4 100644 --- a/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/halconf.h +++ b/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/halconf.h @@ -136,7 +136,7 @@   * @brief   Enables the SERIAL over USB subsystem.
   */
  #if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__)
 -#define HAL_USE_SERIAL_USB          FALSE
 +#define HAL_USE_SERIAL_USB          TRUE
  #endif
  /**
 @@ -157,7 +157,7 @@   * @brief   Enables the USB subsystem.
   */
  #if !defined(HAL_USE_USB) || defined(__DOXYGEN__)
 -#define HAL_USE_USB                 FALSE
 +#define HAL_USE_USB                 TRUE
  #endif
  /*===========================================================================*/
 diff --git a/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/main.c b/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/main.c index 05406ba58..7940e3a0a 100644 --- a/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/main.c +++ b/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/main.c @@ -21,14 +21,96 @@  #include "ch.h"
  #include "hal.h"
  #include "test.h"
 +
 +#include "chprintf.h"
 +#include "shell.h"
  #include "lis302dl.h"
 +#include "usbcfg.h"
 +
 +/* Virtual serial port over USB.*/
 +static SerialUSBDriver SDU1;
 +
 +/*===========================================================================*/
 +/* Command line related.                                                     */
 +/*===========================================================================*/
 +
 +#define SHELL_WA_SIZE   THD_WA_SIZE(2048)
 +#define TEST_WA_SIZE    THD_WA_SIZE(256)
 +
 +static void cmd_mem(BaseSequentialStream *chp, int argc, char *argv[]) {
 +  size_t n, size;
 +
 +  (void)argv;
 +  if (argc > 0) {
 +    chprintf(chp, "Usage: mem\r\n");
 +    return;
 +  }
 +  n = chHeapStatus(NULL, &size);
 +  chprintf(chp, "core free memory : %u bytes\r\n", chCoreStatus());
 +  chprintf(chp, "heap fragments   : %u\r\n", n);
 +  chprintf(chp, "heap free total  : %u bytes\r\n", size);
 +}
 +
 +static void cmd_threads(BaseSequentialStream *chp, int argc, char *argv[]) {
 +  static const char *states[] = {THD_STATE_NAMES};
 +  Thread *tp;
 +
 +  (void)argv;
 +  if (argc > 0) {
 +    chprintf(chp, "Usage: threads\r\n");
 +    return;
 +  }
 +  chprintf(chp, "    addr    stack prio refs     state time\r\n");
 +  tp = chRegFirstThread();
 +  do {
 +    chprintf(chp, "%.8lx %.8lx %4lu %4lu %9s %lu\r\n",
 +            (uint32_t)tp, (uint32_t)tp->p_ctx.r13,
 +            (uint32_t)tp->p_prio, (uint32_t)(tp->p_refs - 1),
 +            states[tp->p_state], (uint32_t)tp->p_time);
 +    tp = chRegNextThread(tp);
 +  } while (tp != NULL);
 +}
 +
 +static void cmd_test(BaseSequentialStream *chp, int argc, char *argv[]) {
 +  Thread *tp;
 +
 +  (void)argv;
 +  if (argc > 0) {
 +    chprintf(chp, "Usage: test\r\n");
 +    return;
 +  }
 +  tp = chThdCreateFromHeap(NULL, TEST_WA_SIZE, chThdGetPriority(),
 +                           TestThread, chp);
 +  if (tp == NULL) {
 +    chprintf(chp, "out of memory\r\n");
 +    return;
 +  }
 +  chThdWait(tp);
 +}
 +
 +static const ShellCommand commands[] = {
 +  {"mem", cmd_mem},
 +  {"threads", cmd_threads},
 +  {"test", cmd_test},
 +  {NULL, NULL}
 +};
 +
 +static const ShellConfig shell_cfg1 = {
 +  (BaseSequentialStream *)&SDU1,
 +  commands
 +};
 +
 +/*===========================================================================*/
 +/* Accelerometer related.                                                    */
 +/*===========================================================================*/
 +
  /*
   * PWM configuration structure.
   * Cyclic callback enabled, channels 1 and 4 enabled without callbacks,
   * the active state is a logic one.
   */
 -static PWMConfig pwmcfg = {
 +static const PWMConfig pwmcfg = {
    100000,                                   /* 100kHz PWM clock frequency.  */
    128,                                      /* PWM period is 128 cycles.    */
    NULL,
 @@ -68,16 +150,14 @@ static const SPIConfig spi2cfg = {    0
  };
 -/* Last accelerometer data.*/
 -static int8_t xbuf[4], ybuf[4];
 -
  /*
   * This is a periodic thread that does absolutely nothing except flashing
   * a LED.
   */
  static WORKING_AREA(waThread1, 128);
  static msg_t Thread1(void *arg) {
 -  systime_t time;
 +  static int8_t xbuf[4], ybuf[4];   /* Last accelerometer data.*/
 +  systime_t time;                   /* Next deadline.*/
    (void)arg;
    chRegSetThreadName("reader");
 @@ -138,10 +218,15 @@ static msg_t Thread1(void *arg) {    }
  }
 +/*===========================================================================*/
 +/* Initialization and main thread.                                           */
 +/*===========================================================================*/
 +
  /*
   * Application entry point.
   */
  int main(void) {
 +  Thread *shelltp = NULL;
    /*
     * System initializations.
 @@ -154,6 +239,22 @@ int main(void) {    chSysInit();
    /*
 +   * Initializes a serial-over-USB CDC driver.
 +   */
 +  sduObjectInit(&SDU1);
 +  sduStart(&SDU1, &serusbcfg);
 +
 +  /*
 +   * Activates the USB driver and then the USB bus pull-up on D+.
 +   * Note, a delay is inserted in order to not have to disconnect the cable
 +   * after a reset.
 +   */
 +  usbDisconnectBus(serusbcfg.usbp);
 +  chThdSleepMilliseconds(1000);
 +  usbStart(serusbcfg.usbp, &usbcfg);
 +  usbConnectBus(serusbcfg.usbp);
 +
 +  /*
     * Activates the serial driver 2 using the driver default configuration.
     * PA2(TX) and PA3(RX) are routed to USART2.
     */
 @@ -188,10 +289,10 @@ int main(void) {     * Initializes the PWM driver 4, routes the TIM4 outputs to the board LEDs.
     */
    pwmStart(&PWMD4, &pwmcfg);
 -  palSetPadMode(GPIOD, GPIOD_LED4, PAL_MODE_ALTERNATE(2));  /* Green.   */
 -  palSetPadMode(GPIOD, GPIOD_LED3, PAL_MODE_ALTERNATE(2));  /* Orange.  */
 -  palSetPadMode(GPIOD, GPIOD_LED5, PAL_MODE_ALTERNATE(2));  /* Red.     */
 -  palSetPadMode(GPIOD, GPIOD_LED6, PAL_MODE_ALTERNATE(2));  /* Blue.    */
 +  palSetPadMode(GPIOD, GPIOD_LED4, PAL_MODE_ALTERNATE(2));      /* Green.   */
 +  palSetPadMode(GPIOD, GPIOD_LED3, PAL_MODE_ALTERNATE(2));      /* Orange.  */
 +  palSetPadMode(GPIOD, GPIOD_LED5, PAL_MODE_ALTERNATE(2));      /* Red.     */
 +  palSetPadMode(GPIOD, GPIOD_LED6, PAL_MODE_ALTERNATE(2));      /* Blue.    */
    /*
     * Creates the example thread.
 @@ -206,8 +307,20 @@ int main(void) {     * driver 2.
     */
    while (TRUE) {
 -    if (palReadPad(GPIOA, GPIOA_BUTTON))
 -      TestThread(&SD2);
 +    if (!shelltp) {
 +      if (SDU1.config->usbp->state == USB_ACTIVE) {
 +        /* Spawns a new shell.*/
 +        shelltp = shellCreate(&shell_cfg1, SHELL_WA_SIZE, NORMALPRIO);
 +      }
 +    }
 +    else{
 +      /* If the previous shell has been exited.*/
 +      if (chThdTerminated(shelltp)) {
 +        /* Recovers memory of the previous shell.*/
 +        chThdRelease(shelltp);
 +        shelltp = NULL;
 +      }
 +    }
      chThdSleepMilliseconds(500);
    }
  }
 diff --git a/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/mcuconf.h b/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/mcuconf.h index 7934955ad..c0748cee5 100644 --- a/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/mcuconf.h +++ b/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/mcuconf.h @@ -244,7 +244,7 @@  /*
   * USB driver system settings.
   */
 -#define STM32_USB_USE_OTG1                  FALSE
 +#define STM32_USB_USE_OTG1                  TRUE
  #define STM32_USB_USE_OTG2                  FALSE
  #define STM32_USB_OTG1_IRQ_PRIORITY         14
  #define STM32_USB_OTG2_IRQ_PRIORITY         14
 diff --git a/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/usbcfg.c b/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/usbcfg.c new file mode 100644 index 000000000..7472b634d --- /dev/null +++ b/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/usbcfg.c @@ -0,0 +1,308 @@ +/*
 +    ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
 +                 2011,2012 Giovanni Di Sirio.
 +
 +    This file is part of ChibiOS/RT.
 +
 +    ChibiOS/RT 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.
 +
 +    ChibiOS/RT 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 <http://www.gnu.org/licenses/>.
 +*/
 +
 +#include "ch.h"
 +#include "hal.h"
 +#include "usb_cdc.h"
 +
 +/*
 + * USB Device Descriptor.
 + */
 +static const uint8_t vcom_device_descriptor_data[18] = {
 +  USB_DESC_DEVICE       (0x0110,        /* bcdUSB (1.1).                    */
 +                         0x02,          /* bDeviceClass (CDC).              */
 +                         0x00,          /* bDeviceSubClass.                 */
 +                         0x00,          /* bDeviceProtocol.                 */
 +                         0x40,          /* bMaxPacketSize.                  */
 +                         0x0483,        /* idVendor (ST).                   */
 +                         0x5740,        /* idProduct.                       */
 +                         0x0200,        /* bcdDevice.                       */
 +                         1,             /* iManufacturer.                   */
 +                         2,             /* iProduct.                        */
 +                         3,             /* iSerialNumber.                   */
 +                         1)             /* bNumConfigurations.              */
 +};
 +
 +/*
 + * Device Descriptor wrapper.
 + */
 +static const USBDescriptor vcom_device_descriptor = {
 +  sizeof vcom_device_descriptor_data,
 +  vcom_device_descriptor_data
 +};
 +
 +/* Configuration Descriptor tree for a CDC.*/
 +static const uint8_t vcom_configuration_descriptor_data[67] = {
 +  /* Configuration Descriptor.*/
 +  USB_DESC_CONFIGURATION(67,            /* wTotalLength.                    */
 +                         0x02,          /* bNumInterfaces.                  */
 +                         0x01,          /* bConfigurationValue.             */
 +                         0,             /* iConfiguration.                  */
 +                         0xC0,          /* bmAttributes (self powered).     */
 +                         50),           /* bMaxPower (100mA).               */
 +  /* Interface Descriptor.*/
 +  USB_DESC_INTERFACE    (0x00,          /* bInterfaceNumber.                */
 +                         0x00,          /* bAlternateSetting.               */
 +                         0x01,          /* bNumEndpoints.                   */
 +                         0x02,          /* bInterfaceClass (Communications
 +                                           Interface Class, CDC section
 +                                           4.2).                            */
 +                         0x02,          /* bInterfaceSubClass (Abstract
 +                                         Control Model, CDC section 4.3).   */
 +                         0x01,          /* bInterfaceProtocol (AT commands,
 +                                           CDC section 4.4).                */
 +                         0),            /* iInterface.                      */
 +  /* Header Functional Descriptor (CDC section 5.2.3).*/
 +  USB_DESC_BYTE         (5),            /* bLength.                         */
 +  USB_DESC_BYTE         (0x24),         /* bDescriptorType (CS_INTERFACE).  */
 +  USB_DESC_BYTE         (0x00),         /* bDescriptorSubtype (Header
 +                                           Functional Descriptor.           */
 +  USB_DESC_BCD          (0x0110),       /* bcdCDC.                          */
 +  /* Call Management Functional Descriptor. */
 +  USB_DESC_BYTE         (5),            /* bFunctionLength.                 */
 +  USB_DESC_BYTE         (0x24),         /* bDescriptorType (CS_INTERFACE).  */
 +  USB_DESC_BYTE         (0x01),         /* bDescriptorSubtype (Call Management
 +                                           Functional Descriptor).          */
 +  USB_DESC_BYTE         (0x00),         /* bmCapabilities (D0+D1).          */
 +  USB_DESC_BYTE         (0x01),         /* bDataInterface.                  */
 +  /* ACM Functional Descriptor.*/
 +  USB_DESC_BYTE         (4),            /* bFunctionLength.                 */
 +  USB_DESC_BYTE         (0x24),         /* bDescriptorType (CS_INTERFACE).  */
 +  USB_DESC_BYTE         (0x02),         /* bDescriptorSubtype (Abstract
 +                                           Control Management Descriptor).  */
 +  USB_DESC_BYTE         (0x02),         /* bmCapabilities.                  */
 +  /* Union Functional Descriptor.*/
 +  USB_DESC_BYTE         (5),            /* bFunctionLength.                 */
 +  USB_DESC_BYTE         (0x24),         /* bDescriptorType (CS_INTERFACE).  */
 +  USB_DESC_BYTE         (0x06),         /* bDescriptorSubtype (Union
 +                                           Functional Descriptor).          */
 +  USB_DESC_BYTE         (0x00),         /* bMasterInterface (Communication
 +                                           Class Interface).                */
 +  USB_DESC_BYTE         (0x01),         /* bSlaveInterface0 (Data Class
 +                                           Interface).                      */
 +  /* Endpoint 2 Descriptor.*/
 +  USB_DESC_ENDPOINT     (USB_CDC_INTERRUPT_REQUEST_EP|0x80,
 +                         0x03,          /* bmAttributes (Interrupt).        */
 +                         0x0008,        /* wMaxPacketSize.                  */
 +                         0xFF),         /* bInterval.                       */
 +  /* Interface Descriptor.*/
 +  USB_DESC_INTERFACE    (0x01,          /* bInterfaceNumber.                */
 +                         0x00,          /* bAlternateSetting.               */
 +                         0x02,          /* bNumEndpoints.                   */
 +                         0x0A,          /* bInterfaceClass (Data Class
 +                                           Interface, CDC section 4.5).     */
 +                         0x00,          /* bInterfaceSubClass (CDC section
 +                                           4.6).                            */
 +                         0x00,          /* bInterfaceProtocol (CDC section
 +                                           4.7).                            */
 +                         0x00),         /* iInterface.                      */
 +  /* Endpoint 3 Descriptor.*/
 +  USB_DESC_ENDPOINT     (USB_CDC_DATA_AVAILABLE_EP,     /* bEndpointAddress.*/
 +                         0x02,          /* bmAttributes (Bulk).             */
 +                         0x0040,        /* wMaxPacketSize.                  */
 +                         0x00),         /* bInterval.                       */
 +  /* Endpoint 1 Descriptor.*/
 +  USB_DESC_ENDPOINT     (USB_CDC_DATA_REQUEST_EP|0x80,  /* bEndpointAddress.*/
 +                         0x02,          /* bmAttributes (Bulk).             */
 +                         0x0040,        /* wMaxPacketSize.                  */
 +                         0x00)          /* bInterval.                       */
 +};
 +
 +/*
 + * Configuration Descriptor wrapper.
 + */
 +static const USBDescriptor vcom_configuration_descriptor = {
 +  sizeof vcom_configuration_descriptor_data,
 +  vcom_configuration_descriptor_data
 +};
 +
 +/*
 + * U.S. English language identifier.
 + */
 +static const uint8_t vcom_string0[] = {
 +  USB_DESC_BYTE(4),                     /* bLength.                         */
 +  USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType.                 */
 +  USB_DESC_WORD(0x0409)                 /* wLANGID (U.S. English).          */
 +};
 +
 +/*
 + * Vendor string.
 + */
 +static const uint8_t vcom_string1[] = {
 +  USB_DESC_BYTE(38),                    /* bLength.                         */
 +  USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType.                 */
 +  'S', 0, 'T', 0, 'M', 0, 'i', 0, 'c', 0, 'r', 0, 'o', 0, 'e', 0,
 +  'l', 0, 'e', 0, 'c', 0, 't', 0, 'r', 0, 'o', 0, 'n', 0, 'i', 0,
 +  'c', 0, 's', 0
 +};
 +
 +/*
 + * Device Description string.
 + */
 +static const uint8_t vcom_string2[] = {
 +  USB_DESC_BYTE(56),                    /* bLength.                         */
 +  USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType.                 */
 +  'C', 0, 'h', 0, 'i', 0, 'b', 0, 'i', 0, 'O', 0, 'S', 0, '/', 0,
 +  'R', 0, 'T', 0, ' ', 0, 'V', 0, 'i', 0, 'r', 0, 't', 0, 'u', 0,
 +  'a', 0, 'l', 0, ' ', 0, 'C', 0, 'O', 0, 'M', 0, ' ', 0, 'P', 0,
 +  'o', 0, 'r', 0, 't', 0
 +};
 +
 +/*
 + * Serial Number string.
 + */
 +static const uint8_t vcom_string3[] = {
 +  USB_DESC_BYTE(8),                     /* bLength.                         */
 +  USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType.                 */
 +  '0' + CH_KERNEL_MAJOR, 0,
 +  '0' + CH_KERNEL_MINOR, 0,
 +  '0' + CH_KERNEL_PATCH, 0
 +};
 +
 +/*
 + * Strings wrappers array.
 + */
 +static const USBDescriptor vcom_strings[] = {
 +  {sizeof vcom_string0, vcom_string0},
 +  {sizeof vcom_string1, vcom_string1},
 +  {sizeof vcom_string2, vcom_string2},
 +  {sizeof vcom_string3, vcom_string3}
 +};
 +
 +/*
 + * Handles the GET_DESCRIPTOR callback. All required descriptors must be
 + * handled here.
 + */
 +static const USBDescriptor *get_descriptor(USBDriver *usbp,
 +                                           uint8_t dtype,
 +                                           uint8_t dindex,
 +                                           uint16_t lang) {
 +
 +  (void)usbp;
 +  (void)lang;
 +  switch (dtype) {
 +  case USB_DESCRIPTOR_DEVICE:
 +    return &vcom_device_descriptor;
 +  case USB_DESCRIPTOR_CONFIGURATION:
 +    return &vcom_configuration_descriptor;
 +  case USB_DESCRIPTOR_STRING:
 +    if (dindex < 4)
 +      return &vcom_strings[dindex];
 +  }
 +  return NULL;
 +}
 +
 +/**
 + * @brief   IN EP1 state.
 + */
 +static USBInEndpointState ep1instate;
 +
 +/**
 + * @brief   OUT EP1 state.
 + */
 +static USBOutEndpointState ep1outstate;
 +
 +/**
 + * @brief   EP1 initialization structure (both IN and OUT).
 + */
 +static const USBEndpointConfig ep1config = {
 +  USB_EP_MODE_TYPE_BULK,
 +  NULL,
 +  sduDataTransmitted,
 +  sduDataReceived,
 +  0x0040,
 +  0x0040,
 +  &ep1instate,
 +  &ep1outstate,
 +  2,
 +  NULL
 +};
 +
 +/**
 + * @brief   IN EP2 state.
 + */
 +static USBInEndpointState ep2instate;
 +
 +/**
 + * @brief   EP2 initialization structure (IN only).
 + */
 +static const USBEndpointConfig ep2config = {
 +  USB_EP_MODE_TYPE_INTR,
 +  NULL,
 +  sduInterruptTransmitted,
 +  NULL,
 +  0x0010,
 +  0x0000,
 +  &ep2instate,
 +  NULL,
 +  1,
 +  NULL
 +};
 +
 +/*
 + * Handles the USB driver global events.
 + */
 +static void usb_event(USBDriver *usbp, usbevent_t event) {
 +
 +  switch (event) {
 +  case USB_EVENT_RESET:
 +    return;
 +  case USB_EVENT_ADDRESS:
 +    return;
 +  case USB_EVENT_CONFIGURED:
 +    chSysLockFromIsr();
 +
 +    /* Enables the endpoints specified into the configuration.
 +       Note, this callback is invoked from an ISR so I-Class functions
 +       must be used.*/
 +    usbInitEndpointI(usbp, USB_CDC_DATA_REQUEST_EP, &ep1config);
 +    usbInitEndpointI(usbp, USB_CDC_INTERRUPT_REQUEST_EP, &ep2config);
 +
 +    /* Resetting the state of the CDC subsystem.*/
 +    sduConfigureHookI(usbp);
 +
 +    chSysUnlockFromIsr();
 +    return;
 +  case USB_EVENT_SUSPEND:
 +    return;
 +  case USB_EVENT_WAKEUP:
 +    return;
 +  case USB_EVENT_STALLED:
 +    return;
 +  }
 +  return;
 +}
 +
 +/*
 + * USB driver configuration.
 + */
 +const USBConfig usbcfg = {
 +  usb_event,
 +  get_descriptor,
 +  sduRequestsHook,
 +  NULL
 +};
 +
 +/*
 + * Serial over USB driver configuration.
 + */
 +const SerialUSBConfig serusbcfg = {
 +  &USBD1
 +};
 diff --git a/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/usbcfg.h b/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/usbcfg.h new file mode 100644 index 000000000..4e98067eb --- /dev/null +++ b/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/usbcfg.h @@ -0,0 +1,29 @@ +/*
 +    ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
 +                 2011,2012 Giovanni Di Sirio.
 +
 +    This file is part of ChibiOS/RT.
 +
 +    ChibiOS/RT 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.
 +
 +    ChibiOS/RT 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 <http://www.gnu.org/licenses/>.
 +*/
 +
 +#ifndef _USBCFG_H_
 +#define _USBCFG_H_
 +
 +extern const USBConfig usbcfg;
 +extern SerialUSBConfig serusbcfg;
 +
 +#endif  /* _USBCFG_H_ */
 +
 +/** @} */
 | 
