On Fri, May 03, 2013 at 12:59:11PM +0200, Hardy Griech wrote:
> I've encountered problems reading data from the target with an olimex-v1 
> FET.  Writing was ok.
> 
> Turned out (hopefully), that in cp210x.c/usbtr_recv() the function 
> usb_bulk_read() may legally return 0.
> 
> Modifying the code to:
> 
> do {
>          rlen = usb_bulk_read(tr->handle, V1_IN_EP, (char *)databuf,
>                               max_len, TIMEOUT);
> 
> #ifdef DEBUG_CP210X
>          printc(__FILE__": %s : read %d\n", __FUNCTION__, rlen);
> #endif
> 
> } while (rlen == 0);
> 
> solved my problem.
> 
> Should I submit a patch or is it ok in this way?

Hi Hardy,

I assume this is the latest git version? I've just altered your solution
slightly to keep a timeout for when usb_bulk_read() returns 0
immediately. Does this patch work for you?

------------------------------------------------------------------------

diff --git a/transport/cp210x.c b/transport/cp210x.c
index 1b8cc6f..436e978 100644
--- a/transport/cp210x.c
+++ b/transport/cp210x.c
@@ -21,6 +21,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <usb.h>
+#include <time.h>
 
 #include "cp210x.h"
 #include "util.h"
@@ -67,7 +68,7 @@ struct cp210x_transport {
 #define CP210X_WRITE_DTR               0x0100
 #define CP210X_WRITE_RTS               0x0200
 
-#define TIMEOUT                                30000
+#define TIMEOUT_S                      30
 
 static int configure_port(struct cp210x_transport *tr, int baud_rate)
 {
@@ -201,7 +202,7 @@ static int usbtr_send(transport_t tr_base, const uint8_t 
*data, int len)
 #endif
        while (len) {
                sent = usb_bulk_write(tr->handle, V1_OUT_EP,
-                                     (char *)data, len, TIMEOUT);
+                                     (char *)data, len, TIMEOUT_S * 1000);
                if (sent <= 0) {
                        pr_error(__FILE__": can't send data");
                        return -1;
@@ -218,28 +219,35 @@ static int usbtr_recv(transport_t tr_base, uint8_t 
*databuf, int max_len)
 {
        struct cp210x_transport *tr = (struct cp210x_transport *)tr_base;
        int rlen;
+       time_t deadline = time(NULL) + TIMEOUT_S;
 
 #ifdef DEBUG_CP210X
        printc(__FILE__": %s : read max %d\n", __FUNCTION__, max_len);
 #endif
 
-       rlen = usb_bulk_read(tr->handle, V1_IN_EP, (char *)databuf,
-                            max_len, TIMEOUT);
+       while (time(NULL) < deadline) {
+               rlen = usb_bulk_read(tr->handle, V1_IN_EP, (char *)databuf,
+                                    max_len, TIMEOUT_S * 1000);
 
 #ifdef DEBUG_CP210X
-       printc(__FILE__": %s : read %d\n", __FUNCTION__, rlen);
+               printc(__FILE__": %s : read %d\n", __FUNCTION__, rlen);
 #endif
 
-       if (rlen <= 0) {
-               pr_error(__FILE__": can't receive data");
-               return -1;
-       }
+               if (rlen < 0) {
+                       pr_error(__FILE__": can't receive data");
+                       return -1;
+               }
 
+               if (rlen > 0) {
 #ifdef DEBUG_CP210X
-       debug_hexdump(__FILE__": USB transfer in", databuf, rlen);
+                       debug_hexdump(__FILE__": USB transfer in", databuf, 
rlen);
 #endif
+                       return rlen;
+               }
+       }
 
-       return rlen;
+       pr_error(__FILE__": read operation timed out");
+       return -1;
 }
 
 static void usbtr_destroy(transport_t tr_base)

------------------------------------------------------------------------------
Get 100% visibility into Java/.NET code with AppDynamics Lite
It's a free troubleshooting tool designed for production
Get down to code-level detail for bottlenecks, with <2% overhead.
Download for free and get started troubleshooting in minutes.
http://p.sf.net/sfu/appdyn_d2d_ap2
_______________________________________________
Mspgcc-users mailing list
Mspgcc-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mspgcc-users

Reply via email to