diff options
author | Frank Gevaerts <frank@gevaerts.be> | 2008-04-26 19:02:16 +0000 |
---|---|---|
committer | Frank Gevaerts <frank@gevaerts.be> | 2008-04-26 19:02:16 +0000 |
commit | bec6aa3176fc6d5ce80bcd4d6022358aa6c01629 (patch) | |
tree | dfbaa924ba3e13d6f73dc446b1a2149610ed3e67 /firmware/usbstack/usb_serial.c | |
parent | 33c44461e1b5fb9aff2f8ba7470ad2449b3c410e (diff) | |
download | rockbox-bec6aa3176fc6d5ce80bcd4d6022358aa6c01629.tar.gz rockbox-bec6aa3176fc6d5ce80bcd4d6022358aa6c01629.zip |
- change the usb class driver framework to allow for device classes with more than one interface or more than one endpoint pair
- move the charging-only dummy driver out of usb_core
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@17252 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/usbstack/usb_serial.c')
-rw-r--r-- | firmware/usbstack/usb_serial.c | 43 |
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 */ |
31 | struct usb_interface_descriptor __attribute__((aligned(2))) | 31 | static 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 | ||
45 | struct usb_endpoint_descriptor __attribute__((aligned(2))) endpoint_descriptor = | 45 | |
46 | static 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 | ||
93 | int usb_serial_get_config_descriptor(unsigned char *dest,int max_packet_size, | 94 | int 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 | ||
100 | int usb_serial_set_first_interface(int interface) | ||
101 | { | ||
102 | usb_interface = interface; | ||
103 | return interface + 1; | ||
104 | } | ||
105 | |||
106 | |||
107 | int 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 | ||
113 | void usb_serial_init_connection(int interface,int endpoint) | 128 | void 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() */ |
190 | void usb_serial_transfer_complete(bool in, int status, int length) | 202 | void 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); |