From 4e68b68d5a799300bcbbfb3fdff0ea584239bcb0 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Sun, 6 Feb 2011 09:51:16 +0000 Subject: USB rework, step 2. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@2714 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- testhal/STM32/USB_CDC/main.c | 66 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 61 insertions(+), 5 deletions(-) (limited to 'testhal/STM32/USB_CDC/main.c') diff --git a/testhal/STM32/USB_CDC/main.c b/testhal/STM32/USB_CDC/main.c index 70a27a8f2..697740526 100644 --- a/testhal/STM32/USB_CDC/main.c +++ b/testhal/STM32/USB_CDC/main.c @@ -32,7 +32,7 @@ /* * USB driver structure. */ -static SerialUSBDriver SDU1; +//static SerialUSBDriver SDU1; /* * USB Device Descriptor. @@ -247,6 +247,24 @@ USBEndpointState ep2state; */ USBEndpointState ep3state; +void sduDataRequest(USBDriver *usbp, usbep_t ep) { + + (void)usbp; + (void)ep; +} + +void sduInterruptRequest(USBDriver *usbp, usbep_t ep) { + + (void)usbp; + (void)ep; +} + +void sduDataAvailable(USBDriver *usbp, usbep_t ep) { + + (void)usbp; + (void)ep; +} + /** * @brief EP1 initialization structure (IN only). */ @@ -317,6 +335,7 @@ static void usb_event(USBDriver *usbp, usbevent_t event) { /* * Serial over USB driver configuration. */ +#if 0 static const SerialUSBConfig serusbcfg = { &USBD1, { @@ -329,6 +348,40 @@ static const SerialUSBConfig serusbcfg = { DATA_AVAILABLE_EP, INTERRUPT_REQUEST_EP }; +#endif + +#include "usb_cdc.h" +static cdc_linecoding_t linecoding = { + {0x00, 0x96, 0x00, 0x00}, /* 38400. */ + LC_STOP_1, LC_PARITY_NONE, 8 +}; +bool_t sduRequestsHook(USBDriver *usbp) { + + if ((usbp->setup[0] & USB_RTYPE_TYPE_MASK) == USB_RTYPE_TYPE_CLASS) { + switch (usbp->setup[1]) { + case CDC_GET_LINE_CODING: + usbSetupTransfer(usbp, (uint8_t *)&linecoding, sizeof(linecoding)); + return TRUE; + case CDC_SET_LINE_CODING: + usbSetupTransfer(usbp, (uint8_t *)&linecoding, sizeof(linecoding)); + return TRUE; + case CDC_SET_CONTROL_LINE_STATE: + /* Nothing to do, there are no control lines.*/ + usbSetupTransfer(usbp, NULL, 0); + return TRUE; + default: + return FALSE; + } + } + return FALSE; +} + +USBConfig usbconfig = { + usb_event, + get_descriptor, + sduRequestsHook, + NULL +}; /*===========================================================================*/ /* Generic code. */ @@ -352,6 +405,7 @@ static msg_t Thread1(void *arg) { /* * USB CDC loopback thread. */ +#if 0 static WORKING_AREA(waThread2, 256); static msg_t Thread2(void *arg) { SerialUSBDriver *sdup = arg; @@ -368,6 +422,7 @@ static msg_t Thread2(void *arg) { } } } +#endif /* * Application entry point. @@ -385,11 +440,12 @@ int main(void) { chSysInit(); /* - * Activates the USB bus and then the USB driver. + * Activates the USB driver and then the USB bus pull-up on D+. */ + usbStart(&USBD1, &usbconfig); palClearPad(GPIOC, GPIOC_USB_DISC); - sduObjectInit(&SDU1); - sduStart(&SDU1, &serusbcfg); +// sduObjectInit(&SDU1); +// sduStart(&SDU1, &serusbcfg); /* * Activates the serial driver 2 using the driver default configuration. @@ -404,7 +460,7 @@ int main(void) { /* * Creates the USB CDC loopback thread. */ - chThdCreateStatic(waThread2, sizeof(waThread2), NORMALPRIO, Thread2, &SDU1); +// chThdCreateStatic(waThread2, sizeof(waThread2), NORMALPRIO, Thread2, &SDU1); /* * Normal main() thread activity, in this demo it does nothing except -- cgit v1.2.3 From 100573d2c30750a50c3dfd9f3e7a051dcc987724 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Sun, 6 Feb 2011 13:51:08 +0000 Subject: Serial over USB changes, work in progress, the USB demo is not buildable. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@2717 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- testhal/STM32/USB_CDC/main.c | 40 ++++++++++------------------------------ 1 file changed, 10 insertions(+), 30 deletions(-) (limited to 'testhal/STM32/USB_CDC/main.c') diff --git a/testhal/STM32/USB_CDC/main.c b/testhal/STM32/USB_CDC/main.c index 697740526..b55b24892 100644 --- a/testhal/STM32/USB_CDC/main.c +++ b/testhal/STM32/USB_CDC/main.c @@ -32,7 +32,7 @@ /* * USB driver structure. */ -//static SerialUSBDriver SDU1; +static SerialUSBDriver SDU1; /* * USB Device Descriptor. @@ -247,29 +247,11 @@ USBEndpointState ep2state; */ USBEndpointState ep3state; -void sduDataRequest(USBDriver *usbp, usbep_t ep) { - - (void)usbp; - (void)ep; -} - -void sduInterruptRequest(USBDriver *usbp, usbep_t ep) { - - (void)usbp; - (void)ep; -} - -void sduDataAvailable(USBDriver *usbp, usbep_t ep) { - - (void)usbp; - (void)ep; -} - /** * @brief EP1 initialization structure (IN only). */ static const USBEndpointConfig ep1config = { - sduDataRequest, + sduDataTransmitted, NULL, 0x0040, 0x0000, @@ -282,7 +264,7 @@ static const USBEndpointConfig ep1config = { * @brief EP2 initialization structure (IN only). */ static const USBEndpointConfig ep2config = { - sduInterruptRequest, + sduInterruptTransmitted, NULL, 0x0010, 0x0000, @@ -296,7 +278,7 @@ static const USBEndpointConfig ep2config = { */ static const USBEndpointConfig ep3config = { NULL, - sduDataAvailable, + sduDataReceived, 0x0000, 0x0040, EPR_EP_TYPE_BULK | EPR_STAT_TX_DIS | EPR_STAT_RX_VALID, @@ -335,7 +317,6 @@ static void usb_event(USBDriver *usbp, usbevent_t event) { /* * Serial over USB driver configuration. */ -#if 0 static const SerialUSBConfig serusbcfg = { &USBD1, { @@ -348,8 +329,8 @@ static const SerialUSBConfig serusbcfg = { DATA_AVAILABLE_EP, INTERRUPT_REQUEST_EP }; -#endif +#if 0 #include "usb_cdc.h" static cdc_linecoding_t linecoding = { {0x00, 0x96, 0x00, 0x00}, /* 38400. */ @@ -375,6 +356,7 @@ bool_t sduRequestsHook(USBDriver *usbp) { } return FALSE; } +#endif USBConfig usbconfig = { usb_event, @@ -405,7 +387,6 @@ static msg_t Thread1(void *arg) { /* * USB CDC loopback thread. */ -#if 0 static WORKING_AREA(waThread2, 256); static msg_t Thread2(void *arg) { SerialUSBDriver *sdup = arg; @@ -422,7 +403,6 @@ static msg_t Thread2(void *arg) { } } } -#endif /* * Application entry point. @@ -442,10 +422,10 @@ int main(void) { /* * Activates the USB driver and then the USB bus pull-up on D+. */ - usbStart(&USBD1, &usbconfig); +// usbStart(&USBD1, &usbconfig); + sduObjectInit(&SDU1); + sduStart(&SDU1, &serusbcfg); palClearPad(GPIOC, GPIOC_USB_DISC); -// sduObjectInit(&SDU1); -// sduStart(&SDU1, &serusbcfg); /* * Activates the serial driver 2 using the driver default configuration. @@ -460,7 +440,7 @@ int main(void) { /* * Creates the USB CDC loopback thread. */ -// chThdCreateStatic(waThread2, sizeof(waThread2), NORMALPRIO, Thread2, &SDU1); + chThdCreateStatic(waThread2, sizeof(waThread2), NORMALPRIO, Thread2, &SDU1); /* * Normal main() thread activity, in this demo it does nothing except -- cgit v1.2.3 From 9ab9d1b44b1dfc11094faf3da939d35061b53bed Mon Sep 17 00:00:00 2001 From: gdisirio Date: Tue, 8 Feb 2011 06:29:27 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@2719 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- testhal/STM32/USB_CDC/main.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'testhal/STM32/USB_CDC/main.c') diff --git a/testhal/STM32/USB_CDC/main.c b/testhal/STM32/USB_CDC/main.c index b55b24892..04fd4d615 100644 --- a/testhal/STM32/USB_CDC/main.c +++ b/testhal/STM32/USB_CDC/main.c @@ -251,11 +251,12 @@ USBEndpointState ep3state; * @brief EP1 initialization structure (IN only). */ static const USBEndpointConfig ep1config = { + EP_TYPE_BULK, sduDataTransmitted, NULL, 0x0040, 0x0000, - EPR_EP_TYPE_BULK | EPR_STAT_TX_NAK | EPR_STAT_RX_DIS, + USB_EP_FLAGS_IN_PACKET_MODE, 0x00C0, 0x0000 }; @@ -264,11 +265,12 @@ static const USBEndpointConfig ep1config = { * @brief EP2 initialization structure (IN only). */ static const USBEndpointConfig ep2config = { + EP_TYPE_INTR, sduInterruptTransmitted, NULL, 0x0010, 0x0000, - EPR_EP_TYPE_INTERRUPT | EPR_STAT_TX_NAK | EPR_STAT_RX_DIS, + 0, 0x0100, 0x0000 }; @@ -277,11 +279,12 @@ static const USBEndpointConfig ep2config = { * @brief EP3 initialization structure (OUT only). */ static const USBEndpointConfig ep3config = { + EP_TYPE_BULK, NULL, sduDataReceived, 0x0000, 0x0040, - EPR_EP_TYPE_BULK | EPR_STAT_TX_DIS | EPR_STAT_RX_VALID, + USB_EP_FLAGS_OUT_PACKET_MODE, 0x0000, 0x0110 }; -- cgit v1.2.3 From 3c6e54a52eff84bebce23f3d933c1de425a7b428 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Wed, 9 Feb 2011 19:56:01 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@2724 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- testhal/STM32/USB_CDC/main.c | 36 ------------------------------------ 1 file changed, 36 deletions(-) (limited to 'testhal/STM32/USB_CDC/main.c') diff --git a/testhal/STM32/USB_CDC/main.c b/testhal/STM32/USB_CDC/main.c index 04fd4d615..0c2a3ac9d 100644 --- a/testhal/STM32/USB_CDC/main.c +++ b/testhal/STM32/USB_CDC/main.c @@ -333,41 +333,6 @@ static const SerialUSBConfig serusbcfg = { INTERRUPT_REQUEST_EP }; -#if 0 -#include "usb_cdc.h" -static cdc_linecoding_t linecoding = { - {0x00, 0x96, 0x00, 0x00}, /* 38400. */ - LC_STOP_1, LC_PARITY_NONE, 8 -}; -bool_t sduRequestsHook(USBDriver *usbp) { - - if ((usbp->setup[0] & USB_RTYPE_TYPE_MASK) == USB_RTYPE_TYPE_CLASS) { - switch (usbp->setup[1]) { - case CDC_GET_LINE_CODING: - usbSetupTransfer(usbp, (uint8_t *)&linecoding, sizeof(linecoding)); - return TRUE; - case CDC_SET_LINE_CODING: - usbSetupTransfer(usbp, (uint8_t *)&linecoding, sizeof(linecoding)); - return TRUE; - case CDC_SET_CONTROL_LINE_STATE: - /* Nothing to do, there are no control lines.*/ - usbSetupTransfer(usbp, NULL, 0); - return TRUE; - default: - return FALSE; - } - } - return FALSE; -} -#endif - -USBConfig usbconfig = { - usb_event, - get_descriptor, - sduRequestsHook, - NULL -}; - /*===========================================================================*/ /* Generic code. */ /*===========================================================================*/ @@ -425,7 +390,6 @@ int main(void) { /* * Activates the USB driver and then the USB bus pull-up on D+. */ -// usbStart(&USBD1, &usbconfig); sduObjectInit(&SDU1); sduStart(&SDU1, &serusbcfg); palClearPad(GPIOC, GPIOC_USB_DISC); -- cgit v1.2.3 From 95d128420a70587ce2845df383ed9b6a165e58dc Mon Sep 17 00:00:00 2001 From: gdisirio Date: Sat, 12 Feb 2011 18:59:34 +0000 Subject: Fixed a problem in the USB-CDC demo. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@2733 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- testhal/STM32/USB_CDC/main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'testhal/STM32/USB_CDC/main.c') diff --git a/testhal/STM32/USB_CDC/main.c b/testhal/STM32/USB_CDC/main.c index 0c2a3ac9d..6af497542 100644 --- a/testhal/STM32/USB_CDC/main.c +++ b/testhal/STM32/USB_CDC/main.c @@ -367,7 +367,8 @@ static msg_t Thread2(void *arg) { uint8_t buffer[0x40]; size_t n = chIQReadTimeout(&sdup->iqueue, buffer, sizeof(buffer), TIME_IMMEDIATE); - chOQWriteTimeout(&sdup->oqueue, buffer, n, TIME_IMMEDIATE); + if (n > 0) + chOQWriteTimeout(&sdup->oqueue, buffer, n, TIME_IMMEDIATE); } } } -- cgit v1.2.3 From eb3355b5589b499e0d36e23f282bf8544cde0bbf Mon Sep 17 00:00:00 2001 From: gdisirio Date: Sat, 12 Feb 2011 19:52:43 +0000 Subject: Simplified USB endpoints configuration. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@2734 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- testhal/STM32/USB_CDC/main.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) (limited to 'testhal/STM32/USB_CDC/main.c') diff --git a/testhal/STM32/USB_CDC/main.c b/testhal/STM32/USB_CDC/main.c index 6af497542..05c8fa11a 100644 --- a/testhal/STM32/USB_CDC/main.c +++ b/testhal/STM32/USB_CDC/main.c @@ -251,12 +251,11 @@ USBEndpointState ep3state; * @brief EP1 initialization structure (IN only). */ static const USBEndpointConfig ep1config = { - EP_TYPE_BULK, + USB_EP_MODE_TYPE_BULK | USB_EP_MODE_PACKET, sduDataTransmitted, NULL, 0x0040, 0x0000, - USB_EP_FLAGS_IN_PACKET_MODE, 0x00C0, 0x0000 }; @@ -265,12 +264,11 @@ static const USBEndpointConfig ep1config = { * @brief EP2 initialization structure (IN only). */ static const USBEndpointConfig ep2config = { - EP_TYPE_INTR, + USB_EP_MODE_TYPE_INTR | USB_EP_MODE_PACKET, sduInterruptTransmitted, NULL, 0x0010, 0x0000, - 0, 0x0100, 0x0000 }; @@ -279,12 +277,11 @@ static const USBEndpointConfig ep2config = { * @brief EP3 initialization structure (OUT only). */ static const USBEndpointConfig ep3config = { - EP_TYPE_BULK, + USB_EP_MODE_TYPE_BULK | USB_EP_MODE_PACKET, NULL, sduDataReceived, 0x0000, 0x0040, - USB_EP_FLAGS_OUT_PACKET_MODE, 0x0000, 0x0110 }; -- cgit v1.2.3 From dd6a0b3ccdd62873e1cb874969741e3fb683db4b Mon Sep 17 00:00:00 2001 From: gdisirio Date: Sun, 13 Feb 2011 20:55:57 +0000 Subject: Implemented automatic allocation in the packet memory of the STM32 USB driver, no need to specify addresses anymore. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@2737 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- testhal/STM32/USB_CDC/main.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) (limited to 'testhal/STM32/USB_CDC/main.c') diff --git a/testhal/STM32/USB_CDC/main.c b/testhal/STM32/USB_CDC/main.c index 05c8fa11a..00f0d0e66 100644 --- a/testhal/STM32/USB_CDC/main.c +++ b/testhal/STM32/USB_CDC/main.c @@ -255,8 +255,6 @@ static const USBEndpointConfig ep1config = { sduDataTransmitted, NULL, 0x0040, - 0x0000, - 0x00C0, 0x0000 }; @@ -268,8 +266,6 @@ static const USBEndpointConfig ep2config = { sduInterruptTransmitted, NULL, 0x0010, - 0x0000, - 0x0100, 0x0000 }; @@ -281,9 +277,7 @@ static const USBEndpointConfig ep3config = { NULL, sduDataReceived, 0x0000, - 0x0040, - 0x0000, - 0x0110 + 0x0040 }; /* -- cgit v1.2.3 From 2c15c4864f33c3c71c58e54494561eff1b291a0f Mon Sep 17 00:00:00 2001 From: gdisirio Date: Mon, 14 Feb 2011 19:37:40 +0000 Subject: More improvements in the USB driver model. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@2738 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- testhal/STM32/USB_CDC/main.c | 33 ++++++++++++--------------------- 1 file changed, 12 insertions(+), 21 deletions(-) (limited to 'testhal/STM32/USB_CDC/main.c') diff --git a/testhal/STM32/USB_CDC/main.c b/testhal/STM32/USB_CDC/main.c index 00f0d0e66..423a47413 100644 --- a/testhal/STM32/USB_CDC/main.c +++ b/testhal/STM32/USB_CDC/main.c @@ -232,21 +232,6 @@ static const USBDescriptor *get_descriptor(USBDriver *usbp, return NULL; } -/** - * @brief EP1 state. - */ -USBEndpointState ep1state; - -/** - * @brief EP2 state. - */ -USBEndpointState ep2state; - -/** - * @brief EP3 state. - */ -USBEndpointState ep3state; - /** * @brief EP1 initialization structure (IN only). */ @@ -255,7 +240,9 @@ static const USBEndpointConfig ep1config = { sduDataTransmitted, NULL, 0x0040, - 0x0000 + 0x0000, + NULL, + NULL }; /** @@ -266,7 +253,9 @@ static const USBEndpointConfig ep2config = { sduInterruptTransmitted, NULL, 0x0010, - 0x0000 + 0x0000, + NULL, + NULL }; /** @@ -277,7 +266,9 @@ static const USBEndpointConfig ep3config = { NULL, sduDataReceived, 0x0000, - 0x0040 + 0x0040, + NULL, + NULL }; /* @@ -293,9 +284,9 @@ static void usb_event(USBDriver *usbp, usbevent_t event) { case USB_EVENT_CONFIGURED: /* Enables the endpoints specified into the configuration.*/ chSysLock(); - usbInitEndpointI(usbp, DATA_REQUEST_EP, &ep1state, &ep1config); - usbInitEndpointI(usbp, INTERRUPT_REQUEST_EP, &ep2state, &ep2config); - usbInitEndpointI(usbp, DATA_AVAILABLE_EP, &ep3state, &ep3config); + usbInitEndpointI(usbp, DATA_REQUEST_EP, &ep1config); + usbInitEndpointI(usbp, INTERRUPT_REQUEST_EP, &ep2config); + usbInitEndpointI(usbp, DATA_AVAILABLE_EP, &ep3config); chSysUnlock(); return; case USB_EVENT_SUSPEND: -- cgit v1.2.3 From 60d8f68906f28d369f35b624e129deee5092c86d Mon Sep 17 00:00:00 2001 From: gdisirio Date: Tue, 15 Feb 2011 18:44:29 +0000 Subject: More improvements to the generic USB driver, implemented suspend and wakeup handling in the STM32 USB driver. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@2742 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- testhal/STM32/USB_CDC/main.c | 213 ++++++++++++++++++++----------------------- 1 file changed, 101 insertions(+), 112 deletions(-) (limited to 'testhal/STM32/USB_CDC/main.c') diff --git a/testhal/STM32/USB_CDC/main.c b/testhal/STM32/USB_CDC/main.c index 423a47413..9868b00ab 100644 --- a/testhal/STM32/USB_CDC/main.c +++ b/testhal/STM32/USB_CDC/main.c @@ -30,129 +30,118 @@ #define DATA_AVAILABLE_EP 3 /* - * USB driver structure. + * USB Driver structure. */ static SerialUSBDriver SDU1; /* * USB Device Descriptor. */ -static const uint8_t vcom_device_descriptor_data[] = { - 18, /* bLength. */ - USB_DESCRIPTOR_DEVICE, /* bDescriptorType. */ - 0x10, 0x01, /* bcdUSB (1.1). */ - 0x02, /* bDeviceClass (CDC). */ - 0x00, /* bDeviceSubClass. */ - 0x00, /* bDeviceProtocol. */ - 0x40, /* bMaxPacketSize. */ - 0x83, 0x04, /* idVendor (0x0483). */ - 0x40, 0x57, /* idProduct (0x7540). */ - 0x00, 0x02, /* bcdDevice (2.00). */ - 1, /* iManufacturer. */ - 2, /* iProduct. */ - 3, /* IiSerialNumber. */ - 1 /* bNumConfigurations. */ +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. + * Device Descriptor wrapper. */ static const USBDescriptor vcom_device_descriptor = { - sizeof (vcom_device_descriptor_data), + sizeof vcom_device_descriptor_data, vcom_device_descriptor_data }; -/* Configuration Descriptor tree for a VCOM.*/ -static const uint8_t vcom_configuration_descriptor_data[] = { - /* Configuration descriptor.*/ - 9, /* bLength. */ - USB_DESCRIPTOR_CONFIGURATION, /* bDescriptorType. */ - 67, 0, /* wTotalLength. */ - 0x02, /* bNumInterfaces. */ - 0x01, /* bConfigurationValue. */ - 0, /* iConfiguration. */ - 0xC0, /* bmAttributes (self powered). */ - 50, /* MaxPower (100mA). */ +/* 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.*/ - 9, /* bLength. */ - USB_DESCRIPTOR_INTERFACE, /* bDescriptorType. */ - 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. */ + 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).*/ - 5, /* bLength. */ - 0x24, /* bDescriptorType (CS_INTERFACE). */ - 0x00, /* bDescriptorSubtype (Header Functional - Descriptor. */ - 0x10, 0x01, /* bcdCDC (1.10). */ - /* Call Managment Functional Descriptor. */ - 5, /* bFunctionLength. */ - 0x24, /* bDescriptorType (CS_INTERFACE). */ - 0x01, /* bDescriptorSubtype (Call Management - Functional Descriptor). */ - 0x00, /* bmCapabilities (D0+D1). */ - 0x01, /* bDataInterface. */ + 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.*/ - 4, /* bFunctionLength. */ - 0x24, /* bDescriptorType (CS_INTERFACE). */ - 0x02, /* bDescriptorSubtype (Abstract Control - Management Descriptor). */ - 0x02, /* bmCapabilities. */ + 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.*/ - 5, /* bFunctionLength. */ - 0x24, /* bDescriptorType (CS_INTERFACE). */ - 0x06, /* bDescriptorSubtype (Union Functional - Descriptor). */ - 0x00, /* bMasterInterface (Communication Class - Interface). */ - 0x01, /* bSlaveInterface0 (Data Class - Interface). */ + 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.*/ - 7, /* bLength. */ - USB_DESCRIPTOR_ENDPOINT, /* bDescriptorType. */ - INTERRUPT_REQUEST_EP | 0x80, /* bEndpointAddress (IN). */ - 0x03, /* bmAttributes (Interrupt). */ - 0x08, 0x00, /* wMaxPacketSize. */ - 0xFF, /* bInterval. */ + USB_DESC_ENDPOINT (INTERRUPT_REQUEST_EP|0x80, /* bEndpointAddress. */ + 0x03, /* bmAttributes (Interrupt). */ + 0x0008, /* wMaxPacketSize. */ + 0xFF), /* bInterval. */ /* Interface Descriptor.*/ - 9, /* bLength. */ - USB_DESCRIPTOR_INTERFACE, /* bDescriptorType. */ - 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. */ + 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.*/ - 7, /* bLength. */ - USB_DESCRIPTOR_ENDPOINT, /* bDescriptorType. */ - DATA_AVAILABLE_EP, /* bEndpointAddress (OUT). */ - 0x02, /* bmAttributes (Bulk). */ - 0x40, 0x00, /* wMaxPacketSize. */ - 0x00, /* bInterval (ignored for bulk. */ + USB_DESC_ENDPOINT (DATA_AVAILABLE_EP, /* bEndpointAddress. */ + 0x02, /* bmAttributes (Bulk). */ + 0x0040, /* wMaxPacketSize. */ + 0x00), /* bInterval. */ /* Endpoint 1 Descriptor.*/ - 7, /* bLength. */ - USB_DESCRIPTOR_ENDPOINT, /* bDescriptorType. */ - DATA_REQUEST_EP | 0x80, /* bEndpointAddress (IN). */ - 0x02, /* bmAttributes (Bulk). */ - 0x40, 0x00, /* wMaxPacketSize. */ - 0x00 /* bInterval (ignored for bulk. */ + USB_DESC_ENDPOINT (DATA_REQUEST_EP|0x80, /* bEndpointAddress. */ + 0x02, /* bmAttributes (Bulk). */ + 0x0040, /* wMaxPacketSize. */ + 0x00) /* bInterval. */ }; /* - * Configuration descriptor wrapper. + * Configuration Descriptor wrapper. */ static const USBDescriptor vcom_configuration_descriptor = { - sizeof (vcom_configuration_descriptor_data), + sizeof vcom_configuration_descriptor_data, vcom_configuration_descriptor_data }; @@ -160,28 +149,28 @@ static const USBDescriptor vcom_configuration_descriptor = { * U.S. English language identifier. */ static const uint8_t vcom_string0[] = { - 4, /* bLength. */ - USB_DESCRIPTOR_STRING, /* bDescriptorType. */ - 0x09, 0x04 /* wLANGID (0x0409, U.S. English). */ + 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[] = { - 38, /* bLength. */ - USB_DESCRIPTOR_STRING, /* bDescriptorType. */ + 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. + * Device Description string. */ static const uint8_t vcom_string2[] = { - 56, /* bLength. */ - USB_DESCRIPTOR_STRING, /* bDescriptorType. */ + 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, @@ -189,11 +178,11 @@ static const uint8_t vcom_string2[] = { }; /* - * Serial number string. + * Serial Number string. */ static const uint8_t vcom_string3[] = { - 8, /* bLength. */ - USB_DESCRIPTOR_STRING, /* bDescriptorType. */ + 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 @@ -203,10 +192,10 @@ static const uint8_t vcom_string3[] = { * 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} + {sizeof vcom_string0, vcom_string0}, + {sizeof vcom_string1, vcom_string1}, + {sizeof vcom_string2, vcom_string2}, + {sizeof vcom_string3, vcom_string3} }; /* @@ -291,7 +280,7 @@ static void usb_event(USBDriver *usbp, usbevent_t event) { return; case USB_EVENT_SUSPEND: return; - case USB_EVENT_RESUME: + case USB_EVENT_WAKEUP: return; case USB_EVENT_STALLED: return; -- cgit v1.2.3 From 690d08a1f93848ee8b467299b5d672d1f69f23c5 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Fri, 18 Feb 2011 08:00:36 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@2743 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- testhal/STM32/USB_CDC/main.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'testhal/STM32/USB_CDC/main.c') diff --git a/testhal/STM32/USB_CDC/main.c b/testhal/STM32/USB_CDC/main.c index 9868b00ab..49d744d5d 100644 --- a/testhal/STM32/USB_CDC/main.c +++ b/testhal/STM32/USB_CDC/main.c @@ -271,12 +271,14 @@ static void usb_event(USBDriver *usbp, usbevent_t event) { case USB_EVENT_ADDRESS: return; case USB_EVENT_CONFIGURED: - /* Enables the endpoints specified into the configuration.*/ - chSysLock(); + /* Enables the endpoints specified into the configuration. + Note, this callback is invoked from an ISR so I-Class functions + must be used.*/ + chSysLockFromIsr(); usbInitEndpointI(usbp, DATA_REQUEST_EP, &ep1config); usbInitEndpointI(usbp, INTERRUPT_REQUEST_EP, &ep2config); usbInitEndpointI(usbp, DATA_AVAILABLE_EP, &ep3config); - chSysUnlock(); + chSysUnlockFromIsr(); return; case USB_EVENT_SUSPEND: return; -- cgit v1.2.3 From ebaac50aa4daa939814b783b1239073e3170860f Mon Sep 17 00:00:00 2001 From: gdisirio Date: Tue, 8 Mar 2011 21:09:14 +0000 Subject: Improvements to the Serial over USB driver. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@2810 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- testhal/STM32/USB_CDC/main.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) (limited to 'testhal/STM32/USB_CDC/main.c') diff --git a/testhal/STM32/USB_CDC/main.c b/testhal/STM32/USB_CDC/main.c index 49d744d5d..e18275808 100644 --- a/testhal/STM32/USB_CDC/main.c +++ b/testhal/STM32/USB_CDC/main.c @@ -21,14 +21,12 @@ #include "hal.h" #include "test.h" +#include "usb_cdc.h" + /*===========================================================================*/ /* USB related stuff. */ /*===========================================================================*/ -#define DATA_REQUEST_EP 1 -#define INTERRUPT_REQUEST_EP 2 -#define DATA_AVAILABLE_EP 3 - /* * USB Driver structure. */ @@ -300,10 +298,7 @@ static const SerialUSBConfig serusbcfg = { get_descriptor, sduRequestsHook, NULL - }, - DATA_REQUEST_EP, - DATA_AVAILABLE_EP, - INTERRUPT_REQUEST_EP + } }; /*===========================================================================*/ -- cgit v1.2.3 From 3d50b5c9e0eee6ca4eb2e9c1114fcd8ff109e984 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Thu, 10 Mar 2011 18:54:58 +0000 Subject: USB improvements. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@2815 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- testhal/STM32/USB_CDC/main.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'testhal/STM32/USB_CDC/main.c') diff --git a/testhal/STM32/USB_CDC/main.c b/testhal/STM32/USB_CDC/main.c index e18275808..6f4416364 100644 --- a/testhal/STM32/USB_CDC/main.c +++ b/testhal/STM32/USB_CDC/main.c @@ -224,6 +224,7 @@ static const USBDescriptor *get_descriptor(USBDriver *usbp, */ static const USBEndpointConfig ep1config = { USB_EP_MODE_TYPE_BULK | USB_EP_MODE_PACKET, + NULL, sduDataTransmitted, NULL, 0x0040, @@ -237,6 +238,7 @@ static const USBEndpointConfig ep1config = { */ static const USBEndpointConfig ep2config = { USB_EP_MODE_TYPE_INTR | USB_EP_MODE_PACKET, + NULL, sduInterruptTransmitted, NULL, 0x0010, @@ -251,6 +253,7 @@ static const USBEndpointConfig ep2config = { static const USBEndpointConfig ep3config = { USB_EP_MODE_TYPE_BULK | USB_EP_MODE_PACKET, NULL, + NULL, sduDataReceived, 0x0000, 0x0040, -- cgit v1.2.3 From e7e79a6ccb4f3e320b2b8b7bad1b14d65218641d Mon Sep 17 00:00:00 2001 From: gdisirio Date: Fri, 18 Mar 2011 18:38:08 +0000 Subject: License updated. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@2827 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- testhal/STM32/USB_CDC/main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'testhal/STM32/USB_CDC/main.c') diff --git a/testhal/STM32/USB_CDC/main.c b/testhal/STM32/USB_CDC/main.c index 6f4416364..23962c496 100644 --- a/testhal/STM32/USB_CDC/main.c +++ b/testhal/STM32/USB_CDC/main.c @@ -1,5 +1,6 @@ /* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010 Giovanni Di Sirio. + ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, + 2011 Giovanni Di Sirio. This file is part of ChibiOS/RT. -- cgit v1.2.3 From de877486efb49378065f769ff423eef19ceb12e6 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Sat, 9 Apr 2011 15:10:15 +0000 Subject: Fixed bug 3276379. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@2872 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- testhal/STM32/USB_CDC/main.c | 134 +++++++++++++++++++++++++++++++++---------- 1 file changed, 104 insertions(+), 30 deletions(-) (limited to 'testhal/STM32/USB_CDC/main.c') diff --git a/testhal/STM32/USB_CDC/main.c b/testhal/STM32/USB_CDC/main.c index 23962c496..6d8994c8d 100644 --- a/testhal/STM32/USB_CDC/main.c +++ b/testhal/STM32/USB_CDC/main.c @@ -18,11 +18,15 @@ along with this program. If not, see . */ +#include +#include + #include "ch.h" #include "hal.h" #include "test.h" #include "usb_cdc.h" +#include "shell.h" /*===========================================================================*/ /* USB related stuff. */ @@ -305,6 +309,97 @@ static const SerialUSBConfig serusbcfg = { } }; +/*===========================================================================*/ +/* Command line related. */ +/*===========================================================================*/ + +#define SHELL_WA_SIZE THD_WA_SIZE(2048) +#define TEST_WA_SIZE THD_WA_SIZE(256) + +static void cmd_mem(BaseChannel *chp, int argc, char *argv[]) { + size_t n, size; + char buf[52]; + + (void)argv; + if (argc > 0) { + shellPrintLine(chp, "Usage: mem"); + return; + } + n = chHeapStatus(NULL, &size); + siprintf(buf, "core free memory : %u bytes", chCoreStatus()); + shellPrintLine(chp, buf); + siprintf(buf, "heap fragments : %u", n); + shellPrintLine(chp, buf); + siprintf(buf, "heap free total : %u bytes", size); + shellPrintLine(chp, buf); +} + +static void cmd_threads(BaseChannel *chp, int argc, char *argv[]) { + static const char *states[] = { + "READY", + "CURRENT", + "SUSPENDED", + "WTSEM", + "WTMTX", + "WTCOND", + "SLEEPING", + "WTEXIT", + "WTOREVT", + "WTANDEVT", + "SNDMSGQ", + "SNDMSG", + "WTMSG", + "FINAL" + }; + Thread *tp; + char buf[60]; + + (void)argv; + if (argc > 0) { + shellPrintLine(chp, "Usage: threads"); + return; + } + shellPrintLine(chp, " addr stack prio refs state time"); + tp = chRegFirstThread(); + do { + siprintf(buf, "%8lx %8lx %4u %4i %9s %u", + (uint32_t)tp, (uint32_t)tp->p_ctx.r13, + (unsigned int)tp->p_prio, tp->p_refs - 1, + states[tp->p_state], (unsigned int)tp->p_time); + shellPrintLine(chp, buf); + tp = chRegNextThread(tp); + } while (tp != NULL); +} + +static void cmd_test(BaseChannel *chp, int argc, char *argv[]) { + Thread *tp; + + (void)argv; + if (argc > 0) { + shellPrintLine(chp, "Usage: test"); + return; + } + tp = chThdCreateFromHeap(NULL, TEST_WA_SIZE, chThdGetPriority(), + TestThread, chp); + if (tp == NULL) { + shellPrintLine(chp, "out of memory"); + return; + } + chThdWait(tp); +} + +static const ShellCommand commands[] = { + {"mem", cmd_mem}, + {"threads", cmd_threads}, + {"test", cmd_test}, + {NULL, NULL} +}; + +static const ShellConfig shell_cfg1 = { + (BaseChannel *)&SDU1, + commands +}; + /*===========================================================================*/ /* Generic code. */ /*===========================================================================*/ @@ -324,31 +419,11 @@ static msg_t Thread1(void *arg) { } } -/* - * USB CDC loopback thread. - */ -static WORKING_AREA(waThread2, 256); -static msg_t Thread2(void *arg) { - SerialUSBDriver *sdup = arg; - EventListener el; - - chEvtRegisterMask(chIOGetEventSource(&SDU1), &el, 1); - while (TRUE) { - chEvtWaitAny(ALL_EVENTS); - if (chOQIsEmptyI(&SDU1.oqueue)) { - uint8_t buffer[0x40]; - size_t n = chIQReadTimeout(&sdup->iqueue, buffer, - sizeof(buffer), TIME_IMMEDIATE); - if (n > 0) - chOQWriteTimeout(&sdup->oqueue, buffer, n, TIME_IMMEDIATE); - } - } -} - /* * Application entry point. */ int main(void) { + Thread *shelltp = NULL; /* * System initializations. @@ -368,27 +443,26 @@ int main(void) { palClearPad(GPIOC, GPIOC_USB_DISC); /* - * Activates the serial driver 2 using the driver default configuration. + * Shell manager initialization. */ - sdStart(&SD2, NULL); + shellInit(); /* * Creates the blinker thread. */ chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - /* - * Creates the USB CDC loopback thread. - */ - chThdCreateStatic(waThread2, sizeof(waThread2), NORMALPRIO, Thread2, &SDU1); - /* * Normal main() thread activity, in this demo it does nothing except * sleeping in a loop and check the button state. */ while (TRUE) { - if (palReadPad(IOPORT1, GPIOA_BUTTON)) - TestThread(&SD2); + if (!shelltp && (SDU1.config->usbp->state == USB_ACTIVE)) + shelltp = shellCreate(&shell_cfg1, SHELL_WA_SIZE, NORMALPRIO); + else if (chThdTerminated(shelltp)) { + chThdRelease(shelltp); /* Recovers memory of the previous shell. */ + shelltp = NULL; /* Triggers spawning of a new shell. */ + } chThdSleepMilliseconds(1000); } } -- cgit v1.2.3