summaryrefslogtreecommitdiff
path: root/firmware/usbstack/usb_serial.c
diff options
context:
space:
mode:
authorChristian Gmeiner <christian.gmeiner@gmail.com>2007-11-30 00:13:00 +0000
committerChristian Gmeiner <christian.gmeiner@gmail.com>2007-11-30 00:13:00 +0000
commit94be71eab5e7a4c2e5407f7c4c38dc84237f4044 (patch)
treef89c0cdaf1922fb091aa43073ab0a59ee55ef0b2 /firmware/usbstack/usb_serial.c
parentbf2a33485fc99d83ef74c261d092f6b95e040a37 (diff)
downloadrockbox-94be71eab5e7a4c2e5407f7c4c38dc84237f4044.zip
rockbox-94be71eab5e7a4c2e5407f7c4c38dc84237f4044.tar.gz
rockbox-94be71eab5e7a4c2e5407f7c4c38dc84237f4044.tar.bz2
rockbox-94be71eab5e7a4c2e5407f7c4c38dc84237f4044.tar.xz
Add a working serial driver to usb stack. At the moment it simply echos back what it gets. You can test it on linux by
0) change relevant defines in usb_core.c 1) modprobe usbserial vendor=0x0781 product=0x7421 debug=1 2) picocom /dev/ttyUSB0 3) look at your logf screen if you build with logf support and enabled LOGF_ENABLE define in usb_serial.c I also modified usb_core so that storage and serial both can make use the the 'usb_core'-thread. More will come :) git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15850 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/usbstack/usb_serial.c')
-rw-r--r--firmware/usbstack/usb_serial.c74
1 files changed, 74 insertions, 0 deletions
diff --git a/firmware/usbstack/usb_serial.c b/firmware/usbstack/usb_serial.c
new file mode 100644
index 0000000..5513c56
--- /dev/null
+++ b/firmware/usbstack/usb_serial.c
@@ -0,0 +1,74 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id: $
+ *
+ * Copyright (C) 2007 by Christian Gmeiner
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+#include "system.h"
+#include "usb_core.h"
+#include "usb_drv.h"
+
+//#define LOGF_ENABLE
+#include "logf.h"
+
+static unsigned char _transfer_buffer[16];
+static unsigned char* transfer_buffer;
+
+/* called by usb_code_init() */
+void usb_serial_init(void)
+{
+ logf("serial: init");
+ transfer_buffer = (void*)UNCACHED_ADDR(&_transfer_buffer);
+}
+
+/* called by usb_core_transfer_complete() */
+void usb_serial_transfer_complete(int endpoint)
+{
+ switch (endpoint) {
+ case EP_RX:
+ logf("serial: %s", transfer_buffer);
+
+ /* re-prime endpoint */
+ usb_drv_recv(EP_RX, transfer_buffer, sizeof _transfer_buffer);
+
+ /* echo back :) */
+ usb_drv_send(EP_TX, transfer_buffer, sizeof transfer_buffer);
+ break;
+
+ case EP_TX:
+ break;
+ }
+}
+
+/* called by usb_core_control_request() */
+bool usb_serial_control_request(struct usb_ctrlrequest* req)
+{
+ /* note: interrupt context */
+
+ bool handled = false;
+ switch (req->bRequest) {
+ case USB_REQ_SET_CONFIGURATION:
+ logf("serial: set config");
+ /* prime rx endpoint */
+ usb_drv_recv(EP_RX, transfer_buffer, sizeof _transfer_buffer);
+ handled = true;
+ break;
+
+ default:
+ logf("serial: unhandeld req %d", req->bRequest);
+ }
+
+ return handled;
+}