Updated serial_usb driver and demos.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@5637 35acf78f-673a-0410-8e92-d51de3d6d3f4master
parent
77bd97a9db
commit
53ebb098cb
|
@ -21,7 +21,6 @@
|
||||||
#include "hal.h"
|
#include "hal.h"
|
||||||
#include "test.h"
|
#include "test.h"
|
||||||
|
|
||||||
#include "usb_cdc.h"
|
|
||||||
#include "chprintf.h"
|
#include "chprintf.h"
|
||||||
#include "shell.h"
|
#include "shell.h"
|
||||||
|
|
||||||
|
@ -155,6 +154,13 @@ static FRESULT scan_files(BaseSequentialStream *chp, char *path) {
|
||||||
/* USB related stuff. */
|
/* USB related stuff. */
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Endpoints to be used for USBD1.
|
||||||
|
*/
|
||||||
|
#define USBD1_DATA_REQUEST_EP 1
|
||||||
|
#define USBD1_DATA_AVAILABLE_EP 1
|
||||||
|
#define USBD1_INTERRUPT_REQUEST_EP 2
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Serial over USB Driver structure.
|
* Serial over USB Driver structure.
|
||||||
*/
|
*/
|
||||||
|
@ -236,7 +242,7 @@ static const uint8_t vcom_configuration_descriptor_data[67] = {
|
||||||
USB_DESC_BYTE (0x01), /* bSlaveInterface0 (Data Class
|
USB_DESC_BYTE (0x01), /* bSlaveInterface0 (Data Class
|
||||||
Interface). */
|
Interface). */
|
||||||
/* Endpoint 2 Descriptor.*/
|
/* Endpoint 2 Descriptor.*/
|
||||||
USB_DESC_ENDPOINT (USB_CDC_INTERRUPT_REQUEST_EP|0x80,
|
USB_DESC_ENDPOINT (USBD1_INTERRUPT_REQUEST_EP|0x80,
|
||||||
0x03, /* bmAttributes (Interrupt). */
|
0x03, /* bmAttributes (Interrupt). */
|
||||||
0x0008, /* wMaxPacketSize. */
|
0x0008, /* wMaxPacketSize. */
|
||||||
0xFF), /* bInterval. */
|
0xFF), /* bInterval. */
|
||||||
|
@ -252,12 +258,12 @@ static const uint8_t vcom_configuration_descriptor_data[67] = {
|
||||||
4.7). */
|
4.7). */
|
||||||
0x00), /* iInterface. */
|
0x00), /* iInterface. */
|
||||||
/* Endpoint 3 Descriptor.*/
|
/* Endpoint 3 Descriptor.*/
|
||||||
USB_DESC_ENDPOINT (USB_CDC_DATA_AVAILABLE_EP, /* bEndpointAddress.*/
|
USB_DESC_ENDPOINT (USBD1_DATA_AVAILABLE_EP, /* bEndpointAddress.*/
|
||||||
0x02, /* bmAttributes (Bulk). */
|
0x02, /* bmAttributes (Bulk). */
|
||||||
0x0040, /* wMaxPacketSize. */
|
0x0040, /* wMaxPacketSize. */
|
||||||
0x00), /* bInterval. */
|
0x00), /* bInterval. */
|
||||||
/* Endpoint 1 Descriptor.*/
|
/* Endpoint 1 Descriptor.*/
|
||||||
USB_DESC_ENDPOINT (USB_CDC_DATA_REQUEST_EP|0x80, /* bEndpointAddress.*/
|
USB_DESC_ENDPOINT (USBD1_DATA_REQUEST_EP|0x80, /* bEndpointAddress.*/
|
||||||
0x02, /* bmAttributes (Bulk). */
|
0x02, /* bmAttributes (Bulk). */
|
||||||
0x0040, /* wMaxPacketSize. */
|
0x0040, /* wMaxPacketSize. */
|
||||||
0x00) /* bInterval. */
|
0x00) /* bInterval. */
|
||||||
|
@ -410,8 +416,8 @@ static void usb_event(USBDriver *usbp, usbevent_t event) {
|
||||||
/* Enables the endpoints specified into the configuration.
|
/* Enables the endpoints specified into the configuration.
|
||||||
Note, this callback is invoked from an ISR so I-Class functions
|
Note, this callback is invoked from an ISR so I-Class functions
|
||||||
must be used.*/
|
must be used.*/
|
||||||
usbInitEndpointI(usbp, USB_CDC_DATA_REQUEST_EP, &ep1config);
|
usbInitEndpointI(usbp, USBD1_DATA_REQUEST_EP, &ep1config);
|
||||||
usbInitEndpointI(usbp, USB_CDC_INTERRUPT_REQUEST_EP, &ep2config);
|
usbInitEndpointI(usbp, USBD1_INTERRUPT_REQUEST_EP, &ep2config);
|
||||||
|
|
||||||
/* Resetting the state of the CDC subsystem.*/
|
/* Resetting the state of the CDC subsystem.*/
|
||||||
sduConfigureHookI(usbp);
|
sduConfigureHookI(usbp);
|
||||||
|
@ -442,7 +448,10 @@ static const USBConfig usbcfg = {
|
||||||
* Serial over USB driver configuration.
|
* Serial over USB driver configuration.
|
||||||
*/
|
*/
|
||||||
static const SerialUSBConfig serusbcfg = {
|
static const SerialUSBConfig serusbcfg = {
|
||||||
&USBD1
|
&USBD1,
|
||||||
|
USBD1_DATA_REQUEST_EP,
|
||||||
|
USBD1_DATA_AVAILABLE_EP,
|
||||||
|
USBD1_INTERRUPT_REQUEST_EP
|
||||||
};
|
};
|
||||||
|
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
|
@ -277,7 +277,7 @@
|
||||||
* USB driver system settings.
|
* USB driver system settings.
|
||||||
*/
|
*/
|
||||||
#define STM32_USB_USE_OTG1 TRUE
|
#define STM32_USB_USE_OTG1 TRUE
|
||||||
#define STM32_USB_USE_OTG2 FALSE
|
#define STM32_USB_USE_OTG2 TRUE
|
||||||
#define STM32_USB_OTG1_IRQ_PRIORITY 14
|
#define STM32_USB_OTG1_IRQ_PRIORITY 14
|
||||||
#define STM32_USB_OTG2_IRQ_PRIORITY 14
|
#define STM32_USB_OTG2_IRQ_PRIORITY 14
|
||||||
#define STM32_USB_OTG1_RX_FIFO_SIZE 512
|
#define STM32_USB_OTG1_RX_FIFO_SIZE 512
|
||||||
|
|
|
@ -35,6 +35,46 @@
|
||||||
/* Driver constants. */
|
/* Driver constants. */
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name CDC specific messages.
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define CDC_SEND_ENCAPSULATED_COMMAND 0x00
|
||||||
|
#define CDC_GET_ENCAPSULATED_RESPONSE 0x01
|
||||||
|
#define CDC_SET_COMM_FEATURE 0x02
|
||||||
|
#define CDC_GET_COMM_FEATURE 0x03
|
||||||
|
#define CDC_CLEAR_COMM_FEATURE 0x04
|
||||||
|
#define CDC_SET_AUX_LINE_STATE 0x10
|
||||||
|
#define CDC_SET_HOOK_STATE 0x11
|
||||||
|
#define CDC_PULSE_SETUP 0x12
|
||||||
|
#define CDC_SEND_PULSE 0x13
|
||||||
|
#define CDC_SET_PULSE_TIME 0x14
|
||||||
|
#define CDC_RING_AUX_JACK 0x15
|
||||||
|
#define CDC_SET_LINE_CODING 0x20
|
||||||
|
#define CDC_GET_LINE_CODING 0x21
|
||||||
|
#define CDC_SET_CONTROL_LINE_STATE 0x22
|
||||||
|
#define CDC_SEND_BREAK 0x23
|
||||||
|
#define CDC_SET_RINGER_PARMS 0x30
|
||||||
|
#define CDC_GET_RINGER_PARMS 0x31
|
||||||
|
#define CDC_SET_OPERATION_PARMS 0x32
|
||||||
|
#define CDC_GET_OPERATION_PARMS 0x33
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name Line Control bit definitions.
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define LC_STOP_1 0
|
||||||
|
#define LC_STOP_1P5 1
|
||||||
|
#define LC_STOP_2 2
|
||||||
|
|
||||||
|
#define LC_PARITY_NONE 0
|
||||||
|
#define LC_PARITY_ODD 1
|
||||||
|
#define LC_PARITY_EVEN 2
|
||||||
|
#define LC_PARITY_MARK 3
|
||||||
|
#define LC_PARITY_SPACE 4
|
||||||
|
/** @} */
|
||||||
|
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
/* Driver pre-compile time settings. */
|
/* Driver pre-compile time settings. */
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
@ -68,6 +108,16 @@
|
||||||
/* Driver data structures and types. */
|
/* Driver data structures and types. */
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Type of Line Coding structure.
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
uint8_t dwDTERate[4];
|
||||||
|
uint8_t bCharFormat;
|
||||||
|
uint8_t bParityType;
|
||||||
|
uint8_t bDataBits;
|
||||||
|
} cdc_linecoding_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Driver state machine possible states.
|
* @brief Driver state machine possible states.
|
||||||
*/
|
*/
|
||||||
|
@ -92,6 +142,18 @@ typedef struct {
|
||||||
* @brief USB driver to use.
|
* @brief USB driver to use.
|
||||||
*/
|
*/
|
||||||
USBDriver *usbp;
|
USBDriver *usbp;
|
||||||
|
/**
|
||||||
|
* @brief Bulk IN endpoint used for outgoing data transfer.
|
||||||
|
*/
|
||||||
|
usbep_t bulk_in;
|
||||||
|
/**
|
||||||
|
* @brief Bulk OUT endpoint used for incoming data transfer.
|
||||||
|
*/
|
||||||
|
usbep_t bulk_out;
|
||||||
|
/**
|
||||||
|
* @brief Interrupt IN endpoint used for notifications.
|
||||||
|
*/
|
||||||
|
usbep_t int_in;
|
||||||
} SerialUSBConfig;
|
} SerialUSBConfig;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,134 +0,0 @@
|
||||||
/*
|
|
||||||
ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
|
|
||||||
2011,2012,2013 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/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*-*
|
|
||||||
* @file usb_cdc.h
|
|
||||||
* @brief USB Communication Device Class support header.
|
|
||||||
*
|
|
||||||
* @addtogroup USB_CDC
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _USB_CDC_H_
|
|
||||||
#define _USB_CDC_H_
|
|
||||||
|
|
||||||
/*===========================================================================*/
|
|
||||||
/* Driver constants. */
|
|
||||||
/*===========================================================================*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @name CDC specific messages.
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
#define CDC_SEND_ENCAPSULATED_COMMAND 0x00
|
|
||||||
#define CDC_GET_ENCAPSULATED_RESPONSE 0x01
|
|
||||||
#define CDC_SET_COMM_FEATURE 0x02
|
|
||||||
#define CDC_GET_COMM_FEATURE 0x03
|
|
||||||
#define CDC_CLEAR_COMM_FEATURE 0x04
|
|
||||||
#define CDC_SET_AUX_LINE_STATE 0x10
|
|
||||||
#define CDC_SET_HOOK_STATE 0x11
|
|
||||||
#define CDC_PULSE_SETUP 0x12
|
|
||||||
#define CDC_SEND_PULSE 0x13
|
|
||||||
#define CDC_SET_PULSE_TIME 0x14
|
|
||||||
#define CDC_RING_AUX_JACK 0x15
|
|
||||||
#define CDC_SET_LINE_CODING 0x20
|
|
||||||
#define CDC_GET_LINE_CODING 0x21
|
|
||||||
#define CDC_SET_CONTROL_LINE_STATE 0x22
|
|
||||||
#define CDC_SEND_BREAK 0x23
|
|
||||||
#define CDC_SET_RINGER_PARMS 0x30
|
|
||||||
#define CDC_GET_RINGER_PARMS 0x31
|
|
||||||
#define CDC_SET_OPERATION_PARMS 0x32
|
|
||||||
#define CDC_GET_OPERATION_PARMS 0x33
|
|
||||||
/** @} */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @name Line Control bit definitions.
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
#define LC_STOP_1 0
|
|
||||||
#define LC_STOP_1P5 1
|
|
||||||
#define LC_STOP_2 2
|
|
||||||
|
|
||||||
#define LC_PARITY_NONE 0
|
|
||||||
#define LC_PARITY_ODD 1
|
|
||||||
#define LC_PARITY_EVEN 2
|
|
||||||
#define LC_PARITY_MARK 3
|
|
||||||
#define LC_PARITY_SPACE 4
|
|
||||||
/** @} */
|
|
||||||
|
|
||||||
/*===========================================================================*/
|
|
||||||
/* Driver pre-compile time settings. */
|
|
||||||
/*===========================================================================*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @name USB_CDC configuration options
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @brief Endpoint number for bulk IN.
|
|
||||||
*/
|
|
||||||
#if !defined(USB_CDC_DATA_REQUEST_EP) || defined(__DOXYGEN__)
|
|
||||||
#define USB_CDC_DATA_REQUEST_EP 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Endpoint number for bulk OUT.
|
|
||||||
*/
|
|
||||||
#if !defined(USB_CDC_DATA_AVAILABLE_EP) || defined(__DOXYGEN__)
|
|
||||||
#define USB_CDC_DATA_AVAILABLE_EP 1
|
|
||||||
#endif
|
|
||||||
/** @} */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Endpoint number for interrupt IN.
|
|
||||||
*/
|
|
||||||
#if !defined(USB_CDC_INTERRUPT_REQUEST_EP) || defined(__DOXYGEN__)
|
|
||||||
#define USB_CDC_INTERRUPT_REQUEST_EP 2
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*===========================================================================*/
|
|
||||||
/* Derived constants and error checks. */
|
|
||||||
/*===========================================================================*/
|
|
||||||
|
|
||||||
/*===========================================================================*/
|
|
||||||
/* Driver data structures and types. */
|
|
||||||
/*===========================================================================*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Type of Line Coding structure.
|
|
||||||
*/
|
|
||||||
typedef struct {
|
|
||||||
uint8_t dwDTERate[4];
|
|
||||||
uint8_t bCharFormat;
|
|
||||||
uint8_t bParityType;
|
|
||||||
uint8_t bDataBits;
|
|
||||||
} cdc_linecoding_t;
|
|
||||||
|
|
||||||
/*===========================================================================*/
|
|
||||||
/* Driver macros. */
|
|
||||||
/*===========================================================================*/
|
|
||||||
|
|
||||||
/*===========================================================================*/
|
|
||||||
/* External declarations. */
|
|
||||||
/*===========================================================================*/
|
|
||||||
|
|
||||||
#endif /* _USB_CDC_H_ */
|
|
||||||
|
|
||||||
/** @} */
|
|
|
@ -29,8 +29,6 @@
|
||||||
#include "ch.h"
|
#include "ch.h"
|
||||||
#include "hal.h"
|
#include "hal.h"
|
||||||
|
|
||||||
#include "usb_cdc.h"
|
|
||||||
|
|
||||||
#if HAL_USE_SERIAL_USB || defined(__DOXYGEN__)
|
#if HAL_USE_SERIAL_USB || defined(__DOXYGEN__)
|
||||||
|
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
@ -117,24 +115,25 @@ static void inotify(GenericQueue *qp) {
|
||||||
|
|
||||||
/* If the USB driver is not in the appropriate state then transactions
|
/* If the USB driver is not in the appropriate state then transactions
|
||||||
must not be started.*/
|
must not be started.*/
|
||||||
if (usbGetDriverStateI(sdup->config->usbp) != USB_ACTIVE)
|
if ((usbGetDriverStateI(sdup->config->usbp) != USB_ACTIVE) ||
|
||||||
|
(sdup->state != SDU_READY))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* If there is in the queue enough space to hold at least one packet and
|
/* If there is in the queue enough space to hold at least one packet and
|
||||||
a transaction is not yet started then a new transaction is started for
|
a transaction is not yet started then a new transaction is started for
|
||||||
the available space.*/
|
the available space.*/
|
||||||
maxsize = sdup->config->usbp->epc[USB_CDC_DATA_AVAILABLE_EP]->out_maxsize;
|
maxsize = sdup->config->usbp->epc[sdup->config->bulk_out]->out_maxsize;
|
||||||
if (!usbGetReceiveStatusI(sdup->config->usbp, USB_CDC_DATA_AVAILABLE_EP) &&
|
if (!usbGetReceiveStatusI(sdup->config->usbp, sdup->config->bulk_out) &&
|
||||||
((n = chIQGetEmptyI(&sdup->iqueue)) >= maxsize)) {
|
((n = chIQGetEmptyI(&sdup->iqueue)) >= maxsize)) {
|
||||||
chSysUnlock();
|
chSysUnlock();
|
||||||
|
|
||||||
n = (n / maxsize) * maxsize;
|
n = (n / maxsize) * maxsize;
|
||||||
usbPrepareQueuedReceive(sdup->config->usbp,
|
usbPrepareQueuedReceive(sdup->config->usbp,
|
||||||
USB_CDC_DATA_AVAILABLE_EP,
|
sdup->config->bulk_out,
|
||||||
&sdup->iqueue, n);
|
&sdup->iqueue, n);
|
||||||
|
|
||||||
chSysLock();
|
chSysLock();
|
||||||
usbStartReceiveI(sdup->config->usbp, USB_CDC_DATA_AVAILABLE_EP);
|
usbStartReceiveI(sdup->config->usbp, sdup->config->bulk_out);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -147,21 +146,22 @@ static void onotify(GenericQueue *qp) {
|
||||||
|
|
||||||
/* If the USB driver is not in the appropriate state then transactions
|
/* If the USB driver is not in the appropriate state then transactions
|
||||||
must not be started.*/
|
must not be started.*/
|
||||||
if (usbGetDriverStateI(sdup->config->usbp) != USB_ACTIVE)
|
if ((usbGetDriverStateI(sdup->config->usbp) != USB_ACTIVE) ||
|
||||||
|
(sdup->state != SDU_READY))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* If there is not an ongoing transaction and the output queue contains
|
/* If there is not an ongoing transaction and the output queue contains
|
||||||
data then a new transaction is started.*/
|
data then a new transaction is started.*/
|
||||||
if (!usbGetTransmitStatusI(sdup->config->usbp, USB_CDC_DATA_REQUEST_EP) &&
|
if (!usbGetTransmitStatusI(sdup->config->usbp, sdup->config->bulk_in) &&
|
||||||
((n = chOQGetFullI(&sdup->oqueue)) > 0)) {
|
((n = chOQGetFullI(&sdup->oqueue)) > 0)) {
|
||||||
chSysUnlock();
|
chSysUnlock();
|
||||||
|
|
||||||
usbPrepareQueuedTransmit(sdup->config->usbp,
|
usbPrepareQueuedTransmit(sdup->config->usbp,
|
||||||
USB_CDC_DATA_REQUEST_EP,
|
sdup->config->bulk_in,
|
||||||
&sdup->oqueue, n);
|
&sdup->oqueue, n);
|
||||||
|
|
||||||
chSysLock();
|
chSysLock();
|
||||||
usbStartTransmitI(sdup->config->usbp, USB_CDC_DATA_REQUEST_EP);
|
usbStartTransmitI(sdup->config->usbp, sdup->config->bulk_in);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -236,6 +236,12 @@ void sduStop(SerialUSBDriver *sdup) {
|
||||||
chDbgAssert((sdup->state == SDU_STOP) || (sdup->state == SDU_READY),
|
chDbgAssert((sdup->state == SDU_STOP) || (sdup->state == SDU_READY),
|
||||||
"sduStop(), #1",
|
"sduStop(), #1",
|
||||||
"invalid state");
|
"invalid state");
|
||||||
|
|
||||||
|
chIQResetI(&sdup->iqueue);
|
||||||
|
chOQResetI(&sdup->oqueue);
|
||||||
|
chSchRescheduleS();
|
||||||
|
chnAddFlagsI(sdup, CHN_DISCONNECTED);
|
||||||
|
|
||||||
sdup->state = SDU_STOP;
|
sdup->state = SDU_STOP;
|
||||||
chSysUnlock();
|
chSysUnlock();
|
||||||
}
|
}
|
||||||
|
@ -255,9 +261,9 @@ void sduConfigureHookI(USBDriver *usbp) {
|
||||||
chnAddFlagsI(sdup, CHN_CONNECTED);
|
chnAddFlagsI(sdup, CHN_CONNECTED);
|
||||||
|
|
||||||
/* Starts the first OUT transaction immediately.*/
|
/* Starts the first OUT transaction immediately.*/
|
||||||
usbPrepareQueuedReceive(usbp, USB_CDC_DATA_AVAILABLE_EP, &sdup->iqueue,
|
usbPrepareQueuedReceive(usbp, sdup->config->bulk_out, &sdup->iqueue,
|
||||||
usbp->epc[USB_CDC_DATA_AVAILABLE_EP]->out_maxsize);
|
usbp->epc[sdup->config->bulk_out]->out_maxsize);
|
||||||
usbStartReceiveI(usbp, USB_CDC_DATA_AVAILABLE_EP);
|
usbStartReceiveI(usbp, sdup->config->bulk_out);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -308,7 +314,8 @@ void sduDataTransmitted(USBDriver *usbp, usbep_t ep) {
|
||||||
size_t n;
|
size_t n;
|
||||||
SerialUSBDriver *sdup = usbp->param;
|
SerialUSBDriver *sdup = usbp->param;
|
||||||
|
|
||||||
(void)ep;
|
if (sdup->state != SDU_READY)
|
||||||
|
return;
|
||||||
|
|
||||||
chSysLockFromIsr();
|
chSysLockFromIsr();
|
||||||
chnAddFlagsI(sdup, CHN_OUTPUT_EMPTY);
|
chnAddFlagsI(sdup, CHN_OUTPUT_EMPTY);
|
||||||
|
@ -353,14 +360,15 @@ void sduDataReceived(USBDriver *usbp, usbep_t ep) {
|
||||||
size_t n, maxsize;
|
size_t n, maxsize;
|
||||||
SerialUSBDriver *sdup = usbp->param;
|
SerialUSBDriver *sdup = usbp->param;
|
||||||
|
|
||||||
(void)ep;
|
if (sdup->state != SDU_READY)
|
||||||
|
return;
|
||||||
|
|
||||||
chSysLockFromIsr();
|
chSysLockFromIsr();
|
||||||
chnAddFlagsI(sdup, CHN_INPUT_AVAILABLE);
|
chnAddFlagsI(sdup, CHN_INPUT_AVAILABLE);
|
||||||
|
|
||||||
/* Writes to the input queue can only happen when there is enough space
|
/* Writes to the input queue can only happen when there is enough space
|
||||||
to hold at least one packet.*/
|
to hold at least one packet.*/
|
||||||
maxsize = usbp->epc[USB_CDC_DATA_AVAILABLE_EP]->out_maxsize;
|
maxsize = usbp->epc[ep]->out_maxsize;
|
||||||
if ((n = chIQGetEmptyI(&sdup->iqueue)) >= maxsize) {
|
if ((n = chIQGetEmptyI(&sdup->iqueue)) >= maxsize) {
|
||||||
/* The endpoint cannot be busy, we are in the context of the callback,
|
/* The endpoint cannot be busy, we are in the context of the callback,
|
||||||
so a packet is in the buffer for sure.*/
|
so a packet is in the buffer for sure.*/
|
||||||
|
|
|
@ -21,7 +21,6 @@
|
||||||
#include "hal.h"
|
#include "hal.h"
|
||||||
#include "test.h"
|
#include "test.h"
|
||||||
|
|
||||||
#include "usb_cdc.h"
|
|
||||||
#include "shell.h"
|
#include "shell.h"
|
||||||
#include "chprintf.h"
|
#include "chprintf.h"
|
||||||
|
|
||||||
|
@ -29,6 +28,13 @@
|
||||||
/* USB related stuff. */
|
/* USB related stuff. */
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Endpoints to be used for USBD1.
|
||||||
|
*/
|
||||||
|
#define USBD1_DATA_REQUEST_EP 1
|
||||||
|
#define USBD1_DATA_AVAILABLE_EP 1
|
||||||
|
#define USBD1_INTERRUPT_REQUEST_EP 2
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Serial over USB Driver structure.
|
* Serial over USB Driver structure.
|
||||||
*/
|
*/
|
||||||
|
@ -110,7 +116,7 @@ static const uint8_t vcom_configuration_descriptor_data[67] = {
|
||||||
USB_DESC_BYTE (0x01), /* bSlaveInterface0 (Data Class
|
USB_DESC_BYTE (0x01), /* bSlaveInterface0 (Data Class
|
||||||
Interface). */
|
Interface). */
|
||||||
/* Endpoint 2 Descriptor.*/
|
/* Endpoint 2 Descriptor.*/
|
||||||
USB_DESC_ENDPOINT (USB_CDC_INTERRUPT_REQUEST_EP|0x80,
|
USB_DESC_ENDPOINT (USBD1_INTERRUPT_REQUEST_EP|0x80,
|
||||||
0x03, /* bmAttributes (Interrupt). */
|
0x03, /* bmAttributes (Interrupt). */
|
||||||
0x0008, /* wMaxPacketSize. */
|
0x0008, /* wMaxPacketSize. */
|
||||||
0xFF), /* bInterval. */
|
0xFF), /* bInterval. */
|
||||||
|
@ -126,12 +132,12 @@ static const uint8_t vcom_configuration_descriptor_data[67] = {
|
||||||
4.7). */
|
4.7). */
|
||||||
0x00), /* iInterface. */
|
0x00), /* iInterface. */
|
||||||
/* Endpoint 3 Descriptor.*/
|
/* Endpoint 3 Descriptor.*/
|
||||||
USB_DESC_ENDPOINT (USB_CDC_DATA_AVAILABLE_EP, /* bEndpointAddress.*/
|
USB_DESC_ENDPOINT (USBD1_DATA_AVAILABLE_EP, /* bEndpointAddress.*/
|
||||||
0x02, /* bmAttributes (Bulk). */
|
0x02, /* bmAttributes (Bulk). */
|
||||||
0x0040, /* wMaxPacketSize. */
|
0x0040, /* wMaxPacketSize. */
|
||||||
0x00), /* bInterval. */
|
0x00), /* bInterval. */
|
||||||
/* Endpoint 1 Descriptor.*/
|
/* Endpoint 1 Descriptor.*/
|
||||||
USB_DESC_ENDPOINT (USB_CDC_DATA_REQUEST_EP|0x80, /* bEndpointAddress.*/
|
USB_DESC_ENDPOINT (USBD1_DATA_REQUEST_EP|0x80, /* bEndpointAddress.*/
|
||||||
0x02, /* bmAttributes (Bulk). */
|
0x02, /* bmAttributes (Bulk). */
|
||||||
0x0040, /* wMaxPacketSize. */
|
0x0040, /* wMaxPacketSize. */
|
||||||
0x00) /* bInterval. */
|
0x00) /* bInterval. */
|
||||||
|
@ -284,8 +290,8 @@ static void usb_event(USBDriver *usbp, usbevent_t event) {
|
||||||
/* Enables the endpoints specified into the configuration.
|
/* Enables the endpoints specified into the configuration.
|
||||||
Note, this callback is invoked from an ISR so I-Class functions
|
Note, this callback is invoked from an ISR so I-Class functions
|
||||||
must be used.*/
|
must be used.*/
|
||||||
usbInitEndpointI(usbp, USB_CDC_DATA_REQUEST_EP, &ep1config);
|
usbInitEndpointI(usbp, USBD1_DATA_REQUEST_EP, &ep1config);
|
||||||
usbInitEndpointI(usbp, USB_CDC_INTERRUPT_REQUEST_EP, &ep2config);
|
usbInitEndpointI(usbp, USBD1_INTERRUPT_REQUEST_EP, &ep2config);
|
||||||
|
|
||||||
/* Resetting the state of the CDC subsystem.*/
|
/* Resetting the state of the CDC subsystem.*/
|
||||||
sduConfigureHookI(usbp);
|
sduConfigureHookI(usbp);
|
||||||
|
@ -316,7 +322,10 @@ static const USBConfig usbcfg = {
|
||||||
* Serial over USB driver configuration.
|
* Serial over USB driver configuration.
|
||||||
*/
|
*/
|
||||||
static const SerialUSBConfig serusbcfg = {
|
static const SerialUSBConfig serusbcfg = {
|
||||||
&USBD1
|
&USBD1,
|
||||||
|
USBD1_DATA_REQUEST_EP,
|
||||||
|
USBD1_DATA_AVAILABLE_EP,
|
||||||
|
USBD1_INTERRUPT_REQUEST_EP
|
||||||
};
|
};
|
||||||
|
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
|
@ -21,7 +21,6 @@
|
||||||
#include "hal.h"
|
#include "hal.h"
|
||||||
#include "test.h"
|
#include "test.h"
|
||||||
|
|
||||||
#include "usb_cdc.h"
|
|
||||||
#include "shell.h"
|
#include "shell.h"
|
||||||
#include "chprintf.h"
|
#include "chprintf.h"
|
||||||
|
|
||||||
|
@ -29,6 +28,13 @@
|
||||||
/* USB related stuff. */
|
/* USB related stuff. */
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Endpoints to be used for USBD1.
|
||||||
|
*/
|
||||||
|
#define USBD1_DATA_REQUEST_EP 1
|
||||||
|
#define USBD1_DATA_AVAILABLE_EP 1
|
||||||
|
#define USBD1_INTERRUPT_REQUEST_EP 2
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Serial over USB Driver structure.
|
* Serial over USB Driver structure.
|
||||||
*/
|
*/
|
||||||
|
@ -110,7 +116,7 @@ static const uint8_t vcom_configuration_descriptor_data[67] = {
|
||||||
USB_DESC_BYTE (0x01), /* bSlaveInterface0 (Data Class
|
USB_DESC_BYTE (0x01), /* bSlaveInterface0 (Data Class
|
||||||
Interface). */
|
Interface). */
|
||||||
/* Endpoint 2 Descriptor.*/
|
/* Endpoint 2 Descriptor.*/
|
||||||
USB_DESC_ENDPOINT (USB_CDC_INTERRUPT_REQUEST_EP|0x80,
|
USB_DESC_ENDPOINT (USBD1_INTERRUPT_REQUEST_EP|0x80,
|
||||||
0x03, /* bmAttributes (Interrupt). */
|
0x03, /* bmAttributes (Interrupt). */
|
||||||
0x0008, /* wMaxPacketSize. */
|
0x0008, /* wMaxPacketSize. */
|
||||||
0xFF), /* bInterval. */
|
0xFF), /* bInterval. */
|
||||||
|
@ -126,12 +132,12 @@ static const uint8_t vcom_configuration_descriptor_data[67] = {
|
||||||
4.7). */
|
4.7). */
|
||||||
0x00), /* iInterface. */
|
0x00), /* iInterface. */
|
||||||
/* Endpoint 3 Descriptor.*/
|
/* Endpoint 3 Descriptor.*/
|
||||||
USB_DESC_ENDPOINT (USB_CDC_DATA_AVAILABLE_EP, /* bEndpointAddress.*/
|
USB_DESC_ENDPOINT (USBD1_DATA_AVAILABLE_EP, /* bEndpointAddress.*/
|
||||||
0x02, /* bmAttributes (Bulk). */
|
0x02, /* bmAttributes (Bulk). */
|
||||||
0x0040, /* wMaxPacketSize. */
|
0x0040, /* wMaxPacketSize. */
|
||||||
0x00), /* bInterval. */
|
0x00), /* bInterval. */
|
||||||
/* Endpoint 1 Descriptor.*/
|
/* Endpoint 1 Descriptor.*/
|
||||||
USB_DESC_ENDPOINT (USB_CDC_DATA_REQUEST_EP|0x80, /* bEndpointAddress.*/
|
USB_DESC_ENDPOINT (USBD1_DATA_REQUEST_EP|0x80, /* bEndpointAddress.*/
|
||||||
0x02, /* bmAttributes (Bulk). */
|
0x02, /* bmAttributes (Bulk). */
|
||||||
0x0040, /* wMaxPacketSize. */
|
0x0040, /* wMaxPacketSize. */
|
||||||
0x00) /* bInterval. */
|
0x00) /* bInterval. */
|
||||||
|
@ -284,8 +290,8 @@ static void usb_event(USBDriver *usbp, usbevent_t event) {
|
||||||
/* Enables the endpoints specified into the configuration.
|
/* Enables the endpoints specified into the configuration.
|
||||||
Note, this callback is invoked from an ISR so I-Class functions
|
Note, this callback is invoked from an ISR so I-Class functions
|
||||||
must be used.*/
|
must be used.*/
|
||||||
usbInitEndpointI(usbp, USB_CDC_DATA_REQUEST_EP, &ep1config);
|
usbInitEndpointI(usbp, USBD1_DATA_REQUEST_EP, &ep1config);
|
||||||
usbInitEndpointI(usbp, USB_CDC_INTERRUPT_REQUEST_EP, &ep2config);
|
usbInitEndpointI(usbp, USBD1_INTERRUPT_REQUEST_EP, &ep2config);
|
||||||
|
|
||||||
/* Resetting the state of the CDC subsystem.*/
|
/* Resetting the state of the CDC subsystem.*/
|
||||||
sduConfigureHookI(usbp);
|
sduConfigureHookI(usbp);
|
||||||
|
@ -316,7 +322,10 @@ static const USBConfig usbcfg = {
|
||||||
* Serial over USB driver configuration.
|
* Serial over USB driver configuration.
|
||||||
*/
|
*/
|
||||||
static const SerialUSBConfig serusbcfg = {
|
static const SerialUSBConfig serusbcfg = {
|
||||||
&USBD1
|
&USBD1,
|
||||||
|
USBD1_DATA_REQUEST_EP,
|
||||||
|
USBD1_DATA_AVAILABLE_EP,
|
||||||
|
USBD1_INTERRUPT_REQUEST_EP
|
||||||
};
|
};
|
||||||
|
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
|
@ -21,7 +21,6 @@
|
||||||
#include "hal.h"
|
#include "hal.h"
|
||||||
#include "test.h"
|
#include "test.h"
|
||||||
|
|
||||||
#include "usb_cdc.h"
|
|
||||||
#include "shell.h"
|
#include "shell.h"
|
||||||
#include "chprintf.h"
|
#include "chprintf.h"
|
||||||
|
|
||||||
|
@ -29,6 +28,13 @@
|
||||||
/* USB related stuff. */
|
/* USB related stuff. */
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Endpoints to be used for USBD1.
|
||||||
|
*/
|
||||||
|
#define USBD1_DATA_REQUEST_EP 1
|
||||||
|
#define USBD1_DATA_AVAILABLE_EP 1
|
||||||
|
#define USBD1_INTERRUPT_REQUEST_EP 2
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* DP resistor control is not possible on the STM32F3-Discovery, using stubs
|
* DP resistor control is not possible on the STM32F3-Discovery, using stubs
|
||||||
* for the connection macros.
|
* for the connection macros.
|
||||||
|
@ -117,7 +123,7 @@ static const uint8_t vcom_configuration_descriptor_data[67] = {
|
||||||
USB_DESC_BYTE (0x01), /* bSlaveInterface0 (Data Class
|
USB_DESC_BYTE (0x01), /* bSlaveInterface0 (Data Class
|
||||||
Interface). */
|
Interface). */
|
||||||
/* Endpoint 2 Descriptor.*/
|
/* Endpoint 2 Descriptor.*/
|
||||||
USB_DESC_ENDPOINT (USB_CDC_INTERRUPT_REQUEST_EP|0x80,
|
USB_DESC_ENDPOINT (USBD1_INTERRUPT_REQUEST_EP|0x80,
|
||||||
0x03, /* bmAttributes (Interrupt). */
|
0x03, /* bmAttributes (Interrupt). */
|
||||||
0x0008, /* wMaxPacketSize. */
|
0x0008, /* wMaxPacketSize. */
|
||||||
0xFF), /* bInterval. */
|
0xFF), /* bInterval. */
|
||||||
|
@ -133,12 +139,12 @@ static const uint8_t vcom_configuration_descriptor_data[67] = {
|
||||||
4.7). */
|
4.7). */
|
||||||
0x00), /* iInterface. */
|
0x00), /* iInterface. */
|
||||||
/* Endpoint 3 Descriptor.*/
|
/* Endpoint 3 Descriptor.*/
|
||||||
USB_DESC_ENDPOINT (USB_CDC_DATA_AVAILABLE_EP, /* bEndpointAddress.*/
|
USB_DESC_ENDPOINT (USBD1_DATA_AVAILABLE_EP, /* bEndpointAddress.*/
|
||||||
0x02, /* bmAttributes (Bulk). */
|
0x02, /* bmAttributes (Bulk). */
|
||||||
0x0040, /* wMaxPacketSize. */
|
0x0040, /* wMaxPacketSize. */
|
||||||
0x00), /* bInterval. */
|
0x00), /* bInterval. */
|
||||||
/* Endpoint 1 Descriptor.*/
|
/* Endpoint 1 Descriptor.*/
|
||||||
USB_DESC_ENDPOINT (USB_CDC_DATA_REQUEST_EP|0x80, /* bEndpointAddress.*/
|
USB_DESC_ENDPOINT (USBD1_DATA_REQUEST_EP|0x80, /* bEndpointAddress.*/
|
||||||
0x02, /* bmAttributes (Bulk). */
|
0x02, /* bmAttributes (Bulk). */
|
||||||
0x0040, /* wMaxPacketSize. */
|
0x0040, /* wMaxPacketSize. */
|
||||||
0x00) /* bInterval. */
|
0x00) /* bInterval. */
|
||||||
|
@ -291,8 +297,8 @@ static void usb_event(USBDriver *usbp, usbevent_t event) {
|
||||||
/* Enables the endpoints specified into the configuration.
|
/* Enables the endpoints specified into the configuration.
|
||||||
Note, this callback is invoked from an ISR so I-Class functions
|
Note, this callback is invoked from an ISR so I-Class functions
|
||||||
must be used.*/
|
must be used.*/
|
||||||
usbInitEndpointI(usbp, USB_CDC_DATA_REQUEST_EP, &ep1config);
|
usbInitEndpointI(usbp, USBD1_DATA_REQUEST_EP, &ep1config);
|
||||||
usbInitEndpointI(usbp, USB_CDC_INTERRUPT_REQUEST_EP, &ep2config);
|
usbInitEndpointI(usbp, USBD1_INTERRUPT_REQUEST_EP, &ep2config);
|
||||||
|
|
||||||
/* Resetting the state of the CDC subsystem.*/
|
/* Resetting the state of the CDC subsystem.*/
|
||||||
sduConfigureHookI(usbp);
|
sduConfigureHookI(usbp);
|
||||||
|
@ -323,7 +329,10 @@ static const USBConfig usbcfg = {
|
||||||
* Serial over USB driver configuration.
|
* Serial over USB driver configuration.
|
||||||
*/
|
*/
|
||||||
static const SerialUSBConfig serusbcfg = {
|
static const SerialUSBConfig serusbcfg = {
|
||||||
&USBD1
|
&USBD1,
|
||||||
|
USBD1_DATA_REQUEST_EP,
|
||||||
|
USBD1_DATA_AVAILABLE_EP,
|
||||||
|
USBD1_INTERRUPT_REQUEST_EP
|
||||||
};
|
};
|
||||||
|
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
|
@ -21,7 +21,6 @@
|
||||||
#include "hal.h"
|
#include "hal.h"
|
||||||
#include "test.h"
|
#include "test.h"
|
||||||
|
|
||||||
#include "usb_cdc.h"
|
|
||||||
#include "shell.h"
|
#include "shell.h"
|
||||||
#include "chprintf.h"
|
#include "chprintf.h"
|
||||||
|
|
||||||
|
@ -29,6 +28,13 @@
|
||||||
/* USB related stuff. */
|
/* USB related stuff. */
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Endpoints to be used for USBD1.
|
||||||
|
*/
|
||||||
|
#define USBD1_DATA_REQUEST_EP 1
|
||||||
|
#define USBD1_DATA_AVAILABLE_EP 1
|
||||||
|
#define USBD1_INTERRUPT_REQUEST_EP 2
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* DP resistor control.
|
* DP resistor control.
|
||||||
*/
|
*/
|
||||||
|
@ -116,7 +122,7 @@ static const uint8_t vcom_configuration_descriptor_data[67] = {
|
||||||
USB_DESC_BYTE (0x01), /* bSlaveInterface0 (Data Class
|
USB_DESC_BYTE (0x01), /* bSlaveInterface0 (Data Class
|
||||||
Interface). */
|
Interface). */
|
||||||
/* Endpoint 2 Descriptor.*/
|
/* Endpoint 2 Descriptor.*/
|
||||||
USB_DESC_ENDPOINT (USB_CDC_INTERRUPT_REQUEST_EP|0x80,
|
USB_DESC_ENDPOINT (USBD1_INTERRUPT_REQUEST_EP|0x80,
|
||||||
0x03, /* bmAttributes (Interrupt). */
|
0x03, /* bmAttributes (Interrupt). */
|
||||||
0x0008, /* wMaxPacketSize. */
|
0x0008, /* wMaxPacketSize. */
|
||||||
0xFF), /* bInterval. */
|
0xFF), /* bInterval. */
|
||||||
|
@ -132,12 +138,12 @@ static const uint8_t vcom_configuration_descriptor_data[67] = {
|
||||||
4.7). */
|
4.7). */
|
||||||
0x00), /* iInterface. */
|
0x00), /* iInterface. */
|
||||||
/* Endpoint 3 Descriptor.*/
|
/* Endpoint 3 Descriptor.*/
|
||||||
USB_DESC_ENDPOINT (USB_CDC_DATA_AVAILABLE_EP, /* bEndpointAddress.*/
|
USB_DESC_ENDPOINT (USBD1_DATA_AVAILABLE_EP, /* bEndpointAddress.*/
|
||||||
0x02, /* bmAttributes (Bulk). */
|
0x02, /* bmAttributes (Bulk). */
|
||||||
0x0040, /* wMaxPacketSize. */
|
0x0040, /* wMaxPacketSize. */
|
||||||
0x00), /* bInterval. */
|
0x00), /* bInterval. */
|
||||||
/* Endpoint 1 Descriptor.*/
|
/* Endpoint 1 Descriptor.*/
|
||||||
USB_DESC_ENDPOINT (USB_CDC_DATA_REQUEST_EP|0x80, /* bEndpointAddress.*/
|
USB_DESC_ENDPOINT (USBD1_DATA_REQUEST_EP|0x80, /* bEndpointAddress.*/
|
||||||
0x02, /* bmAttributes (Bulk). */
|
0x02, /* bmAttributes (Bulk). */
|
||||||
0x0040, /* wMaxPacketSize. */
|
0x0040, /* wMaxPacketSize. */
|
||||||
0x00) /* bInterval. */
|
0x00) /* bInterval. */
|
||||||
|
@ -290,8 +296,8 @@ static void usb_event(USBDriver *usbp, usbevent_t event) {
|
||||||
/* Enables the endpoints specified into the configuration.
|
/* Enables the endpoints specified into the configuration.
|
||||||
Note, this callback is invoked from an ISR so I-Class functions
|
Note, this callback is invoked from an ISR so I-Class functions
|
||||||
must be used.*/
|
must be used.*/
|
||||||
usbInitEndpointI(usbp, USB_CDC_DATA_REQUEST_EP, &ep1config);
|
usbInitEndpointI(usbp, USBD1_DATA_REQUEST_EP, &ep1config);
|
||||||
usbInitEndpointI(usbp, USB_CDC_INTERRUPT_REQUEST_EP, &ep2config);
|
usbInitEndpointI(usbp, USBD1_INTERRUPT_REQUEST_EP, &ep2config);
|
||||||
|
|
||||||
/* Resetting the state of the CDC subsystem.*/
|
/* Resetting the state of the CDC subsystem.*/
|
||||||
sduConfigureHookI(usbp);
|
sduConfigureHookI(usbp);
|
||||||
|
@ -322,7 +328,10 @@ static const USBConfig usbcfg = {
|
||||||
* Serial over USB driver configuration.
|
* Serial over USB driver configuration.
|
||||||
*/
|
*/
|
||||||
static const SerialUSBConfig serusbcfg = {
|
static const SerialUSBConfig serusbcfg = {
|
||||||
&USBD1
|
&USBD1,
|
||||||
|
USBD1_DATA_REQUEST_EP,
|
||||||
|
USBD1_DATA_AVAILABLE_EP,
|
||||||
|
USBD1_INTERRUPT_REQUEST_EP
|
||||||
};
|
};
|
||||||
|
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
|
@ -21,7 +21,6 @@
|
||||||
#include "hal.h"
|
#include "hal.h"
|
||||||
#include "test.h"
|
#include "test.h"
|
||||||
|
|
||||||
#include "usb_cdc.h"
|
|
||||||
#include "shell.h"
|
#include "shell.h"
|
||||||
#include "chprintf.h"
|
#include "chprintf.h"
|
||||||
|
|
||||||
|
@ -29,10 +28,17 @@
|
||||||
/* USB related stuff. */
|
/* USB related stuff. */
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Endpoints to be used for USBD2.
|
||||||
|
*/
|
||||||
|
#define USBD2_DATA_REQUEST_EP 1
|
||||||
|
#define USBD2_DATA_AVAILABLE_EP 1
|
||||||
|
#define USBD2_INTERRUPT_REQUEST_EP 2
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Serial over USB Driver structure.
|
* Serial over USB Driver structure.
|
||||||
*/
|
*/
|
||||||
static SerialUSBDriver SDU1;
|
static SerialUSBDriver SDU2;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* USB Device Descriptor.
|
* USB Device Descriptor.
|
||||||
|
@ -110,7 +116,7 @@ static const uint8_t vcom_configuration_descriptor_data[67] = {
|
||||||
USB_DESC_BYTE (0x01), /* bSlaveInterface0 (Data Class
|
USB_DESC_BYTE (0x01), /* bSlaveInterface0 (Data Class
|
||||||
Interface). */
|
Interface). */
|
||||||
/* Endpoint 2 Descriptor.*/
|
/* Endpoint 2 Descriptor.*/
|
||||||
USB_DESC_ENDPOINT (USB_CDC_INTERRUPT_REQUEST_EP|0x80,
|
USB_DESC_ENDPOINT (USBD2_INTERRUPT_REQUEST_EP|0x80,
|
||||||
0x03, /* bmAttributes (Interrupt). */
|
0x03, /* bmAttributes (Interrupt). */
|
||||||
0x0008, /* wMaxPacketSize. */
|
0x0008, /* wMaxPacketSize. */
|
||||||
0xFF), /* bInterval. */
|
0xFF), /* bInterval. */
|
||||||
|
@ -126,12 +132,12 @@ static const uint8_t vcom_configuration_descriptor_data[67] = {
|
||||||
4.7). */
|
4.7). */
|
||||||
0x00), /* iInterface. */
|
0x00), /* iInterface. */
|
||||||
/* Endpoint 3 Descriptor.*/
|
/* Endpoint 3 Descriptor.*/
|
||||||
USB_DESC_ENDPOINT (USB_CDC_DATA_AVAILABLE_EP, /* bEndpointAddress.*/
|
USB_DESC_ENDPOINT (USBD2_DATA_AVAILABLE_EP, /* bEndpointAddress.*/
|
||||||
0x02, /* bmAttributes (Bulk). */
|
0x02, /* bmAttributes (Bulk). */
|
||||||
0x0040, /* wMaxPacketSize. */
|
0x0040, /* wMaxPacketSize. */
|
||||||
0x00), /* bInterval. */
|
0x00), /* bInterval. */
|
||||||
/* Endpoint 1 Descriptor.*/
|
/* Endpoint 1 Descriptor.*/
|
||||||
USB_DESC_ENDPOINT (USB_CDC_DATA_REQUEST_EP|0x80, /* bEndpointAddress.*/
|
USB_DESC_ENDPOINT (USBD2_DATA_REQUEST_EP|0x80, /* bEndpointAddress.*/
|
||||||
0x02, /* bmAttributes (Bulk). */
|
0x02, /* bmAttributes (Bulk). */
|
||||||
0x0040, /* wMaxPacketSize. */
|
0x0040, /* wMaxPacketSize. */
|
||||||
0x00) /* bInterval. */
|
0x00) /* bInterval. */
|
||||||
|
@ -284,8 +290,8 @@ static void usb_event(USBDriver *usbp, usbevent_t event) {
|
||||||
/* Enables the endpoints specified into the configuration.
|
/* Enables the endpoints specified into the configuration.
|
||||||
Note, this callback is invoked from an ISR so I-Class functions
|
Note, this callback is invoked from an ISR so I-Class functions
|
||||||
must be used.*/
|
must be used.*/
|
||||||
usbInitEndpointI(usbp, USB_CDC_DATA_REQUEST_EP, &ep1config);
|
usbInitEndpointI(usbp, USBD2_DATA_REQUEST_EP, &ep1config);
|
||||||
usbInitEndpointI(usbp, USB_CDC_INTERRUPT_REQUEST_EP, &ep2config);
|
usbInitEndpointI(usbp, USBD2_INTERRUPT_REQUEST_EP, &ep2config);
|
||||||
|
|
||||||
/* Resetting the state of the CDC subsystem.*/
|
/* Resetting the state of the CDC subsystem.*/
|
||||||
sduConfigureHookI(usbp);
|
sduConfigureHookI(usbp);
|
||||||
|
@ -316,7 +322,10 @@ static const USBConfig usbcfg = {
|
||||||
* Serial over USB driver configuration.
|
* Serial over USB driver configuration.
|
||||||
*/
|
*/
|
||||||
static const SerialUSBConfig serusbcfg = {
|
static const SerialUSBConfig serusbcfg = {
|
||||||
&USBD2
|
&USBD2,
|
||||||
|
USBD2_DATA_REQUEST_EP,
|
||||||
|
USBD2_DATA_AVAILABLE_EP,
|
||||||
|
USBD2_INTERRUPT_REQUEST_EP
|
||||||
};
|
};
|
||||||
|
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
@ -403,7 +412,7 @@ static void cmd_write(BaseSequentialStream *chp, int argc, char *argv[]) {
|
||||||
}
|
}
|
||||||
|
|
||||||
while (chnGetTimeout((BaseChannel *)chp, TIME_IMMEDIATE) == Q_TIMEOUT) {
|
while (chnGetTimeout((BaseChannel *)chp, TIME_IMMEDIATE) == Q_TIMEOUT) {
|
||||||
chSequentialStreamWrite(&SDU1, buf, sizeof buf - 1);
|
chSequentialStreamWrite(&SDU2, buf, sizeof buf - 1);
|
||||||
}
|
}
|
||||||
chprintf(chp, "\r\n\nstopped\r\n");
|
chprintf(chp, "\r\n\nstopped\r\n");
|
||||||
}
|
}
|
||||||
|
@ -417,7 +426,7 @@ static const ShellCommand commands[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static const ShellConfig shell_cfg1 = {
|
static const ShellConfig shell_cfg1 = {
|
||||||
(BaseSequentialStream *)&SDU1,
|
(BaseSequentialStream *)&SDU2,
|
||||||
commands
|
commands
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -463,8 +472,8 @@ int main(void) {
|
||||||
/*
|
/*
|
||||||
* Initializes a serial-over-USB CDC driver.
|
* Initializes a serial-over-USB CDC driver.
|
||||||
*/
|
*/
|
||||||
sduObjectInit(&SDU1);
|
sduObjectInit(&SDU2);
|
||||||
sduStart(&SDU1, &serusbcfg);
|
sduStart(&SDU2, &serusbcfg);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Activates the USB driver and then the USB bus pull-up on D+.
|
* Activates the USB driver and then the USB bus pull-up on D+.
|
||||||
|
@ -502,7 +511,7 @@ int main(void) {
|
||||||
* sleeping in a loop and check the button state.
|
* sleeping in a loop and check the button state.
|
||||||
*/
|
*/
|
||||||
while (TRUE) {
|
while (TRUE) {
|
||||||
if (!shelltp && (SDU1.config->usbp->state == USB_ACTIVE))
|
if (!shelltp && (SDU2.config->usbp->state == USB_ACTIVE))
|
||||||
shelltp = shellCreate(&shell_cfg1, SHELL_WA_SIZE, NORMALPRIO);
|
shelltp = shellCreate(&shell_cfg1, SHELL_WA_SIZE, NORMALPRIO);
|
||||||
else if (chThdTerminated(shelltp)) {
|
else if (chThdTerminated(shelltp)) {
|
||||||
chThdRelease(shelltp); /* Recovers memory of the previous shell. */
|
chThdRelease(shelltp); /* Recovers memory of the previous shell. */
|
||||||
|
|
Loading…
Reference in New Issue