summaryrefslogtreecommitdiff
path: root/firmware/usbstack/usb_serial.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/usbstack/usb_serial.c')
-rw-r--r--firmware/usbstack/usb_serial.c34
1 files changed, 21 insertions, 13 deletions
diff --git a/firmware/usbstack/usb_serial.c b/firmware/usbstack/usb_serial.c
index 5513c56910..77878092d7 100644
--- a/firmware/usbstack/usb_serial.c
+++ b/firmware/usbstack/usb_serial.c
@@ -23,6 +23,8 @@
23//#define LOGF_ENABLE 23//#define LOGF_ENABLE
24#include "logf.h" 24#include "logf.h"
25 25
26#ifdef USB_SERIAL
27
26static unsigned char _transfer_buffer[16]; 28static unsigned char _transfer_buffer[16];
27static unsigned char* transfer_buffer; 29static unsigned char* transfer_buffer;
28 30
@@ -34,20 +36,26 @@ void usb_serial_init(void)
34} 36}
35 37
36/* called by usb_core_transfer_complete() */ 38/* called by usb_core_transfer_complete() */
37void usb_serial_transfer_complete(int endpoint) 39void usb_serial_transfer_complete(bool in, int status, int length)
38{ 40{
39 switch (endpoint) { 41 int i;
40 case EP_RX: 42 switch (in) {
43 case false:
41 logf("serial: %s", transfer_buffer); 44 logf("serial: %s", transfer_buffer);
42 45 /* Data received. Send it back */
43 /* re-prime endpoint */ 46 for(i=0;i<length;i++) {
44 usb_drv_recv(EP_RX, transfer_buffer, sizeof _transfer_buffer); 47 if(transfer_buffer[i]>0x40 && transfer_buffer[i]<0x5b)
45 48 transfer_buffer[i]+=0x20;
46 /* echo back :) */ 49 else if(transfer_buffer[i]>0x60 && transfer_buffer[i]<0x7b)
47 usb_drv_send(EP_TX, transfer_buffer, sizeof transfer_buffer); 50 transfer_buffer[i]-=0x20;
51 }
52 usb_drv_send_nonblocking(EP_SERIAL, transfer_buffer, length);
48 break; 53 break;
49 54
50 case EP_TX: 55 case true:
56 /* Data sent out (maybe correctly, but we don't actually care.
57 * Re-prime read endpoint */
58 usb_drv_recv(EP_SERIAL, transfer_buffer, sizeof _transfer_buffer);
51 break; 59 break;
52 } 60 }
53} 61}
@@ -55,14 +63,12 @@ void usb_serial_transfer_complete(int endpoint)
55/* called by usb_core_control_request() */ 63/* called by usb_core_control_request() */
56bool usb_serial_control_request(struct usb_ctrlrequest* req) 64bool usb_serial_control_request(struct usb_ctrlrequest* req)
57{ 65{
58 /* note: interrupt context */
59
60 bool handled = false; 66 bool handled = false;
61 switch (req->bRequest) { 67 switch (req->bRequest) {
62 case USB_REQ_SET_CONFIGURATION: 68 case USB_REQ_SET_CONFIGURATION:
63 logf("serial: set config"); 69 logf("serial: set config");
64 /* prime rx endpoint */ 70 /* prime rx endpoint */
65 usb_drv_recv(EP_RX, transfer_buffer, sizeof _transfer_buffer); 71 usb_drv_recv(EP_SERIAL, transfer_buffer, sizeof _transfer_buffer);
66 handled = true; 72 handled = true;
67 break; 73 break;
68 74
@@ -72,3 +78,5 @@ bool usb_serial_control_request(struct usb_ctrlrequest* req)
72 78
73 return handled; 79 return handled;
74} 80}
81
82#endif /*USB_SERIAL*/