summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrank Gevaerts <frank@gevaerts.be>2009-04-19 19:25:59 +0000
committerFrank Gevaerts <frank@gevaerts.be>2009-04-19 19:25:59 +0000
commit4bff30a77f713b5f310534e093a39292b7b809f8 (patch)
tree3897772f2d8c0e34e434f9ca3f56a1ca7bce68c8
parent75a0a434d1f7b6f69c79862639ee057207b315dd (diff)
downloadrockbox-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.c64
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
159static void sendout(void) 159static 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
179void usb_serial_send(unsigned char *data,int length) 170void 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() */
221void usb_serial_transfer_complete(int ep,int dir, int status, int length) 213void 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