aboutsummaryrefslogtreecommitdiffstats
path: root/source/usbserial.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/usbserial.cpp')
-rw-r--r--source/usbserial.cpp41
1 files changed, 41 insertions, 0 deletions
diff --git a/source/usbserial.cpp b/source/usbserial.cpp
new file mode 100644
index 0000000..cead28a
--- /dev/null
+++ b/source/usbserial.cpp
@@ -0,0 +1,41 @@
+#include "usbserial.hpp"
+
+#include "hal.h"
+
+void USBSeriald::start()
+{
+ initPins();
+
+ sduObjectInit(m_driver);
+ sduStart(m_driver, &serusbcfg);
+
+ // Reconnect bus so device can re-enumerate on reset
+ usbDisconnectBus(serusbcfg.usbp);
+ chThdSleepMilliseconds(1500);
+ usbStart(serusbcfg.usbp, &usbcfg);
+ usbConnectBus(serusbcfg.usbp);
+}
+
+bool USBSeriald::active() const
+{
+ return m_driver->config->usbp->state == USB_ACTIVE;
+}
+
+std::size_t USBSeriald::read(void *buffer, std::size_t count)
+{
+ auto *bss = reinterpret_cast<BaseSequentialStream *>(m_driver);
+ return streamRead(bss, static_cast<uint8_t *>(buffer), count);
+}
+
+std::size_t USBSeriald::write(const void *buffer, std::size_t count)
+{
+ auto *bss = reinterpret_cast<BaseSequentialStream *>(m_driver);
+ return streamWrite(bss, static_cast<const uint8_t *>(buffer), count);
+}
+
+void USBSeriald::initPins()
+{
+ palSetPadMode(GPIOA, 11, PAL_MODE_ALTERNATE(10));
+ palSetPadMode(GPIOA, 12, PAL_MODE_ALTERNATE(10));
+}
+