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.c43
1 files changed, 28 insertions, 15 deletions
diff --git a/firmware/usbstack/usb_serial.c b/firmware/usbstack/usb_serial.c
index 08eb1213ea..197ef47cb7 100644
--- a/firmware/usbstack/usb_serial.c
+++ b/firmware/usbstack/usb_serial.c
@@ -28,7 +28,7 @@
28#ifdef USB_SERIAL 28#ifdef USB_SERIAL
29 29
30/* serial interface */ 30/* serial interface */
31struct usb_interface_descriptor __attribute__((aligned(2))) 31static struct usb_interface_descriptor __attribute__((aligned(2)))
32 interface_descriptor = 32 interface_descriptor =
33{ 33{
34 .bLength = sizeof(struct usb_interface_descriptor), 34 .bLength = sizeof(struct usb_interface_descriptor),
@@ -42,7 +42,8 @@ struct usb_interface_descriptor __attribute__((aligned(2)))
42 .iInterface = 0 42 .iInterface = 0
43}; 43};
44 44
45struct usb_endpoint_descriptor __attribute__((aligned(2))) endpoint_descriptor = 45
46static struct usb_endpoint_descriptor __attribute__((aligned(2))) endpoint_descriptor =
46{ 47{
47 .bLength = sizeof(struct usb_endpoint_descriptor), 48 .bLength = sizeof(struct usb_endpoint_descriptor),
48 .bDescriptorType = USB_DT_ENDPOINT, 49 .bDescriptorType = USB_DT_ENDPOINT,
@@ -90,31 +91,42 @@ static void sendout(void)
90 busy_sending=true; 91 busy_sending=true;
91} 92}
92 93
93int usb_serial_get_config_descriptor(unsigned char *dest,int max_packet_size, 94int usb_serial_set_first_endpoint(int endpoint)
94 int interface_number,int endpoint)
95{ 95{
96 endpoint_descriptor.wMaxPacketSize=max_packet_size; 96 usb_endpoint = endpoint;
97 interface_descriptor.bInterfaceNumber=interface_number; 97 return endpoint + 1;
98}
98 99
100int usb_serial_set_first_interface(int interface)
101{
102 usb_interface = interface;
103 return interface + 1;
104}
105
106
107int usb_serial_get_config_descriptor(unsigned char *dest,int max_packet_size)
108{
109 unsigned char *orig_dest = dest;
110
111 endpoint_descriptor.wMaxPacketSize=max_packet_size;
112 interface_descriptor.bInterfaceNumber=usb_interface;
99 113
100 memcpy(dest,&interface_descriptor,sizeof(struct usb_interface_descriptor)); 114 memcpy(dest,&interface_descriptor,sizeof(struct usb_interface_descriptor));
101 dest+=sizeof(struct usb_interface_descriptor); 115 dest+=sizeof(struct usb_interface_descriptor);
102 116
103 endpoint_descriptor.bEndpointAddress = endpoint | USB_DIR_IN, 117 endpoint_descriptor.bEndpointAddress = usb_endpoint | USB_DIR_IN,
104 memcpy(dest,&endpoint_descriptor,sizeof(struct usb_endpoint_descriptor)); 118 memcpy(dest,&endpoint_descriptor,sizeof(struct usb_endpoint_descriptor));
105 dest+=sizeof(struct usb_endpoint_descriptor); 119 dest+=sizeof(struct usb_endpoint_descriptor);
106 120
107 endpoint_descriptor.bEndpointAddress = endpoint | USB_DIR_OUT, 121 endpoint_descriptor.bEndpointAddress = usb_endpoint | USB_DIR_OUT,
108 memcpy(dest,&endpoint_descriptor,sizeof(struct usb_endpoint_descriptor)); 122 memcpy(dest,&endpoint_descriptor,sizeof(struct usb_endpoint_descriptor));
109 return sizeof(struct usb_interface_descriptor) + 123 dest+=sizeof(struct usb_endpoint_descriptor);
110 2 * sizeof(struct usb_endpoint_descriptor); 124
125 return (dest - orig_dest);
111} 126}
112 127
113void usb_serial_init_connection(int interface,int endpoint) 128void usb_serial_init_connection(void)
114{ 129{
115 usb_interface = interface;
116 usb_endpoint = endpoint;
117
118 /* prime rx endpoint */ 130 /* prime rx endpoint */
119 usb_drv_recv(usb_endpoint, receive_buffer, sizeof receive_buffer); 131 usb_drv_recv(usb_endpoint, receive_buffer, sizeof receive_buffer);
120 132
@@ -187,8 +199,9 @@ void usb_serial_send(unsigned char *data,int length)
187} 199}
188 200
189/* called by usb_core_transfer_complete() */ 201/* called by usb_core_transfer_complete() */
190void usb_serial_transfer_complete(bool in, int status, int length) 202void usb_serial_transfer_complete(int ep,bool in, int status, int length)
191{ 203{
204 (void)ep;
192 switch (in) { 205 switch (in) {
193 case false: 206 case false:
194 logf("serial: %s", receive_buffer); 207 logf("serial: %s", receive_buffer);