aboutsummaryrefslogtreecommitdiff
path: root/wirish
diff options
context:
space:
mode:
authorDonald Delmar Davis <don@suspectdevices.com>2013-04-10 21:04:41 -0700
committerDonald Delmar Davis <don@suspectdevices.com>2013-04-10 21:04:41 -0700
commit9a10a5d8f1b9a0ec889225aa1f328581e0fd7e66 (patch)
treee7b281eecf74acb0510723125e90a24e9fbf094d /wirish
parent048e70fc4163d8377b590eb134e4a60f7c48f9c3 (diff)
Initial pour of midi code from https://github.com/mlu/maple-ide --builds and enumerates.
Diffstat (limited to 'wirish')
-rw-r--r--wirish/include/wirish/boards.h4
-rw-r--r--wirish/include/wirish/usb_midi.h66
-rw-r--r--wirish/rules.mk3
-rw-r--r--wirish/stm32f1/boards_setup.cpp7
-rw-r--r--wirish/usb_midi.cpp138
5 files changed, 214 insertions, 4 deletions
diff --git a/wirish/include/wirish/boards.h b/wirish/include/wirish/boards.h
index 6676a02..1738dc8 100644
--- a/wirish/include/wirish/boards.h
+++ b/wirish/include/wirish/boards.h
@@ -170,4 +170,8 @@ bool boardUsesPin(uint8 pin);
#define BOARD_HAVE_SERIALUSB (defined(BOARD_USB_DISC_DEV) && \
defined(BOARD_USB_DISC_BIT))
+//#define BOARD_HAVE_MIDIUSB (defined(MIDIUSB)&&defined(BOARD_USB_DISC_DEV) && \
+// defined(BOARD_USB_DISC_BIT))
+#define BOARD_HAVE_MIDIUSB 1
+
#endif
diff --git a/wirish/include/wirish/usb_midi.h b/wirish/include/wirish/usb_midi.h
new file mode 100644
index 0000000..3ee1989
--- /dev/null
+++ b/wirish/include/wirish/usb_midi.h
@@ -0,0 +1,66 @@
+/******************************************************************************
+ * The MIT License
+ *
+ * Copyright (c) 2010 Perry Hung.
+ * Copyright (c) 2013 Magnus Lundin.
+ *
+ * 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.
+ *****************************************************************************/
+
+/**
+ * @brief Wirish USB MIDI port (MidiUSB).
+ */
+
+#ifndef _WIRISH_USB_MIDI_H_
+#define _WIRISH_USB_MIDI_H_
+
+#include <wirish/Print.h>
+#include <wirish/boards.h>
+
+/**
+ * @brief Virtual serial terminal.
+ */
+class USBMidi : public Print {
+public:
+ USBMidi(void);
+
+ void begin(void);
+ void end(void);
+
+ uint32 available(void);
+
+ uint32 read(void *buf, uint32 len);
+ uint8 read(void);
+
+ void write(uint8);
+ void write(const char *str);
+ void write(const void*, uint32);
+
+ uint8 isConnected();
+ uint8 pending();
+};
+
+#if BOARD_HAVE_MIDIUSB
+extern USBMidi MidiUSB;
+#endif
+
+#endif
+
diff --git a/wirish/rules.mk b/wirish/rules.mk
index 1cac74a..7022511 100644
--- a/wirish/rules.mk
+++ b/wirish/rules.mk
@@ -30,7 +30,8 @@ cppSRCS_$(d) += HardwareTimer.cpp
cppSRCS_$(d) += Print.cpp
cppSRCS_$(d) += pwm.cpp
ifeq ($(MCU_SERIES), stm32f1)
-cppSRCS_$(d) += usb_serial.cpp # HACK: this is currently STM32F1 only.
+#cppSRCS_$(d) += usb_serial.cpp # HACK: this is currently STM32F1 only.
+cppSRCS_$(d) += usb_midi.cpp # HACK: this is currently STM32F1 only.
cppSRCS_$(d) += HardwareSPI.cpp # FIXME: port to F2 and fix wirish.h
endif
cppSRCS_$(d) += wirish_analog.cpp
diff --git a/wirish/stm32f1/boards_setup.cpp b/wirish/stm32f1/boards_setup.cpp
index 11872d5..68e7947 100644
--- a/wirish/stm32f1/boards_setup.cpp
+++ b/wirish/stm32f1/boards_setup.cpp
@@ -40,7 +40,8 @@
#include <libmaple/timer.h>
#include <wirish/boards.h>
-#include <wirish/usb_serial.h>
+//#include <wirish/usb_serial.h>
+#include <wirish/usb_midi.h>
// Allow boards to provide a PLL multiplier. This is useful for
// e.g. STM32F100 value line MCUs, which use slower multipliers.
@@ -74,8 +75,8 @@ namespace wirish {
}
__weak void board_setup_usb(void) {
-#if BOARD_HAVE_SERIALUSB
- SerialUSB.begin();
+#if BOARD_HAVE_MIDIUSB
+ MidiUSB.begin();
#endif
}
diff --git a/wirish/usb_midi.cpp b/wirish/usb_midi.cpp
new file mode 100644
index 0000000..f88a7c7
--- /dev/null
+++ b/wirish/usb_midi.cpp
@@ -0,0 +1,138 @@
+/******************************************************************************
+ * The MIT License
+ *
+ * Copyright (c) 2010 Perry Hung.
+ * Copyright (c) 2013 Magnus Lundin.
+ *
+ * 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.
+ *****************************************************************************/
+
+/**
+ * @brief USB MIDI device
+ */
+
+#include <wirish/usb_midi.h>
+
+#include <string.h>
+#include <stdint.h>
+
+#include <libmaple/nvic.h>
+#include <libmaple/usb_midi_device.h>
+#include <libmaple/usb.h>
+
+#include <wirish/wirish.h>
+
+/*
+ * USBMidi interface
+ */
+
+#define USB_TIMEOUT 50
+
+USBMidi::USBMidi(void) {
+#if !BOARD_HAVE_MIDIUSB
+ ASSERT(0);
+#endif
+}
+
+void USBMidi::begin(void) {
+#if BOARD_HAVE_MIDIUSB
+ usb_midi_enable(BOARD_USB_DISC_DEV, BOARD_USB_DISC_BIT);
+#endif
+}
+
+void USBMidi::end(void) {
+#if BOARD_HAVE_MIDIUSB
+ usb_midi_disable(BOARD_USB_DISC_DEV, BOARD_USB_DISC_BIT);
+#endif
+}
+
+void USBMidi::write(uint8 ch) {
+ this->write(&ch, 1);
+}
+
+void USBMidi::write(const char *str) {
+ this->write(str, strlen(str));
+}
+
+void USBMidi::write(const void *buf, uint32 len) {
+ if (!this->isConnected() || !buf) {
+ return;
+ }
+
+ uint32 txed = 0;
+ uint32 old_txed = 0;
+ uint32 start = millis();
+
+ uint32 sent = 0;
+
+ while (txed < len && (millis() - start < USB_TIMEOUT)) {
+ sent = usb_midi_tx((const uint8*)buf + txed, len - txed);
+ txed += sent;
+ if (old_txed != txed) {
+ start = millis();
+ }
+ old_txed = txed;
+ }
+
+
+ if (sent == USB_MIDI_TX_EPSIZE) {
+ while (usb_midi_is_transmitting() != 0) {
+ }
+ /* flush out to avoid having the pc wait for more data */
+ usb_midi_tx(NULL, 0);
+ }
+}
+
+uint32 USBMidi::available(void) {
+ return usb_midi_data_available();
+}
+
+uint32 USBMidi::read(void *buf, uint32 len) {
+ if (!buf) {
+ return 0;
+ }
+
+ uint32 rxed = 0;
+ while (rxed < len) {
+ rxed += usb_midi_rx((uint8*)buf + rxed, len - rxed);
+ }
+
+ return rxed;
+}
+
+/* Blocks forever until 1 byte is received */
+uint8 USBMidi::read(void) {
+ uint8 b;
+ this->read(&b, 1);
+ return b;
+}
+
+uint8 USBMidi::pending(void) {
+ return usb_midi_get_pending();
+}
+
+uint8 USBMidi::isConnected(void) {
+ return usb_is_connected(USBLIB) && usb_is_configured(USBLIB);
+}
+
+#if BOARD_HAVE_MIDIUSB
+USBMidi MidiUSB;
+#endif