libftdi Archives

Subject: RE: Release 0.15 and the ft2232 data loss.

From: "David Challis" <dchallis@xxxxxxxxxxxxx>
To: <libftdi@xxxxxxxxxxxxxxxxxxxxxxx>
Date: Sat, 21 Mar 2009 15:49:44 -0700

Ok, I think I understand more about what is going on.  In the ftdi_read_data() function:

 

        if (ret > 2) {

            // skip FTDI status bytes.

            // Maybe stored in the future to enable modem use

            num_of_chunks = ret / 64;

            chunk_remains = ret % 64;

            //printf("ret = %X, num_of_chunks = %X, chunk_remains = %X, readbuffer_offset = %X\n", ret, num_of_chunks, chunk_remains, ftdi->readbuffer_offset);

 

            ftdi->readbuffer_offset += 2;

            ret -= 2;

 

            if (ret > 62) {

                for (i = 1; i < num_of_chunks; i++)

                    memmove (ftdi->readbuffer+ftdi->readbuffer_offset+62*i,

                             ftdi->readbuffer+ftdi->readbuffer_offset+64*i,

                             62);

                if (chunk_remains > 2) {

                    memmove (ftdi->readbuffer+ftdi->readbuffer_offset+62*i,

                             ftdi->readbuffer+ftdi->readbuffer_offset+64*i,

                             chunk_remains-2);

                    ret -= 2*num_of_chunks;

                } else

                    ret -= 2*(num_of_chunks-1)+chunk_remains;

            }

        } else if (ret <= 2) {

            // no more data to read?

            return offset;

        }

 

The code assumes that there will be a modem status byte pair for every 64 bytes returned by the ftdi chip.  For the ft245BL, this is true.  For the ft2232H, it appears that the modem status bytes are returned only once per usb_bulk_read call. Setting a break at “if (ret > 2)”, I examine the results of the bulk_read.  There are 106 bytes total.  The first two bytes are the modem status bytes as expected.  The remaining 104 bytes are the data sent from my device, with no additional modem status bytes embedded in the stream.  Thus, as the code stands now, it will delete bytes 65 and 66, thinking that they are modem status bytes, when in fact they are not.

 

Could this be the issue?  Is there anything else I can do on my end to prove this out?  What would be the suggested fix?

 

Thanks,

 

Dave Challis

 

 

 



libftdi - see http://www.intra2net.com/en/developer/libftdi for details.
To unsubscribe send a mail to libftdi+unsubscribe@xxxxxxxxxxxxxxxxxxxxxxx


Current Thread