Hi Geert,

Sorry to bother you!
qspi_transfer_in() does:

         while (n > 0) {
                 len = qspi_set_receive_trigger(rspi, n);
                 // len will be <= n
I agree. This is len = min value of n and 32.
                 if (len == QSPI_BUFFER_SIZE) {
                         // receive blocks of len bytes
Yes, This is len == 32 bytes
                         ...
                 } else {
                         // receive n (not len) bytes
This is always n == len ( This case, len or n is always < 32)
Because this is the last n bytes should be received.

                         ret = rspi_pio_transfer(rspi, NULL, rx, n);
                         //
                         if (ret < 0)
                                 return ret;
                         // bogus write (which your patch removes: OK)
                         *rx++ = ret;
I agree. This code needs to be removed.

                         // here we should also return (see below why)
                         // (in qspi_transfer_out() we should "break")
                 }
                 // Either we received a block of len bytes
                 // or we received n bytes, and the below is wrong if len < n!
                 n -= len;
                 // If len was < n, n will be non-zero, and we will receive more
                 // bytes in the next iteration
I am sorry, I don't understand your opinion here also.
The following is my opinion:

In case of receiving n bytes data > 32 bytes (Ex: n= 50bytes)
The first loop, n= 50,and len = 32 bytes by getting min value of 50 and 32 from qspi_set_receive_trigger()
(this case was n < len).
Then it receives 32 bytes in "if (len == QSPI_BUFFER_SIZE)" statement.
After received 32bytes of data, n -= len is implemented. It means n =(n - len) = (50-32)= 18 bytes.
The first loop finished.

The second loop, n=18 bytes, and len = 18 bytes by getting min value of 32 and 18 from qspi_set_receive_trigger(). This time, 'else' statement would be implemented. *rx pointer was increased into rspi_pio_transfer() After received the last 18 bytes of data into 'else' statement, n -=len was implemented again.
It means n = (n - len) = (18 -18) = 0 byte.
The second loop finished.

This time n = 0, Completed receiving data.

In case of receiving n bytes data < 32 bytes  (Ex: n= 20 bytes).
It's the same with the second loop above.

Thank you.
Hiep.


Reply via email to