summaryrefslogtreecommitdiff
path: root/software/cmx589a_teensy_test/tx_benchmark.c
diff options
context:
space:
mode:
Diffstat (limited to 'software/cmx589a_teensy_test/tx_benchmark.c')
-rw-r--r--software/cmx589a_teensy_test/tx_benchmark.c169
1 files changed, 169 insertions, 0 deletions
diff --git a/software/cmx589a_teensy_test/tx_benchmark.c b/software/cmx589a_teensy_test/tx_benchmark.c
new file mode 100644
index 0000000..334947e
--- /dev/null
+++ b/software/cmx589a_teensy_test/tx_benchmark.c
@@ -0,0 +1,169 @@
+/* USB Serial Transmit Bandwidth Test for Teensy USB Development Board
+ * http://www.pjrc.com/teensy/
+ * Copyright (c) 2009 PJRC.COM, LLC
+ *
+ * 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 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.
+ */
+
+#include <avr/io.h>
+#include <avr/pgmspace.h>
+#include <stdint.h>
+#include <util/delay.h>
+#include "usb_serial.h"
+
+#define LED_CONFIG (DDRD |= (1<<6))
+#define LED_ON (PORTD &= ~(1<<6))
+#define LED_OFF (PORTD |= (1<<6))
+#define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n))
+
+void send_str(const char *s);
+
+#define CLEAR_TIMER0_OVERFLOW() (TIFR0 |= (1<<TOV0))
+#define IS_TIMER0_OVERFLOW() (TIFR0 & (1<<TOV0))
+
+
+// USB Serial Transmit Bandwidth Test
+//
+// Within 5 seconds of opening the port, this program
+// will send a message as rapidly as possible, for 10 seconds.
+// When finished, turn off text capture (some programs will not
+// write the last data until you do this), delete any extra lines
+// at the beginning, and then the file size divided by 10 is the
+// maximum transmit bandwidth.
+//
+// To use this, run a terminal emulator and select the option
+// to capture all text to a file. On Linux & MacOS, you can use
+// the cat command to read data to a file, such as:
+// cat /dev/cu.usbmodem12341 > /tmp/test.txt
+// The serial_read.exe or serial_list program can read the data
+// without saving it.
+// Results can vary depending on the number of other USB devices
+// connected. For fastest results, disconnect all others.
+
+// Results on Ubuntu 9.04, using: ./serial_listen /dev/ttyACM0
+// Teensy++: 11565234 in 10 seconds
+// Teensy: 9610184 in 10 seconds
+
+// Results on Mac OS X 10.5.7, using: ./serial_listen /dev/cu.usbmodem12341
+// Teensy++: 9013787 in 10 seconds
+// Teensy: 6386395 in 10 seconds
+
+// Results on Windows XP SP3, using: serial_read.exe COM3:
+// Teensy++: 10220367 in 10 seconds
+// Teensy: 8196387 in 10 seconds
+
+// Results on Windows Vista SP1, using: serial_read.exe COM3:
+// Teensy++: 10234275 in 10 seconds
+// Teensy: 8196204 in 10 seconds
+
+// Results on Windows 7 (beta 7100), using: serial_read.exe COM3:
+// Teensy++: 10274718 in 10 seconds
+// Teensy: 8225423 in 10 seconds
+
+// All 5 of these were tested on a Macbook with Intel dual core 2.4 Ghz,
+// external USB mouse + built-in USB peripherals
+
+
+int main(void)
+{
+ uint8_t n;
+ uint16_t count;
+ const char test_string[] = {
+ "USB Fast Serial Transmit Bandwidth Test, capture this text.\r\n"};
+
+ // set for 16 MHz clock, and turn on the LED
+ CPU_PRESCALE(0);
+ LED_CONFIG;
+ LED_OFF;
+ DDRC |= (1<<2); // Pin C2 to show % cpu usage
+
+ // configure timer0 to overflow every 4 ms, prescale=256, top=250
+ // 250 * 256 / 16 MHz = 4 ms
+ TIMSK0 = 0;
+ TCCR0A = (1<<WGM01)|(1<<WGM00);
+ OCR0A = 250;
+ TCCR0B = (1<<WGM02)|(1<<CS02);
+
+ // initialize the USB, and then wait for the host
+ // to set configuration. If the Teensy is powered
+ // without a PC connected to the USB port, this
+ // will wait forever.
+ usb_init();
+ while (!usb_configured()) /* wait */ ;
+ _delay_ms(1000);
+
+ while (1) {
+ // wait for the user to run their terminal emulator program
+ // which sets DTR to indicate it is ready to receive.
+ while (!(usb_serial_get_control() & USB_SERIAL_DTR)) /* wait */ ;
+
+ // Turn the LED on while sending data
+ LED_ON;
+
+ // give the user 5 seconds to enable text capture in their
+ // terminal emulator, or do whatever to get ready
+ for (n=5; n; n--) {
+ send_str(PSTR("10 second speed test begins in "));
+ usb_serial_putchar(n + '0');
+ send_str(PSTR(" sec.\r\n"));
+ if (!(usb_serial_get_control() & USB_SERIAL_DTR)) break;
+ _delay_ms(1000);
+ }
+
+ // wait for a 4 ms timer0 period to begin
+ CLEAR_TIMER0_OVERFLOW();
+ while (!IS_TIMER0_OVERFLOW()) /* wait */ ;
+ CLEAR_TIMER0_OVERFLOW();
+ count=0;
+
+ // send a string as fast as possible, for 10 seconds
+ while (1) {
+ usb_serial_write(test_string, (uint16_t)(sizeof(test_string)-1));
+ if (IS_TIMER0_OVERFLOW()) {
+ CLEAR_TIMER0_OVERFLOW();
+ count++;
+ if (count == 2500) break; // 10 sec
+ if (!(usb_serial_get_control() & USB_SERIAL_DTR)) break;
+ }
+ }
+ PORTC &= ~(1<<2);
+ send_str(PSTR("done!\r\n"));
+ LED_OFF;
+
+ // after the test, wait forever doing nothing,
+ // well, at least until the terminal emulator quits
+ // or drops DTR for some reason.
+ while (usb_serial_get_control() & USB_SERIAL_DTR) /* wait */ ;
+ }
+}
+
+// Send a string to the USB serial port. The string must be in
+// flash memory, using PSTR
+//
+void send_str(const char *s)
+{
+ char c;
+ while (1) {
+ c = pgm_read_byte(s++);
+ if (!c) break;
+ usb_serial_putchar(c);
+ }
+}
+
+