aboutsummaryrefslogtreecommitdiffstats
path: root/os
diff options
context:
space:
mode:
authorgdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2011-02-12 11:54:15 +0000
committergdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2011-02-12 11:54:15 +0000
commitd749ecc10a40b21a22b3e7ab14ff9861fabe4685 (patch)
tree330febe05c9be6fc7821bcbcd03488554227a208 /os
parent2f003bd7214c54560500b281661281a5c6903cee (diff)
downloadChibiOS-d749ecc10a40b21a22b3e7ab14ff9861fabe4685.tar.gz
ChibiOS-d749ecc10a40b21a22b3e7ab14ff9861fabe4685.tar.bz2
ChibiOS-d749ecc10a40b21a22b3e7ab14ff9861fabe4685.zip
RAM optimization to the USB driver.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@2732 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'os')
-rw-r--r--os/hal/include/usb.h4
-rw-r--r--os/hal/platforms/STM32/usb_lld.c10
-rw-r--r--os/hal/platforms/STM32/usb_lld.h17
-rw-r--r--os/hal/src/serial_usb.c4
-rw-r--r--os/hal/src/usb.c32
5 files changed, 36 insertions, 31 deletions
diff --git a/os/hal/include/usb.h b/os/hal/include/usb.h
index c6c5d57cf..7f46e46f5 100644
--- a/os/hal/include/usb.h
+++ b/os/hal/include/usb.h
@@ -242,7 +242,7 @@ typedef const USBDescriptor * (*usbgetdescriptor_t)(USBDriver *usbp,
*
* @iclass
*/
-#define usbGetTransmitStatusI(usbp, ep) (usbp)->ep[ep]->transmitting
+#define usbGetTransmitStatusI(usbp, ep) ((usbp)->transmitting & (1 << (ep)))
/**
* @brief Returns the status of an OUT endpoint.
@@ -255,7 +255,7 @@ typedef const USBDescriptor * (*usbgetdescriptor_t)(USBDriver *usbp,
*
* @iclass
*/
-#define usbGetReceiveStatusI(usbp, ep) (usbp)->ep[ep]->receiving
+#define usbGetReceiveStatusI(usbp, ep) ((usbp)->receiving & (1 << (ep)))
/**
* @brief Request transfer setup.
diff --git a/os/hal/platforms/STM32/usb_lld.c b/os/hal/platforms/STM32/usb_lld.c
index fa78879c6..b0d356bcb 100644
--- a/os/hal/platforms/STM32/usb_lld.c
+++ b/os/hal/platforms/STM32/usb_lld.c
@@ -181,7 +181,7 @@ CH_IRQ_HANDLER(USB_LP_IRQHandler) {
EPR_CLEAR_CTR_TX(ep);
if (epcp->flags & USB_EP_FLAGS_IN_PACKET_MODE) {
/* Packet mode, just invokes the callback.*/
- (usbp)->ep[ep]->transmitting = FALSE;
+ (usbp)->transmitting &= ~((uint16_t)(1 << ep));
epcp->in_cb(usbp, ep);
}
else {
@@ -200,7 +200,7 @@ CH_IRQ_HANDLER(USB_LP_IRQHandler) {
}
else {
/* Transfer completed, invokes the callback.*/
- (usbp)->ep[ep]->transmitting = FALSE;
+ (usbp)->transmitting &= ~((uint16_t)(1 << ep));
epcp->in_cb(usbp, ep);
}
}
@@ -210,7 +210,7 @@ CH_IRQ_HANDLER(USB_LP_IRQHandler) {
/* OUT endpoint, receive.*/
if (epcp->flags & USB_EP_FLAGS_OUT_PACKET_MODE) {
/* Packet mode, just invokes the callback.*/
- (usbp)->ep[ep]->receiving = FALSE;
+ (usbp)->receiving &= ~((uint16_t)(1 << ep));
epcp->out_cb(usbp, ep);
}
else {
@@ -233,7 +233,7 @@ CH_IRQ_HANDLER(USB_LP_IRQHandler) {
}
else {
/* Transfer completed, invokes the callback.*/
- (usbp)->ep[ep]->receiving = FALSE;
+ (usbp)->receiving &= ~((uint16_t)(1 << ep));
epcp->out_cb(usbp, ep);
}
}
@@ -398,7 +398,7 @@ void usb_lld_init_endpoint(USBDriver *usbp, usbep_t ep) {
start ready to accept data else it must start in NAK mode.*/
if (epcp->out_cb) {
if (epcp->flags & USB_EP_FLAGS_OUT_PACKET_MODE) {
- usbp->ep[ep]->receiving = TRUE;
+ usbp->receiving |= ((uint16_t)(1 << ep));
epr |= EPR_STAT_RX_VALID;
}
else
diff --git a/os/hal/platforms/STM32/usb_lld.h b/os/hal/platforms/STM32/usb_lld.h
index 6d131796e..4eebda951 100644
--- a/os/hal/platforms/STM32/usb_lld.h
+++ b/os/hal/platforms/STM32/usb_lld.h
@@ -161,15 +161,6 @@ typedef struct {
*/
const USBEndpointConfig *config;
/**
- * @brief @p TRUE if transmitting else @p FALSE.
- */
- uint8_t transmitting;
- /**
- * @brief @p TRUE if receiving else @p FALSE.
- */
- uint8_t receiving;
- /* End of the mandatory fields.*/
- /**
* @brief Number of packets to receive.
*/
uint16_t rxpkts;
@@ -244,6 +235,14 @@ struct USBDriver {
*/
void *param;
/**
+ * @brief Bit map of the transmitting IN endpoints.
+ */
+ uint16_t transmitting;
+ /**
+ * @brief Bit map of the receiving OUT endpoints.
+ */
+ uint16_t receiving;
+ /**
* @brief Active endpoints configurations.
*/
USBEndpointState *ep[USB_MAX_ENDPOINTS + 1];
diff --git a/os/hal/src/serial_usb.c b/os/hal/src/serial_usb.c
index 430218edb..b17669c04 100644
--- a/os/hal/src/serial_usb.c
+++ b/os/hal/src/serial_usb.c
@@ -124,7 +124,7 @@ static void inotify(GenericQueue *qp) {
if (n != USB_ENDPOINT_BUSY) {
sdup->iqueue.q_rdptr = sdup->iqueue.q_buffer;
chSemSetCounterI(&sdup->iqueue.q_sem, n);
- chIOAddFlagsI(sdup, IO_INPUT_AVAILABLE);
+// chIOAddFlagsI(sdup, IO_INPUT_AVAILABLE);
}
}
}
@@ -143,7 +143,7 @@ static void onotify(GenericQueue *qp) {
if (n != USB_ENDPOINT_BUSY) {
sdup->oqueue.q_wrptr = sdup->oqueue.q_buffer;
chSemSetCounterI(&sdup->oqueue.q_sem, SERIAL_USB_BUFFERS_SIZE);
- chIOAddFlagsI(sdup, IO_OUTPUT_EMPTY);
+// chIOAddFlagsI(sdup, IO_OUTPUT_EMPTY);
}
}
diff --git a/os/hal/src/usb.c b/os/hal/src/usb.c
index 08fa52a3e..cbbe8f5b3 100644
--- a/os/hal/src/usb.c
+++ b/os/hal/src/usb.c
@@ -234,9 +234,11 @@ void usbInit(void) {
*/
void usbObjectInit(USBDriver *usbp) {
- usbp->state = USB_STOP;
- usbp->config = NULL;
- usbp->param = NULL;
+ usbp->state = USB_STOP;
+ usbp->config = NULL;
+ usbp->param = NULL;
+ usbp->transmitting = 0;
+ usbp->receiving = 0;
}
/**
@@ -358,10 +360,10 @@ void usbDisableEndpointsI(USBDriver *usbp) {
size_t usbReadPacketI(USBDriver *usbp, usbep_t ep,
uint8_t *buf, size_t n) {
- if (usbp->ep[ep]->receiving)
+ if (usbGetReceiveStatusI(usbp, ep))
return USB_ENDPOINT_BUSY;
- usbp->ep[ep]->receiving = TRUE;
+ usbp->receiving |= (1 << ep);
return usb_lld_read_packet(usbp, ep, buf, n);;
}
@@ -385,10 +387,10 @@ size_t usbReadPacketI(USBDriver *usbp, usbep_t ep,
size_t usbWritePacketI(USBDriver *usbp, usbep_t ep,
const uint8_t *buf, size_t n) {
- if (usbp->ep[ep]->transmitting)
+ if (usbGetTransmitStatusI(usbp, ep))
return USB_ENDPOINT_BUSY;
- usbp->ep[ep]->transmitting = TRUE;
+ usbp->transmitting |= (1 << ep);
usb_lld_write_packet(usbp, ep, buf, n);
return 0;
}
@@ -413,9 +415,10 @@ size_t usbWritePacketI(USBDriver *usbp, usbep_t ep,
bool_t usbStartReceiveI(USBDriver *usbp, usbep_t ep,
uint8_t *buf, size_t n) {
- if (usbp->ep[ep]->receiving)
+ if (usbGetReceiveStatusI(usbp, ep))
return TRUE;
- usbp->ep[ep]->receiving = TRUE;
+
+ usbp->receiving |= (1 << ep);
usb_lld_start_out(usbp, ep, buf, n);
return FALSE;
}
@@ -440,9 +443,10 @@ bool_t usbStartReceiveI(USBDriver *usbp, usbep_t ep,
bool_t usbStartTransmitI(USBDriver *usbp, usbep_t ep,
const uint8_t *buf, size_t n) {
- if (usbp->ep[ep]->transmitting)
+ if (usbGetTransmitStatusI(usbp, ep))
return TRUE;
- usbp->ep[ep]->transmitting = TRUE;
+
+ usbp->transmitting |= (1 << ep);
usb_lld_start_in(usbp, ep, buf, n);
return FALSE;
}
@@ -460,8 +464,9 @@ bool_t usbStartTransmitI(USBDriver *usbp, usbep_t ep,
*/
bool_t usbStallReceiveI(USBDriver *usbp, usbep_t ep) {
- if (usbp->ep[ep]->receiving)
+ if (usbGetReceiveStatusI(usbp, ep))
return TRUE;
+
usb_lld_stall_out(usbp, ep);
return FALSE;
}
@@ -479,8 +484,9 @@ bool_t usbStallReceiveI(USBDriver *usbp, usbep_t ep) {
*/
bool_t usbStallTransmitI(USBDriver *usbp, usbep_t ep) {
- if (usbp->ep[ep]->transmitting)
+ if (usbGetTransmitStatusI(usbp, ep))
return TRUE;
+
usb_lld_stall_in(usbp, ep);
return FALSE;
}