diff options
| author | michael-west <michael.west@ettus.com> | 2017-01-23 16:32:27 -0800 | 
|---|---|---|
| committer | Martin Braun <martin.braun@ettus.com> | 2017-01-26 08:35:33 +0100 | 
| commit | b99f94f65040363b25dc2db18b1d2b6a8575457f (patch) | |
| tree | aa1422c96925c5d2118a4e927929b8f3d0cad5e2 /host/lib | |
| parent | 457e94dd2be98dece8215b993d94a11af55cba96 (diff) | |
| download | uhd-b99f94f65040363b25dc2db18b1d2b6a8575457f.tar.gz uhd-b99f94f65040363b25dc2db18b1d2b6a8575457f.tar.bz2 uhd-b99f94f65040363b25dc2db18b1d2b6a8575457f.zip  | |
X300: Fix issue with GPSDO sometimes not being recognized properly
Diffstat (limited to 'host/lib')
| -rw-r--r-- | host/lib/usrp/x300/x300_fw_uart.cpp | 33 | 
1 files changed, 23 insertions, 10 deletions
diff --git a/host/lib/usrp/x300/x300_fw_uart.cpp b/host/lib/usrp/x300/x300_fw_uart.cpp index 6e7425c4d..a2cbcc908 100644 --- a/host/lib/usrp/x300/x300_fw_uart.cpp +++ b/host/lib/usrp/x300/x300_fw_uart.cpp @@ -76,8 +76,9 @@ struct x300_uart_iface : uart_iface          if (rxoffset == _last_device_rxoffset)              return -1; +        int ret = static_cast<int>(_rxcache[((rxoffset)/4) % poolsize] >> ((rxoffset%4)*8) & 0xFF);          rxoffset++; -        return static_cast<int>(_rxcache[(rxoffset/4) % poolsize] >> ((rxoffset%4)*8) & 0xFF); +        return ret;      }      void update_cache(void) @@ -91,30 +92,42 @@ struct x300_uart_iface : uart_iface              {                  // all the data is new - reload the entire cache                  for (uint32_t i = 0; i < poolsize; i++) +                {                      _rxcache[i] = _iface->peek32(SR_ADDR(rxpool, i)); +                } + +                // set the head to the same character as the current device +                // offset (tail) one loop earlier +                rxoffset = device_rxoffset - (poolsize*4); + +                // set the tail to the current device offset +                _last_device_rxoffset = device_rxoffset; -                // set rxoffset to the end of the first string -                rxoffset = device_rxoffset - (poolsize*4) + 1; -                while (static_cast<char>((_rxcache[(rxoffset/4) % poolsize] >> ((rxoffset%4)*8) & 0xFF)) != '\n') -                    ++rxoffset; +                // the string at the head is a partial, so skip it +                for (int c = getchar(); c != '\n' and c != -1; c = getchar()) {} -                // clear the partial string in the buffer; +                // clear the partial string in the buffer, if any                  _rxbuff.clear();              }              else if (rxoffset == _last_device_rxoffset)              {                  // new data was added - refresh the portion of the cache that was updated -                for (uint32_t i = ((_last_device_rxoffset+1)/4) % poolsize; i != (((device_rxoffset)/4)+1) % poolsize; i = (i+1) % poolsize) +                for (uint32_t i = (_last_device_rxoffset/4) % poolsize; +                        i != ((device_rxoffset/4)+1) % poolsize; +                        i = (i+1) % poolsize)                  {                      _rxcache[i] = _iface->peek32(SR_ADDR(rxpool, i));                  } -            } else { + +                // set the tail to the current device offset +                _last_device_rxoffset = device_rxoffset; +            } +            else +            {                  // there is new data, but we aren't done with what we have - check back later                  break;              } -            _last_device_rxoffset = device_rxoffset; -              // check again to see if anything changed while we were updating the cache              device_rxoffset = _iface->peek32(SR_ADDR(X300_FW_SHMEM_BASE, X300_FW_SHMEM_UART_RX_INDEX));              delta = device_rxoffset - rxoffset;  | 
