<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/13663">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Harald Welte: Looks good to me, approved
  Pau Espin Pedrol: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">lms: add device type detection and device specific gains<br><br>add device dependant max gain setup - limesdr mini and limenet micro need slightly reduced maximum gains to get a PASS on phase error measurements<br>rework clock reference setup - external clock needs to be selected before calling LMS_Init(), internal can only be set after.<br>remove now unused compat_LMS_VCTCXO* functions - we do not set the VCTXCO directly anymore<br><br>Change-Id: I3cf905b0a84bc1ec200891762a6646141ee37181<br>---<br>M Transceiver52M/device/lms/LMSDevice.cpp<br>M Transceiver52M/device/lms/LMSDevice.h<br>M configure.ac<br>3 files changed, 40 insertions(+), 58 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/Transceiver52M/device/lms/LMSDevice.cpp b/Transceiver52M/device/lms/LMSDevice.cpp</span><br><span>index 083b88e..34ad6e8 100644</span><br><span>--- a/Transceiver52M/device/lms/LMSDevice.cpp</span><br><span>+++ b/Transceiver52M/device/lms/LMSDevice.cpp</span><br><span>@@ -41,24 +41,6 @@</span><br><span> #define LMS_MIN_BW_SUPPORTED 2.5e6 /* 2.5mHz, minimum supported by LMS */</span><br><span> #define LMS_CALIBRATE_BW_HZ OSMO_MAX(GSM_CARRIER_BW, LMS_MIN_BW_SUPPORTED)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int compat_LMS_VCTCXORead(lms_device_t *dev, uint16_t *val, bool memory)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-#if HAVE_LMS_VCTCXO_EEPROM_SAVING</span><br><span style="color: hsl(0, 100%, 40%);">-   return LMS_VCTCXORead(dev, val, memory);</span><br><span style="color: hsl(0, 100%, 40%);">-#else</span><br><span style="color: hsl(0, 100%, 40%);">-   return LMS_VCTCXORead(dev, val);</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int compat_LMS_VCTCXOWrite(lms_device_t *dev, uint16_t val, bool memory)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-#if HAVE_LMS_VCTCXO_EEPROM_SAVING</span><br><span style="color: hsl(0, 100%, 40%);">-        return LMS_VCTCXOWrite(dev, val, memory);</span><br><span style="color: hsl(0, 100%, 40%);">-#else</span><br><span style="color: hsl(0, 100%, 40%);">-  return LMS_VCTCXOWrite(dev, val);</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> LMSDevice::LMSDevice(size_t tx_sps, size_t rx_sps, InterfaceType iface, size_t chans, double lo_offset,</span><br><span>               const std::vector<std::string>& tx_paths,</span><br><span>                  const std::vector<std::string>& rx_paths):</span><br><span>@@ -151,11 +133,10 @@</span><br><span> </span><br><span> int LMSDevice::open(const std::string &args, int ref, bool swap_channels)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     //lms_info_str_t dev_str;</span><br><span>    lms_info_str_t* info_list;</span><br><span style="color: hsl(120, 100%, 40%);">+    const lms_dev_info_t* device_info;</span><br><span>   lms_range_t range_sr;</span><br><span>        float_type sr_host, sr_rf;</span><br><span style="color: hsl(0, 100%, 40%);">-      uint16_t dac_val;</span><br><span>    unsigned int i, n;</span><br><span>   int rc, dev_id;</span><br><span> </span><br><span>@@ -194,12 +175,45 @@</span><br><span> </span><br><span>      delete [] info_list;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+      device_info = LMS_GetDeviceInfo(m_lms_dev);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if ((ref != REF_EXTERNAL) && (ref != REF_INTERNAL)){</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGC(DDEV, ERROR) << "Invalid reference type";</span><br><span style="color: hsl(120, 100%, 40%);">+                goto out_close;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* if reference clock is external setup must happen _before_ calling LMS_Init */</span><br><span style="color: hsl(120, 100%, 40%);">+      /* FIXME make external reference frequency configurable */</span><br><span style="color: hsl(120, 100%, 40%);">+    if (ref == REF_EXTERNAL) {</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGC(DDEV, INFO) << "Setting External clock reference to 10MHz";</span><br><span style="color: hsl(120, 100%, 40%);">+              /* Assume an external 10 MHz reference clock */</span><br><span style="color: hsl(120, 100%, 40%);">+               if (LMS_SetClockFreq(m_lms_dev, LMS_CLOCK_EXTREF, 10000000.0) < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                 goto out_close;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  LOGC(DDEV, INFO) << "Init LMS device";</span><br><span>       if (LMS_Init(m_lms_dev) != 0) {</span><br><span>              LOGC(DDEV, ERROR) << "LMS_Init() failed";</span><br><span>            goto out_close;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* LimeSDR-Mini does not have switches but needs soldering to select external/internal clock */</span><br><span style="color: hsl(120, 100%, 40%);">+       /* LimeNET-Micro also does not like selecting internal clock*/</span><br><span style="color: hsl(120, 100%, 40%);">+        /* also set device specific maximum tx levels selected by phasenoise measurements*/</span><br><span style="color: hsl(120, 100%, 40%);">+   if (strncmp(device_info->deviceName,"LimeSDR-USB",11) == 0){</span><br><span style="color: hsl(120, 100%, 40%);">+             /* if reference clock is internal setup must happen _after_ calling LMS_Init */</span><br><span style="color: hsl(120, 100%, 40%);">+               /* according to lms using LMS_CLOCK_EXTREF with a frequency <= 0 is the correct way to set clock to internal reference*/</span><br><span style="color: hsl(120, 100%, 40%);">+           if (ref == REF_INTERNAL) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    LOGC(DDEV, INFO) << "Setting Internal clock reference";</span><br><span style="color: hsl(120, 100%, 40%);">+                       if (LMS_SetClockFreq(m_lms_dev, LMS_CLOCK_EXTREF, -1) < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                         goto out_close;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+             maxTxGainClamp = 73.0;</span><br><span style="color: hsl(120, 100%, 40%);">+        } else if (strncmp(device_info->deviceName,"LimeSDR-Mini",12) == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+              maxTxGainClamp = 66.0;</span><br><span style="color: hsl(120, 100%, 40%);">+        else</span><br><span style="color: hsl(120, 100%, 40%);">+          maxTxGainClamp = 71.0; /* "LimeNET-Micro", etc FIXME pciE based LMS boards?*/</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    /* enable all used channels */</span><br><span>       for (i=0; i<chans; i++) {</span><br><span>                 if (LMS_EnableChannel(m_lms_dev, LMS_CH_RX, i, true) < 0)</span><br><span>@@ -223,27 +237,6 @@</span><br><span>  /* FIXME: make this device/model dependent, like UHDDevice:dev_param_map! */</span><br><span>         ts_offset = static_cast<TIMESTAMP>(8.9e-5 * GSMRATE * tx_sps); /* time * sample_rate */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       switch (ref) {</span><br><span style="color: hsl(0, 100%, 40%);">-  case REF_INTERNAL:</span><br><span style="color: hsl(0, 100%, 40%);">-              LOGC(DDEV, INFO) << "Setting Internal clock reference";</span><br><span style="color: hsl(0, 100%, 40%);">-         /* Ugly API: Selecting clock source implicit by writing to VCTCXO DAC ?!? */</span><br><span style="color: hsl(0, 100%, 40%);">-            if (compat_LMS_VCTCXORead(m_lms_dev, &dac_val, false) < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                       goto out_close;</span><br><span style="color: hsl(0, 100%, 40%);">-         LOGC(DDEV, INFO) << "Setting VCTCXO to " << dac_val;</span><br><span style="color: hsl(0, 100%, 40%);">-              if (compat_LMS_VCTCXOWrite(m_lms_dev, dac_val, false) < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                   goto out_close;</span><br><span style="color: hsl(0, 100%, 40%);">-         break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case REF_EXTERNAL:</span><br><span style="color: hsl(0, 100%, 40%);">-              LOGC(DDEV, INFO) << "Setting External clock reference to " << 10000000.0;</span><br><span style="color: hsl(0, 100%, 40%);">-         /* Assume an external 10 MHz reference clock */</span><br><span style="color: hsl(0, 100%, 40%);">-         if (LMS_SetClockFreq(m_lms_dev, LMS_CLOCK_EXTREF, 10000000.0) < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                   goto out_close;</span><br><span style="color: hsl(0, 100%, 40%);">-         break;</span><br><span style="color: hsl(0, 100%, 40%);">-  default:</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGC(DDEV, ALERT) << "Invalid reference type";</span><br><span style="color: hsl(0, 100%, 40%);">-          goto out_close;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>    if (!set_antennas()) {</span><br><span>               LOGC(DDEV, ALERT) << "LMS antenna setting failed";</span><br><span>           return -1;</span><br><span>@@ -275,8 +268,10 @@</span><br><span> </span><br><span>        /* configure the channels/streams */</span><br><span>         for (i=0; i<chans; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-            // Set gains to midpoint</span><br><span style="color: hsl(0, 100%, 40%);">-                setTxGain((minTxGain() + maxTxGain()) / 2, i);</span><br><span style="color: hsl(120, 100%, 40%);">+                /* Set gains for calibration/filter setup */</span><br><span style="color: hsl(120, 100%, 40%);">+          /* TX gain to maximum */</span><br><span style="color: hsl(120, 100%, 40%);">+              setTxGain(maxTxGain(), i);</span><br><span style="color: hsl(120, 100%, 40%);">+            /* RX gain to midpoint */</span><br><span>            setRxGain((minRxGain() + maxRxGain()) / 2, i);</span><br><span> </span><br><span>           /* set up Rx and Tx filters */</span><br><span>@@ -385,7 +380,7 @@</span><br><span> </span><br><span> double LMSDevice::maxTxGain()</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  return 73.0;</span><br><span style="color: hsl(120, 100%, 40%);">+  return maxTxGainClamp;</span><br><span> }</span><br><span> </span><br><span> double LMSDevice::minTxGain()</span><br><span>diff --git a/Transceiver52M/device/lms/LMSDevice.h b/Transceiver52M/device/lms/LMSDevice.h</span><br><span>index 67f4691..d1cb12a 100644</span><br><span>--- a/Transceiver52M/device/lms/LMSDevice.h</span><br><span>+++ b/Transceiver52M/device/lms/LMSDevice.h</span><br><span>@@ -64,6 +64,7 @@</span><br><span>        TIMESTAMP ts_initial, ts_offset;</span><br><span> </span><br><span>         double rxGain;</span><br><span style="color: hsl(120, 100%, 40%);">+        double maxTxGainClamp;</span><br><span> </span><br><span>   bool do_calib(size_t chan);</span><br><span>  bool do_filters(size_t chan);</span><br><span>diff --git a/configure.ac b/configure.ac</span><br><span>index 2ce4462..bd421aa 100644</span><br><span>--- a/configure.ac</span><br><span>+++ b/configure.ac</span><br><span>@@ -162,20 +162,6 @@</span><br><span> </span><br><span> AS_IF([test "x$with_lms" = "xyes"], [</span><br><span>     PKG_CHECK_MODULES(LMS, LimeSuite)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    # LimeSuite dc124e4e2ed9b549b142410af172f0592f9f0c23 > 18.10 broke API compatibility:</span><br><span style="color: hsl(0, 100%, 40%);">-    _cflags_save=$CFLAGS</span><br><span style="color: hsl(0, 100%, 40%);">-    CFLAGS="$CFLAGS $LMS_CFLAGS"</span><br><span style="color: hsl(0, 100%, 40%);">-    AC_COMPILE_IFELSE(</span><br><span style="color: hsl(0, 100%, 40%);">-        [AC_LANG_PROGRAM(</span><br><span style="color: hsl(0, 100%, 40%);">-            [[#include <lime/LimeSuite.h>]],</span><br><span style="color: hsl(0, 100%, 40%);">-            [[LMS_VCTCXOWrite(NULL, 0, false); LMS_VCTCXORead(NULL, 0, false);]]</span><br><span style="color: hsl(0, 100%, 40%);">-        )],</span><br><span style="color: hsl(0, 100%, 40%);">-        [AC_DEFINE([HAVE_LMS_VCTCXO_EEPROM_SAVING], [1],</span><br><span style="color: hsl(0, 100%, 40%);">-            [LMS_VCTCXO* requires memory parameter])],</span><br><span style="color: hsl(0, 100%, 40%);">-        [AC_DEFINE([HAVE_LMS_VCTCXO_EEPROM_SAVING], [0],</span><br><span style="color: hsl(0, 100%, 40%);">-            [LMS_VCTCXO* has no memory parameter])])</span><br><span style="color: hsl(0, 100%, 40%);">-    CFLAGS=$_cflags_save</span><br><span> ])</span><br><span> </span><br><span> AS_IF([test "x$with_uhd" != "xno"],[</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/13663">change 13663</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/13663"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-trx </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I3cf905b0a84bc1ec200891762a6646141ee37181 </div>
<div style="display:none"> Gerrit-Change-Number: 13663 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </div>
<div style="display:none"> Gerrit-Owner: roh <jsteiger@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>
<div style="display:none"> Gerrit-Reviewer: Pau Espin Pedrol <pespin@sysmocom.de> </div>