aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarti Bolivar <mbolivar@leaflabs.com>2011-05-04 13:15:33 -0400
committerMarti Bolivar <mbolivar@leaflabs.com>2011-05-04 13:31:53 -0400
commitf3bcdd18d8f0b64cd8f17410b480b49315791544 (patch)
tree9bdcdcbd5aa976c0a407d0cbcb1316d824ab40a3
parent9ad170c63ddac17301566e69fe6a0e7a8d0d4639 (diff)
downloadlibrambutan-f3bcdd18d8f0b64cd8f17410b480b49315791544.tar.gz
librambutan-f3bcdd18d8f0b64cd8f17410b480b49315791544.zip
SerialUSB fixups.
-rw-r--r--docs/source/lang/api/serialusb.rst15
-rw-r--r--libmaple/usb/usb.c12
-rw-r--r--libmaple/usb/usb.h2
-rw-r--r--libmaple/usb/usb_lib/usb_mem.c4
-rw-r--r--libmaple/usb/usb_lib/usb_mem.h2
-rw-r--r--wirish/Print.cpp2
-rw-r--r--wirish/Print.h4
-rw-r--r--wirish/usb_serial.cpp117
-rw-r--r--wirish/usb_serial.h8
9 files changed, 67 insertions, 99 deletions
diff --git a/docs/source/lang/api/serialusb.rst b/docs/source/lang/api/serialusb.rst
index ee7146e..ed466f2 100644
--- a/docs/source/lang/api/serialusb.rst
+++ b/docs/source/lang/api/serialusb.rst
@@ -16,9 +16,8 @@ Introduction
In addition to three :ref:`serial ports <lang-serial>`, the Maple's
STM32 microprocessor includes a dedicated USB peripheral. This
peripheral is used to emulate a regular serial port for use as a
-terminal (text read/write). The emulated terminal is relatively slow
-and inefficient; it is best for transferring data at regular serial
-speeds (kilobaud).
+terminal. The emulated terminal is relatively slow; it is best for
+transferring data at regular serial speeds (kilobaud).
Library access to the emulated serial port is provided through the
``SerialUSB`` object. You can mostly use ``SerialUSB`` as a drop-in
@@ -30,14 +29,14 @@ replacement for ``Serial1``, ``Serial2``, and ``Serial3``.
This means that if you have a number of calls to one of the
``SerialUSB`` ``write()`` or ``print()`` functions in your code,
- and you are not monitoring the emulated on a computer, your program
- will run much, much slower than if it is being monitored or totally
- disconnected (run off of a battery).
+ and you are not monitoring ``SerialUSB`` on a computer, your
+ program will run much slower than if it is being monitored or
+ totally disconnected (run off of a battery).
You can avoid this behavior by :ref:`deciphering the port status
- using the DTR and RTS line status <lang-serialusb-safe-print>`; the
+ using the DTR and RTS line status <lang-serialusb-safe-print>` (the
behavior of these control lines is platform dependent and we no
- longer interpret them by default.
+ longer interpret them by default).
Library Documentation
---------------------
diff --git a/libmaple/usb/usb.c b/libmaple/usb/usb.c
index 7b1dd4c..b34c4b6 100644
--- a/libmaple/usb/usb.c
+++ b/libmaple/usb/usb.c
@@ -343,23 +343,21 @@ void usbBlockingSendByte(char ch) {
countTx = 1;
while (countTx);
}
-uint32 usbSendBytes(uint8* sendBuf, uint32 len) {
- /* any checks on connection (via dtr/rts) done upstream in wirish or
- by user */
- /* last xmit hasnt finished, abort */
+uint32 usbSendBytes(const uint8* sendBuf, uint32 len) {
+ /* Last transmission hasn't finished, abort */
if (countTx) {
return 0;
}
// We can only put VCOM_TX_EPSIZE bytes in the buffer
- if(len > VCOM_TX_EPSIZE/2) {
- len = VCOM_TX_EPSIZE/2;
+ if (len > VCOM_TX_EPSIZE / 2) {
+ len = VCOM_TX_EPSIZE / 2;
}
// Try to load some bytes if we can
if (len) {
- UserToPMABufferCopy(sendBuf,VCOM_TX_ADDR, len);
+ UserToPMABufferCopy(sendBuf, VCOM_TX_ADDR, len);
_SetEPTxCount(VCOM_TX_ENDP, len);
countTx += len;
_SetEPTxValid(VCOM_TX_ENDP);
diff --git a/libmaple/usb/usb.h b/libmaple/usb/usb.h
index 92f606c..c724c54 100644
--- a/libmaple/usb/usb.h
+++ b/libmaple/usb/usb.h
@@ -74,7 +74,7 @@ void usbWaitReset(void);
/* blocking functions for send/receive */
void usbBlockingSendByte(char ch);
-uint32 usbSendBytes(uint8* sendBuf,uint32 len);
+uint32 usbSendBytes(const uint8* sendBuf,uint32 len);
uint32 usbBytesAvailable(void);
uint32 usbReceiveBytes(uint8* recvBuf, uint32 len);
uint8 usbGetDTR(void);
diff --git a/libmaple/usb/usb_lib/usb_mem.c b/libmaple/usb/usb_lib/usb_mem.c
index ee698c5..90ffc62 100644
--- a/libmaple/usb/usb_lib/usb_mem.c
+++ b/libmaple/usb/usb_lib/usb_mem.c
@@ -30,9 +30,9 @@
* - wPMABufAddr: address into PMA.
* - wNBytes: no. of bytes to be copied.
* Output : None.
-* Return : None .
+* Return : None .
*******************************************************************************/
-void UserToPMABufferCopy(u8 *pbUsrBuf, u16 wPMABufAddr, u16 wNBytes)
+void UserToPMABufferCopy(const u8 *pbUsrBuf, u16 wPMABufAddr, u16 wNBytes)
{
u32 n = (wNBytes + 1) >> 1; /* n = (wNBytes + 1) / 2 */
u32 i, temp1, temp2;
diff --git a/libmaple/usb/usb_lib/usb_mem.h b/libmaple/usb/usb_lib/usb_mem.h
index a3d7927..60ff9f1 100644
--- a/libmaple/usb/usb_lib/usb_mem.h
+++ b/libmaple/usb/usb_lib/usb_mem.h
@@ -26,7 +26,7 @@
extern "C" {
#endif
-void UserToPMABufferCopy(u8 *pbUsrBuf, u16 wPMABufAddr, u16 wNBytes);
+void UserToPMABufferCopy(const u8 *pbUsrBuf, u16 wPMABufAddr, u16 wNBytes);
void PMAToUserBufferCopy(u8 *pbUsrBuf, u16 wPMABufAddr, u16 wNBytes);
#if defined(__cplusplus)
diff --git a/wirish/Print.cpp b/wirish/Print.cpp
index cfb2cda..9130c9c 100644
--- a/wirish/Print.cpp
+++ b/wirish/Print.cpp
@@ -52,7 +52,7 @@ void Print::write(const char *str) {
}
}
-void Print::write(void *buffer, uint32 size) {
+void Print::write(const void *buffer, uint32 size) {
uint8 *ch = (uint8*)buffer;
while (size--) {
write(*ch++);
diff --git a/wirish/Print.h b/wirish/Print.h
index ec7b163..73d82e7 100644
--- a/wirish/Print.h
+++ b/wirish/Print.h
@@ -35,9 +35,9 @@ enum {
class Print {
public:
- virtual void write(uint8) = 0;
+ virtual void write(uint8 ch) = 0;
virtual void write(const char *str);
- virtual void write(void*, uint32);
+ virtual void write(const void *buf, uint32 len);
void print(char);
void print(const char[]);
void print(uint8);
diff --git a/wirish/usb_serial.cpp b/wirish/usb_serial.cpp
index e2751a2..0a2be43 100644
--- a/wirish/usb_serial.cpp
+++ b/wirish/usb_serial.cpp
@@ -3,28 +3,29 @@
*
* Copyright (c) 2010 Perry Hung.
*
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
*
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
*****************************************************************************/
/**
- * @brief Wirish USB class for easy communication, uses libmaple's
- * virtual com port implementation
+ * @brief USB virtual serial terminal
*/
#include <string.h>
@@ -34,7 +35,7 @@
#define USB_TIMEOUT 50
-USBSerial :: USBSerial(void) {
+USBSerial::USBSerial(void) {
}
void USBSerial::begin(void) {
@@ -46,54 +47,29 @@ void USBSerial::end(void) {
}
void USBSerial::write(uint8 ch) {
- if(!(usbIsConnected() && usbIsConfigured())) {
- return;
- }
-
- uint16 status = 0;
- uint32 start = millis();
-
- while(status == 0 && (millis() - start <= USB_TIMEOUT)) {
- status = usbSendBytes(&ch, 1);
- }
+ const uint8 buf[] = {ch};
+ this->write(buf, 1);
}
void USBSerial::write(const char *str) {
- if(!(usbIsConnected() && usbIsConfigured())) {
- return;
- }
-
- uint32 len = strlen(str);
- uint16 status = 0;
- uint16 oldstatus = 0;
- uint32 start = millis();
-
- while(status < len && (millis() - start < USB_TIMEOUT)) {
- status += usbSendBytes((uint8*)str+status, len-status);
- if(oldstatus != status)
- start = millis();
- oldstatus = status;
- }
+ this->write(str, strlen(str));
}
-void USBSerial::write(void *buf, uint32 size) {
- if(!(usbIsConnected() && usbIsConfigured())) {
+void USBSerial::write(const void *buf, uint32 len) {
+ if (!(usbIsConnected() && usbIsConfigured()) || !buf) {
return;
}
- if (!buf) {
- return;
- }
-
- uint16 status = 0;
- uint16 oldstatus = 0;
+ uint32 txed = 0;
+ uint32 old_txed = 0;
uint32 start = millis();
- while(status < size && (millis() - start < USB_TIMEOUT)) {
- status += usbSendBytes((uint8*)buf+status, size-status);
- if(oldstatus != status)
+ while (txed < len && (millis() - start < USB_TIMEOUT)) {
+ txed += usbSendBytes((const uint8*)buf + txed, len - txed);
+ if (old_txed != txed) {
start = millis();
- oldstatus = status;
+ }
+ old_txed = txed;
}
}
@@ -101,47 +77,40 @@ uint32 USBSerial::available(void) {
return usbBytesAvailable();
}
-/* blocks forever until len_bytes is received */
uint32 USBSerial::read(void *buf, uint32 len) {
- if (buf == 0) {
+ if (!buf) {
return 0;
}
- uint32 bytes_in = 0;
- while (len > 0) {
- uint32 new_bytes = usbReceiveBytes((uint8*)buf + bytes_in, len);
- len -= new_bytes;
- bytes_in += new_bytes;
+ uint32 rxed = 0;
+ while (rxed < len) {
+ rxed += usbReceiveBytes((uint8*)buf + rxed, len - rxed);
}
- return bytes_in;
+ return rxed;
}
-/* blocks forever until 1 byte is received */
+/* Blocks forever until 1 byte is received */
uint8 USBSerial::read(void) {
- uint8 ch;
-
- while (usbReceiveBytes(&ch, 1) == 0);
- return ch;
+ uint8 buf[1];
+ this->read(buf, 1);
+ return buf[0];
}
uint8 USBSerial::pending(void) {
return usbGetPending();
}
-// TODO deprecate the crap out of this
+uint8 USBSerial::isConnected(void) {
+ return usbIsConnected() && usbIsConfigured();
+}
+
uint8 USBSerial::getDTR(void) {
return usbGetDTR();
}
-// TODO deprecate the crap out of this
uint8 USBSerial::getRTS(void) {
return usbGetRTS();
}
-uint8 USBSerial::isConnected(void) {
- return (usbIsConnected() && usbIsConfigured());
-}
-
USBSerial SerialUSB;
-
diff --git a/wirish/usb_serial.h b/wirish/usb_serial.h
index c228837..ba9e18c 100644
--- a/wirish/usb_serial.h
+++ b/wirish/usb_serial.h
@@ -23,8 +23,7 @@
*****************************************************************************/
/**
- * @brief wirish usb class for easy goin communication, uses libmaple's
- * virtual com port implementation
+ * @brief Wirish virtual serial port
*/
#ifndef _USB_SERIAL_H_
@@ -32,6 +31,9 @@
#include "Print.h"
+/**
+ * @brief Virtual serial terminal.
+ */
class USBSerial : public Print {
public:
USBSerial(void);
@@ -46,7 +48,7 @@ public:
void write(uint8);
void write(const char *str);
- void write(void *, uint32);
+ void write(const void*, uint32);
uint8 getRTS();
uint8 getDTR();