diff options
author | Frank Gevaerts <frank@gevaerts.be> | 2009-04-19 19:25:59 +0000 |
---|---|---|
committer | Frank Gevaerts <frank@gevaerts.be> | 2009-04-19 19:25:59 +0000 |
commit | 4bff30a77f713b5f310534e093a39292b7b809f8 (patch) | |
tree | 3897772f2d8c0e34e434f9ca3f56a1ca7bce68c8 | |
parent | 75a0a434d1f7b6f69c79862639ee057207b315dd (diff) | |
download | rockbox-4bff30a77f713b5f310534e093a39292b7b809f8.tar.gz rockbox-4bff30a77f713b5f310534e093a39292b7b809f8.zip |
simplify and cleanup usb_serial.c (FS#10149 by Tomer Shalev)
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@20746 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r-- | firmware/usbstack/usb_serial.c | 64 |
1 files changed, 28 insertions, 36 deletions
diff --git a/firmware/usbstack/usb_serial.c b/firmware/usbstack/usb_serial.c index 50e4699b28..370afcb7f1 100644 --- a/firmware/usbstack/usb_serial.c +++ b/firmware/usbstack/usb_serial.c | |||
@@ -158,45 +158,41 @@ void usb_serial_disconnect(void) | |||
158 | 158 | ||
159 | static void sendout(void) | 159 | static void sendout(void) |
160 | { | 160 | { |
161 | if(buffer_start+buffer_length >= BUFFER_SIZE) | 161 | buffer_transitlength = MIN(buffer_length,BUFFER_SIZE-buffer_start); |
162 | if(buffer_transitlength > 0) | ||
162 | { | 163 | { |
163 | /* Buffer wraps. Only send the first part */ | 164 | buffer_length -= buffer_transitlength; |
164 | buffer_transitlength=BUFFER_SIZE - buffer_start; | ||
165 | } | ||
166 | else | ||
167 | { | ||
168 | /* Send everything */ | ||
169 | buffer_transitlength=buffer_length; | ||
170 | } | ||
171 | if(buffer_transitlength>0) | ||
172 | { | ||
173 | buffer_length-=buffer_transitlength; | ||
174 | usb_drv_send_nonblocking(ep_in, &send_buffer[buffer_start], | 165 | usb_drv_send_nonblocking(ep_in, &send_buffer[buffer_start], |
175 | buffer_transitlength); | 166 | buffer_transitlength); |
176 | } | 167 | } |
177 | } | 168 | } |
178 | 169 | ||
179 | void usb_serial_send(unsigned char *data,int length) | 170 | void usb_serial_send(unsigned char *data,int length) |
180 | { | 171 | { |
181 | if(!active) | 172 | int freestart, available_end_space, i; |
182 | return; | 173 | |
183 | if(length<=0) | 174 | if (!active||length<=0) |
184 | return; | 175 | return; |
185 | int freestart=(buffer_start+buffer_length+buffer_transitlength)%BUFFER_SIZE; | 176 | |
186 | if(buffer_start+buffer_transitlength+buffer_length >= BUFFER_SIZE) | 177 | i=buffer_start+buffer_length+buffer_transitlength; |
178 | freestart=i%BUFFER_SIZE; | ||
179 | available_end_space=BUFFER_SIZE-i; | ||
180 | |||
181 | if (0>=available_end_space) | ||
187 | { | 182 | { |
188 | /* current buffer wraps, so new data can't */ | 183 | /* current buffer wraps, so new data can't wrap */ |
189 | int available_space = BUFFER_SIZE - buffer_length - buffer_transitlength; | 184 | int available_space = BUFFER_SIZE - |
190 | length=MIN(length,available_space); | 185 | (buffer_length + buffer_transitlength); |
191 | memcpy(&send_buffer[freestart], | 186 | |
192 | data,length); | 187 | length = MIN(length,available_space); |
188 | memcpy(&send_buffer[freestart],data,length); | ||
193 | buffer_length+=length; | 189 | buffer_length+=length; |
194 | } | 190 | } |
195 | else | 191 | else |
196 | { | 192 | { |
197 | /* current buffer doesn't wrap, so new data might */ | 193 | /* current buffer doesn't wrap, so new data might */ |
198 | int available_end_space = (BUFFER_SIZE - (buffer_start+buffer_length+buffer_transitlength)); | ||
199 | int first_chunk = MIN(length,available_end_space); | 194 | int first_chunk = MIN(length,available_end_space); |
195 | |||
200 | memcpy(&send_buffer[freestart],data,first_chunk); | 196 | memcpy(&send_buffer[freestart],data,first_chunk); |
201 | length-=first_chunk; | 197 | length-=first_chunk; |
202 | buffer_length+=first_chunk; | 198 | buffer_length+=first_chunk; |
@@ -207,20 +203,18 @@ void usb_serial_send(unsigned char *data,int length) | |||
207 | buffer_length+=MIN(length,buffer_start); | 203 | buffer_length+=MIN(length,buffer_start); |
208 | } | 204 | } |
209 | } | 205 | } |
210 | if(buffer_transitlength>0) | 206 | |
211 | { | 207 | if (buffer_transitlength==0) |
212 | /* Do nothing. The transfer completion handler will pick it up */ | ||
213 | } | ||
214 | else | ||
215 | { | ||
216 | sendout(); | 208 | sendout(); |
217 | } | 209 | /* else do nothing. The transfer completion handler will pick it up */ |
218 | } | 210 | } |
219 | 211 | ||
220 | /* called by usb_core_transfer_complete() */ | 212 | /* called by usb_core_transfer_complete() */ |
221 | void usb_serial_transfer_complete(int ep,int dir, int status, int length) | 213 | void usb_serial_transfer_complete(int ep,int dir, int status, int length) |
222 | { | 214 | { |
223 | (void)ep; | 215 | (void)ep; |
216 | (void)length; | ||
217 | |||
224 | switch (dir) { | 218 | switch (dir) { |
225 | case USB_DIR_OUT: | 219 | case USB_DIR_OUT: |
226 | logf("serial: %s", receive_buffer); | 220 | logf("serial: %s", receive_buffer); |
@@ -234,11 +228,9 @@ void usb_serial_transfer_complete(int ep,int dir, int status, int length) | |||
234 | /* Data sent out. Update circular buffer */ | 228 | /* Data sent out. Update circular buffer */ |
235 | if(status == 0) | 229 | if(status == 0) |
236 | { | 230 | { |
237 | if(length!=buffer_transitlength) | 231 | /* TODO: Handle (length != buffer_transitlength) */ |
238 | { | 232 | |
239 | /* do something? */ | 233 | buffer_start=(buffer_start+buffer_transitlength)%BUFFER_SIZE; |
240 | } | ||
241 | buffer_start = (buffer_start + buffer_transitlength)%BUFFER_SIZE; | ||
242 | buffer_transitlength = 0; | 234 | buffer_transitlength = 0; |
243 | } | 235 | } |
244 | 236 | ||