aboutsummaryrefslogtreecommitdiffstats
path: root/os/hal
diff options
context:
space:
mode:
authorgdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2013-05-01 15:50:35 +0000
committergdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2013-05-01 15:50:35 +0000
commit11ecb1a7586ddaf6276a087d51de829b00d5f386 (patch)
tree4f5ad4b7ef204329156c779c6166bd8f70d5222c /os/hal
parentb920c0b7ff759436162a961fc97242473b1a9554 (diff)
downloadChibiOS-11ecb1a7586ddaf6276a087d51de829b00d5f386.tar.gz
ChibiOS-11ecb1a7586ddaf6276a087d51de829b00d5f386.tar.bz2
ChibiOS-11ecb1a7586ddaf6276a087d51de829b00d5f386.zip
Fixed problem with multiple SerialUSB instances.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@5651 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'os/hal')
-rw-r--r--os/hal/include/serial_usb.h2
-rw-r--r--os/hal/platforms/STM32/OTGv1/usb_lld.h19
-rw-r--r--os/hal/platforms/STM32/USBv1/usb_lld.h14
-rw-r--r--os/hal/src/serial_usb.c31
-rw-r--r--os/hal/src/usb.c6
-rw-r--r--os/hal/templates/usb_lld.h19
6 files changed, 69 insertions, 22 deletions
diff --git a/os/hal/include/serial_usb.h b/os/hal/include/serial_usb.h
index 3d2a7483a..28ab3a940 100644
--- a/os/hal/include/serial_usb.h
+++ b/os/hal/include/serial_usb.h
@@ -218,7 +218,7 @@ extern "C" {
void sduObjectInit(SerialUSBDriver *sdp);
void sduStart(SerialUSBDriver *sdup, const SerialUSBConfig *config);
void sduStop(SerialUSBDriver *sdup);
- void sduConfigureHookI(USBDriver *usbp);
+ void sduConfigureHookI(SerialUSBDriver *sdup);
bool_t sduRequestsHook(USBDriver *usbp);
void sduDataTransmitted(USBDriver *usbp, usbep_t ep);
void sduDataReceived(USBDriver *usbp, usbep_t ep);
diff --git a/os/hal/platforms/STM32/OTGv1/usb_lld.h b/os/hal/platforms/STM32/OTGv1/usb_lld.h
index 087d1cb01..570309750 100644
--- a/os/hal/platforms/STM32/OTGv1/usb_lld.h
+++ b/os/hal/platforms/STM32/OTGv1/usb_lld.h
@@ -364,11 +364,6 @@ struct USBDriver {
*/
const USBConfig *config;
/**
- * @brief Field available to user, it can be used to associate an
- * application-defined handler to the USB driver.
- */
- void *param;
- /**
* @brief Bit map of the transmitting IN endpoints.
*/
uint16_t transmitting;
@@ -381,6 +376,20 @@ struct USBDriver {
*/
const USBEndpointConfig *epc[USB_MAX_ENDPOINTS + 1];
/**
+ * @brief Fields available to user, it can be used to associate an
+ * application-defined handler to an IN endpoint.
+ * @note The base index is one, the endpoint zero does not have a
+ * reserved element in this array.
+ */
+ void *in_params[USB_MAX_ENDPOINTS];
+ /**
+ * @brief Fields available to user, it can be used to associate an
+ * application-defined handler to an OUT endpoint.
+ * @note The base index is one, the endpoint zero does not have a
+ * reserved element in this array.
+ */
+ void *out_params[USB_MAX_ENDPOINTS];
+ /**
* @brief Endpoint 0 state.
*/
usbep0state_t ep0state;
diff --git a/os/hal/platforms/STM32/USBv1/usb_lld.h b/os/hal/platforms/STM32/USBv1/usb_lld.h
index fbd44fafe..d4602f65f 100644
--- a/os/hal/platforms/STM32/USBv1/usb_lld.h
+++ b/os/hal/platforms/STM32/USBv1/usb_lld.h
@@ -302,6 +302,20 @@ struct USBDriver {
*/
const USBEndpointConfig *epc[USB_MAX_ENDPOINTS + 1];
/**
+ * @brief Fields available to user, it can be used to associate an
+ * application-defined handler to an IN endpoint.
+ * @note The base index is one, the endpoint zero does not have a
+ * reserved element in this array.
+ */
+ void *in_params[USB_MAX_ENDPOINTS];
+ /**
+ * @brief Fields available to user, it can be used to associate an
+ * application-defined handler to an OUT endpoint.
+ * @note The base index is one, the endpoint zero does not have a
+ * reserved element in this array.
+ */
+ void *out_params[USB_MAX_ENDPOINTS];
+ /**
* @brief Endpoint 0 state.
*/
usbep0state_t ep0state;
diff --git a/os/hal/src/serial_usb.c b/os/hal/src/serial_usb.c
index 37b1d3fe6..ff6e94b07 100644
--- a/os/hal/src/serial_usb.c
+++ b/os/hal/src/serial_usb.c
@@ -206,6 +206,7 @@ void sduObjectInit(SerialUSBDriver *sdup) {
* @api
*/
void sduStart(SerialUSBDriver *sdup, const SerialUSBConfig *config) {
+ USBDriver *usbp = config->usbp;
chDbgCheck(sdup != NULL, "sduStart");
@@ -213,8 +214,10 @@ void sduStart(SerialUSBDriver *sdup, const SerialUSBConfig *config) {
chDbgAssert((sdup->state == SDU_STOP) || (sdup->state == SDU_READY),
"sduStart(), #1",
"invalid state");
+ usbp->in_params[config->bulk_in - 1] = sdup;
+ usbp->out_params[config->bulk_out - 1] = sdup;
+ usbp->in_params[config->int_in - 1] = sdup;
sdup->config = config;
- config->usbp->param = sdup;
sdup->state = SDU_READY;
chSysUnlock();
}
@@ -229,32 +232,40 @@ void sduStart(SerialUSBDriver *sdup, const SerialUSBConfig *config) {
* @api
*/
void sduStop(SerialUSBDriver *sdup) {
+ USBDriver *usbp = sdup->config->usbp;
chDbgCheck(sdup != NULL, "sdStop");
chSysLock();
+
chDbgAssert((sdup->state == SDU_STOP) || (sdup->state == SDU_READY),
"sduStop(), #1",
"invalid state");
+ /* Driver in stopped state.*/
+ usbp->in_params[sdup->config->bulk_in - 1] = NULL;
+ usbp->out_params[sdup->config->bulk_out - 1] = NULL;
+ usbp->in_params[sdup->config->int_in - 1] = NULL;
+ sdup->state = SDU_STOP;
+
+ /* Queues reset in order to signal the driver stop to the application.*/
+ chnAddFlagsI(sdup, CHN_DISCONNECTED);
chIQResetI(&sdup->iqueue);
chOQResetI(&sdup->oqueue);
chSchRescheduleS();
- chnAddFlagsI(sdup, CHN_DISCONNECTED);
- sdup->state = SDU_STOP;
chSysUnlock();
}
/**
* @brief USB device configured handler.
*
- * @param[in] usbp pointer to the @p USBDriver object
+ * @param[in] sdup pointer to a @p SerialUSBDriver object
*
* @iclass
*/
-void sduConfigureHookI(USBDriver *usbp) {
- SerialUSBDriver *sdup = usbp->param;
+void sduConfigureHookI(SerialUSBDriver *sdup) {
+ USBDriver *usbp = sdup->config->usbp;
chIQResetI(&sdup->iqueue);
chOQResetI(&sdup->oqueue);
@@ -312,9 +323,9 @@ bool_t sduRequestsHook(USBDriver *usbp) {
*/
void sduDataTransmitted(USBDriver *usbp, usbep_t ep) {
size_t n;
- SerialUSBDriver *sdup = usbp->param;
+ SerialUSBDriver *sdup = usbp->in_params[ep - 1];
- if (sdup->state != SDU_READY)
+ if (sdup == NULL)
return;
chSysLockFromIsr();
@@ -358,9 +369,9 @@ void sduDataTransmitted(USBDriver *usbp, usbep_t ep) {
*/
void sduDataReceived(USBDriver *usbp, usbep_t ep) {
size_t n, maxsize;
- SerialUSBDriver *sdup = usbp->param;
+ SerialUSBDriver *sdup = usbp->out_params[ep - 1];
- if (sdup->state != SDU_READY)
+ if (sdup == NULL)
return;
chSysLockFromIsr();
diff --git a/os/hal/src/usb.c b/os/hal/src/usb.c
index 745b2d436..1da532abf 100644
--- a/os/hal/src/usb.c
+++ b/os/hal/src/usb.c
@@ -238,10 +238,14 @@ void usbInit(void) {
* @init
*/
void usbObjectInit(USBDriver *usbp) {
+ unsigned i;
usbp->state = USB_STOP;
usbp->config = NULL;
- usbp->param = NULL;
+ for (i = 0; i < USB_MAX_ENDPOINTS; i++) {
+ usbp->in_params[i] = NULL;
+ usbp->out_params[i] = NULL;
+ }
usbp->transmitting = 0;
usbp->receiving = 0;
}
diff --git a/os/hal/templates/usb_lld.h b/os/hal/templates/usb_lld.h
index 6d2f2348f..7dbf8b4b9 100644
--- a/os/hal/templates/usb_lld.h
+++ b/os/hal/templates/usb_lld.h
@@ -227,11 +227,6 @@ struct USBDriver {
*/
const USBConfig *config;
/**
- * @brief Field available to user, it can be used to associate an
- * application-defined handler to the USB driver.
- */
- void *param;
- /**
* @brief Bit map of the transmitting IN endpoints.
*/
uint16_t transmitting;
@@ -244,6 +239,20 @@ struct USBDriver {
*/
const USBEndpointConfig *epc[USB_MAX_ENDPOINTS + 1];
/**
+ * @brief Fields available to user, it can be used to associate an
+ * application-defined handler to an IN endpoint.
+ * @note The base index is one, the endpoint zero does not have a
+ * reserved element in this array.
+ */
+ void *in_params[USB_MAX_ENDPOINTS];
+ /**
+ * @brief Fields available to user, it can be used to associate an
+ * application-defined handler to an OUT endpoint.
+ * @note The base index is one, the endpoint zero does not have a
+ * reserved element in this array.
+ */
+ void *out_params[USB_MAX_ENDPOINTS];
+ /**
* @brief Endpoint 0 state.
*/
usbep0state_t ep0state;