<p>Vadim Yanitskiy has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/12887">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">firmware: implement reading of factory RF calibration values<br><br>Since If6e212baeb10953129fb0d5253d263567f5e12d6, we can read the TIFFS<br>file-system, thus we can read and use the factory RF calibration values.<br><br>  * Implement parsing of factory RF calibration values for Motorola C1xx,<br>    Openmoko GTA0x, Pirelli DP-L10, and upcoming FCDEV3B targets.<br><br>  * Remove the old Tx power level control code and tables, and replace<br>    them with new logic that exactly matches what the official chipset<br>    firmware (TI/FreeCalypso) does, using tables in TI/FreeCalypso<br>    format. Compiled-in tables serve as a fallback and match each<br>    target's respective original firmware.<br><br>  * Use individual AFC slope values for different targets. The original<br>    value was/is only correct for the Mot C1xx family, whereas<br>    GTA0x/FCDEV3B and Pirelli DP-L10 need different values because<br>    Openmoko's VCXO (copied on the FCDEV3B) and Pirelli's VCTCXO<br>    are different from what Motorola used.<br><br>  * Take the initial AFC DAC value for the FB search from factory<br>    calibration records on those targets on which it has been<br>    calibrated per unit at the factory.<br><br>Change-Id: Icf2693b751d86ec1d2563412d606c13d4c91a806<br>Related: OS#3582<br>---<br>M src/target/firmware/Makefile<br>M src/target/firmware/apps/layer1/main.c<br>M src/target/firmware/apps/rssi/main.c<br>A src/target/firmware/board/common/readcal_dummy.c<br>A src/target/firmware/board/common/readcal_tiffs.c<br>A src/target/firmware/board/common/rf_tables.c<br>A src/target/firmware/board/compal/readcal_common.c<br>A src/target/firmware/board/compal/readcal_small.c<br>A src/target/firmware/board/compal/rf_tables.c<br>A src/target/firmware/board/compal_e99/readcal.c<br>M src/target/firmware/board/gta0x/init.c<br>A src/target/firmware/board/gta0x/rf_tables.c<br>A src/target/firmware/board/pirelli_dpl10/readcal.c<br>A src/target/firmware/board/pirelli_dpl10/rf_tables.c<br>D src/target/firmware/include/layer1/apc.h<br>A src/target/firmware/include/rf/readcal.h<br>A src/target/firmware/include/rf/txcal.h<br>A src/target/firmware/include/rf/vcxocal.h<br>M src/target/firmware/layer1/Makefile<br>M src/target/firmware/layer1/afc.c<br>D src/target/firmware/layer1/apc.c<br>M src/target/firmware/layer1/sync.c<br>22 files changed, 2,495 insertions(+), 92 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/87/12887/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/target/firmware/Makefile b/src/target/firmware/Makefile</span><br><span>index 0a928ce..46a8fb1 100644</span><br><span>--- a/src/target/firmware/Makefile</span><br><span>+++ b/src/target/firmware/Makefile</span><br><span>@@ -38,44 +38,48 @@</span><br><span> FB_dummy_OBJS=$(FB_OBJS) fb/fb_dummy.o</span><br><span> </span><br><span> # TI Calypso</span><br><span style="color: hsl(0, 100%, 40%);">-calypso_COMMON_OBJS=board/common/calypso_uart.o board/common/calypso_pwl.o</span><br><span style="color: hsl(120, 100%, 40%);">+calypso_COMMON_OBJS=board/common/calypso_uart.o \</span><br><span style="color: hsl(120, 100%, 40%);">+  board/common/calypso_pwl.o board/common/rf_tables.o</span><br><span> </span><br><span> # OpenMoko GTA0x</span><br><span> BOARD_gta0x_OBJS=$(calypso_COMMON_OBJS) board/gta0x/init.o \</span><br><span style="color: hsl(0, 100%, 40%);">-     board/gta0x/rffe_gta0x_triband.o board/gta0x/rf_power.o \</span><br><span style="color: hsl(0, 100%, 40%);">-       battery/dummy.o $(FB_dummy_OBJS)</span><br><span style="color: hsl(120, 100%, 40%);">+      board/gta0x/rffe_gta0x_triband.o board/gta0x/rf_tables.o \</span><br><span style="color: hsl(120, 100%, 40%);">+    board/common/readcal_tiffs.o battery/dummy.o $(FB_dummy_OBJS)</span><br><span> BOARD_gta0x_ENVIRONMENTS=highram</span><br><span> </span><br><span> # Pirelli DP-L10</span><br><span> BOARD_pirelli_dpl10_OBJS=$(calypso_COMMON_OBJS) board/pirelli_dpl10/init.o \</span><br><span style="color: hsl(0, 100%, 40%);">-       board/pirelli_dpl10/rffe_dpl10_triband.o board/pirelli_dpl10/rf_power.o \</span><br><span style="color: hsl(120, 100%, 40%);">+     board/pirelli_dpl10/rffe_dpl10_triband.o \</span><br><span style="color: hsl(120, 100%, 40%);">+    board/pirelli_dpl10/rf_tables.o board/pirelli_dpl10/readcal.o \</span><br><span>      battery/dummy.o $(FB_dpl10_OBJS)</span><br><span> BOARD_pirelli_dpl10_ENVIRONMENTS=highram</span><br><span> </span><br><span> # Compal Generic</span><br><span> compal_COMMON_OBJS=$(calypso_COMMON_OBJS) \</span><br><span style="color: hsl(0, 100%, 40%);">-     board/compal/rffe_dualband.o board/compal/rf_power.o</span><br><span style="color: hsl(120, 100%, 40%);">+  board/compal/rffe_dualband.o board/compal/rf_tables.o \</span><br><span style="color: hsl(120, 100%, 40%);">+       board/compal/readcal_common.o</span><br><span> compal_COMMON_ENVIRONMENTS=compalram highram</span><br><span> </span><br><span> # Compal E88</span><br><span> BOARD_compal_e88_OBJS=$(compal_COMMON_OBJS) board/compal_e88/init.o \</span><br><span style="color: hsl(0, 100%, 40%);">-      battery/compal_e88.o $(FB_e88_OBJS)</span><br><span style="color: hsl(120, 100%, 40%);">+   board/compal/readcal_small.o battery/compal_e88.o $(FB_e88_OBJS)</span><br><span> BOARD_compal_e88_ENVIRONMENTS=$(compal_COMMON_ENVIRONMENTS) e88loader e88flash</span><br><span> </span><br><span> # Compal E86 (has a different RFFE configuration)</span><br><span> BOARD_compal_e86_OBJS=$(calypso_COMMON_OBJS) board/compal_e86/init.o \</span><br><span style="color: hsl(0, 100%, 40%);">-   board/compal_e86/rffe_dualband_e86.o board/compal/rf_power.o \</span><br><span style="color: hsl(120, 100%, 40%);">+        board/compal_e86/rffe_dualband_e86.o board/compal/rf_tables.o \</span><br><span style="color: hsl(120, 100%, 40%);">+       board/compal/readcal_common.o board/compal/readcal_small.o \</span><br><span>         battery/dummy.o $(FB_e86_OBJS)</span><br><span> BOARD_compal_e86_ENVIRONMENTS=$(compal_COMMON_ENVIRONMENTS)</span><br><span> </span><br><span> # Compal E99</span><br><span> BOARD_compal_e99_OBJS=$(compal_COMMON_OBJS) board/compal_e99/init.o \</span><br><span style="color: hsl(0, 100%, 40%);">-      battery/dummy.o $(FB_e99_OBJS)</span><br><span style="color: hsl(120, 100%, 40%);">+        board/compal_e99/readcal.o battery/dummy.o $(FB_e99_OBJS)</span><br><span> BOARD_compal_e99_ENVIRONMENTS=$(compal_COMMON_ENVIRONMENTS)</span><br><span> </span><br><span> # Sony Ericsson J100 (made by Compal)</span><br><span> BOARD_se_j100_OBJS=$(compal_COMMON_OBJS) board/se_j100/init.o \</span><br><span style="color: hsl(0, 100%, 40%);">-        battery/dummy.o $(FB_j100_OBJS)</span><br><span style="color: hsl(120, 100%, 40%);">+       board/common/readcal_dummy.o battery/dummy.o $(FB_j100_OBJS)</span><br><span> BOARD_se_j100_ENVIRONMENTS=$(compal_COMMON_ENVIRONMENTS)</span><br><span> </span><br><span> </span><br><span>diff --git a/src/target/firmware/apps/layer1/main.c b/src/target/firmware/apps/layer1/main.c</span><br><span>index 59ffe97..b2e66e2 100644</span><br><span>--- a/src/target/firmware/apps/layer1/main.c</span><br><span>+++ b/src/target/firmware/apps/layer1/main.c</span><br><span>@@ -33,6 +33,7 @@</span><br><span> </span><br><span> #include <abb/twl3025.h></span><br><span> #include <rf/trf6151.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <rf/readcal.h></span><br><span> </span><br><span> #include <comm/sercomm.h></span><br><span> #include <comm/timer.h></span><br><span>@@ -106,6 +107,7 @@</span><br><span>        memset(atr,0,sizeof(atr));</span><br><span>   atrLength = calypso_sim_powerup(atr);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+     read_factory_rf_calibration();</span><br><span>       layer1_init();</span><br><span> </span><br><span>   tpu_frame_irq_en(1, 1);</span><br><span>diff --git a/src/target/firmware/apps/rssi/main.c b/src/target/firmware/apps/rssi/main.c</span><br><span>index 5020486..1605f13 100644</span><br><span>--- a/src/target/firmware/apps/rssi/main.c</span><br><span>+++ b/src/target/firmware/apps/rssi/main.c</span><br><span>@@ -34,6 +34,7 @@</span><br><span> #include <board.h></span><br><span> #include <abb/twl3025.h></span><br><span> #include <rf/trf6151.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <rf/readcal.h></span><br><span> #include <calypso/clock.h></span><br><span> #include <calypso/tpu.h></span><br><span> #include <calypso/tsp.h></span><br><span>@@ -1528,6 +1529,7 @@</span><br><span>       sercomm_register_rx_cb(SC_DLCI_CONSOLE, console_rx_cb);</span><br><span>      sercomm_register_rx_cb(SC_DLCI_L1A_L23, l1a_l23_rx_cb);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   read_factory_rf_calibration();</span><br><span>       layer1_init();</span><br><span>       l1a_l23_tx_cb = l1a_l23_tx;</span><br><span> </span><br><span>diff --git a/src/target/firmware/board/common/readcal_dummy.c b/src/target/firmware/board/common/readcal_dummy.c</span><br><span>new file mode 100644</span><br><span>index 0000000..6156c5e</span><br><span>--- /dev/null</span><br><span>+++ b/src/target/firmware/board/common/readcal_dummy.c</span><br><span>@@ -0,0 +1,24 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2017 by Mychaela Falconia <mychaela.falconia@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 2 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU General Public License along</span><br><span style="color: hsl(120, 100%, 40%);">+ * with this program; if not, write to the Free Software Foundation, Inc.,</span><br><span style="color: hsl(120, 100%, 40%);">+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <rf/readcal.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void read_factory_rf_calibration(void) { }</span><br><span>diff --git a/src/target/firmware/board/common/readcal_tiffs.c b/src/target/firmware/board/common/readcal_tiffs.c</span><br><span>new file mode 100644</span><br><span>index 0000000..5a521e6</span><br><span>--- /dev/null</span><br><span>+++ b/src/target/firmware/board/common/readcal_tiffs.c</span><br><span>@@ -0,0 +1,78 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2017 by Mychaela Falconia <mychaela.falconia@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+ * Tweaked (coding style changes) by Vadim Yanitskiy <axilirator@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 2 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU General Public License along</span><br><span style="color: hsl(120, 100%, 40%);">+ * with this program; if not, write to the Free Software Foundation, Inc.,</span><br><span style="color: hsl(120, 100%, 40%);">+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdio.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdint.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <string.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <rf/readcal.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <rf/vcxocal.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <rf/txcal.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <tiffs.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int16_t afcdac_shifted;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void afcdac_postproc(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  afc_initial_dac_value = afcdac_shifted >> 3;</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%);">+static const struct calmap {</span><br><span style="color: hsl(120, 100%, 40%);">+ char    *pathname;</span><br><span style="color: hsl(120, 100%, 40%);">+    size_t  record_len;</span><br><span style="color: hsl(120, 100%, 40%);">+   void    *buffer;</span><br><span style="color: hsl(120, 100%, 40%);">+      void    (*postproc)(void);</span><br><span style="color: hsl(120, 100%, 40%);">+} rf_cal_list[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+       { "/gsm/rf/afcdac",          2,   &afcdac_shifted,     afcdac_postproc },</span><br><span style="color: hsl(120, 100%, 40%);">+       { "/gsm/rf/tx/ramps.850",    512, rf_tx_ramps_850,     NULL },</span><br><span style="color: hsl(120, 100%, 40%);">+      { "/gsm/rf/tx/levels.850",   128, rf_tx_levels_850,    NULL },</span><br><span style="color: hsl(120, 100%, 40%);">+      { "/gsm/rf/tx/calchan.850",  128, rf_tx_chan_cal_850,  NULL },</span><br><span style="color: hsl(120, 100%, 40%);">+      { "/gsm/rf/tx/ramps.900",    512, rf_tx_ramps_900,     NULL },</span><br><span style="color: hsl(120, 100%, 40%);">+      { "/gsm/rf/tx/levels.900",   128, rf_tx_levels_900,    NULL },</span><br><span style="color: hsl(120, 100%, 40%);">+      { "/gsm/rf/tx/calchan.900",  128, rf_tx_chan_cal_900,  NULL },</span><br><span style="color: hsl(120, 100%, 40%);">+      { "/gsm/rf/tx/ramps.1800",   512, rf_tx_ramps_1800,    NULL },</span><br><span style="color: hsl(120, 100%, 40%);">+      { "/gsm/rf/tx/levels.1800",  128, rf_tx_levels_1800,   NULL },</span><br><span style="color: hsl(120, 100%, 40%);">+      { "/gsm/rf/tx/calchan.1800", 128, rf_tx_chan_cal_1800, NULL },</span><br><span style="color: hsl(120, 100%, 40%);">+      { "/gsm/rf/tx/ramps.1900",   512, rf_tx_ramps_1900,    NULL },</span><br><span style="color: hsl(120, 100%, 40%);">+      { "/gsm/rf/tx/levels.1900",  128, rf_tx_levels_1900,   NULL },</span><br><span style="color: hsl(120, 100%, 40%);">+      { "/gsm/rf/tx/calchan.1900", 128, rf_tx_chan_cal_1900, NULL },</span><br><span style="color: hsl(120, 100%, 40%);">+      { NULL,                      0,   NULL,                NULL }</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%);">+void read_factory_rf_calibration(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        const struct calmap *tp;</span><br><span style="color: hsl(120, 100%, 40%);">+      uint8_t buf[512];</span><br><span style="color: hsl(120, 100%, 40%);">+     int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     puts("Checking TIFFS for the RF calibration records\n");</span><br><span style="color: hsl(120, 100%, 40%);">+    for (tp = rf_cal_list; tp->pathname; tp++) {</span><br><span style="color: hsl(120, 100%, 40%);">+               rc = tiffs_read_file_fixedlen(tp->pathname, buf,</span><br><span style="color: hsl(120, 100%, 40%);">+                                         tp->record_len);</span><br><span style="color: hsl(120, 100%, 40%);">+             if (rc <= 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                       continue;</span><br><span style="color: hsl(120, 100%, 40%);">+             printf("Found '%s', applying\n", tp->pathname);</span><br><span style="color: hsl(120, 100%, 40%);">+          memcpy(tp->buffer, buf, tp->record_len);</span><br><span style="color: hsl(120, 100%, 40%);">+                if (tp->postproc)</span><br><span style="color: hsl(120, 100%, 40%);">+                  tp->postproc();</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/target/firmware/board/common/rf_tables.c b/src/target/firmware/board/common/rf_tables.c</span><br><span>new file mode 100644</span><br><span>index 0000000..27ef546</span><br><span>--- /dev/null</span><br><span>+++ b/src/target/firmware/board/common/rf_tables.c</span><br><span>@@ -0,0 +1,209 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2017 by Mychaela Falconia <mychaela.falconia@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+ * Tweaked (coding style changes) by Vadim Yanitskiy <axilirator@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 2 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU General Public License along</span><br><span style="color: hsl(120, 100%, 40%);">+ * with this program; if not, write to the Free Software Foundation, Inc.,</span><br><span style="color: hsl(120, 100%, 40%);">+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdint.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <rf/txcal.h></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%);">+ * On the better FreeCalypso, Openmoko and Pirelli targets, the following</span><br><span style="color: hsl(120, 100%, 40%);">+ * Tx channel correction tables are placeholders to be overridden by</span><br><span style="color: hsl(120, 100%, 40%);">+ * per-unit calibration, but Compal did their Tx channel calibration</span><br><span style="color: hsl(120, 100%, 40%);">+ * in some different way which we haven't been able to grok, hence on</span><br><span style="color: hsl(120, 100%, 40%);">+ * these targets we currently always run with these dummy tables,</span><br><span style="color: hsl(120, 100%, 40%);">+ * and no channel-dependent corrections are applied.</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%);">+struct txcal_chan_cal rf_tx_chan_cal_850[RF_TX_CHAN_CAL_TABLE_SIZE]</span><br><span style="color: hsl(120, 100%, 40%);">+                                       [RF_TX_NUM_SUB_BANDS] = {</span><br><span style="color: hsl(120, 100%, 40%);">+     {</span><br><span style="color: hsl(120, 100%, 40%);">+             { 134, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 150, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 166, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 182, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 197, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 213, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 229, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 251, 128 },</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%);">+             { 134, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 150, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 166, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 182, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 197, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 213, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 229, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 251, 128 },</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%);">+             { 134, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 150, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 166, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 182, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 197, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 213, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 229, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 251, 128 },</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%);">+             { 134, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 150, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 166, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 182, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 197, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 213, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 229, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 251, 128 },</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct txcal_chan_cal rf_tx_chan_cal_900[RF_TX_CHAN_CAL_TABLE_SIZE]</span><br><span style="color: hsl(120, 100%, 40%);">+                                 [RF_TX_NUM_SUB_BANDS] = {</span><br><span style="color: hsl(120, 100%, 40%);">+     {</span><br><span style="color: hsl(120, 100%, 40%);">+             {   27, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+                {   47, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+                {   66, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+                {   85, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+                {  104, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+                {  124, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+                {  994, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+                { 1023, 128 },</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%);">+             {   27, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+                {   47, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+                {   66, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+                {   85, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+                {  104, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+                {  124, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+                {  994, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+                { 1023, 128 },</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%);">+             {   27, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+                {   47, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+                {   66, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+                {   85, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+                {  104, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+                {  124, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+                {  994, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+                { 1023, 128 },</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%);">+             {   27, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+                {   47, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+                {   66, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+                {   85, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+                {  104, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+                {  124, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+                {  994, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+                { 1023, 128 },</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct txcal_chan_cal rf_tx_chan_cal_1800[RF_TX_CHAN_CAL_TABLE_SIZE]</span><br><span style="color: hsl(120, 100%, 40%);">+                                         [RF_TX_NUM_SUB_BANDS] = {</span><br><span style="color: hsl(120, 100%, 40%);">+    {</span><br><span style="color: hsl(120, 100%, 40%);">+             { 553, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 594, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 636, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 677, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 720, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 760, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 802, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 885, 128 },</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%);">+             { 553, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 594, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 636, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 677, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 720, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 760, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 802, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 885, 128 },</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%);">+             { 553, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 594, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 636, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 677, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 720, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 760, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 802, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 885, 128 },</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%);">+             { 553, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 594, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 636, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 677, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 720, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 760, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 802, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 885, 128 },</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct txcal_chan_cal rf_tx_chan_cal_1900[RF_TX_CHAN_CAL_TABLE_SIZE]</span><br><span style="color: hsl(120, 100%, 40%);">+                                         [RF_TX_NUM_SUB_BANDS] = {</span><br><span style="color: hsl(120, 100%, 40%);">+    {</span><br><span style="color: hsl(120, 100%, 40%);">+             { 549, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 586, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 623, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 697, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 726, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 754, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 782, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 810, 128 },</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%);">+             { 549, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 586, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 623, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 697, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 726, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 754, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 782, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 810, 128 },</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%);">+             { 549, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 586, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 623, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 697, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 726, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 754, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 782, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 810, 128 },</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%);">+             { 549, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 586, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 623, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 697, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 726, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 754, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 782, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { 810, 128 },</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span>diff --git a/src/target/firmware/board/compal/readcal_common.c b/src/target/firmware/board/compal/readcal_common.c</span><br><span>new file mode 100644</span><br><span>index 0000000..1d847ce</span><br><span>--- /dev/null</span><br><span>+++ b/src/target/firmware/board/compal/readcal_common.c</span><br><span>@@ -0,0 +1,123 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2017 by Mychaela Falconia <mychaela.falconia@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+ * Tweaked (coding style changes) by Vadim Yanitskiy <axilirator@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 2 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU General Public License along</span><br><span style="color: hsl(120, 100%, 40%);">+ * with this program; if not, write to the Free Software Foundation, Inc.,</span><br><span style="color: hsl(120, 100%, 40%);">+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdio.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdint.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <string.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <inttypes.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <rf/txcal.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct record_hdr {</span><br><span style="color: hsl(120, 100%, 40%);">+        uint16_t valid_flag;</span><br><span style="color: hsl(120, 100%, 40%);">+  uint16_t type;</span><br><span style="color: hsl(120, 100%, 40%);">+        uint16_t native_len;</span><br><span style="color: hsl(120, 100%, 40%);">+  uint16_t rounded_len;</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%);">+static void apply_levels(struct txcal_tx_level *levels_table,</span><br><span style="color: hsl(120, 100%, 40%);">+                     uint16_t *compal_data, unsigned start_level,</span><br><span style="color: hsl(120, 100%, 40%);">+                  unsigned num_levels)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      unsigned n;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ for (n = 0; n < num_levels; n++)</span><br><span style="color: hsl(120, 100%, 40%);">+           levels_table[start_level + n].apc = *compal_data++;</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%);">+void read_compal_factory_records(uint32_t flash_addr)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct record_hdr *hdr;</span><br><span style="color: hsl(120, 100%, 40%);">+       void *p, *sector_end;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned p_incr;</span><br><span style="color: hsl(120, 100%, 40%);">+      void *payload;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      printf("Analyzing factory records sector "</span><br><span style="color: hsl(120, 100%, 40%);">+          "at 0x%" PRIx32 "\n", flash_addr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      p = (void *) flash_addr;</span><br><span style="color: hsl(120, 100%, 40%);">+      sector_end = p + 0x2000;</span><br><span style="color: hsl(120, 100%, 40%);">+      for (; p < sector_end; p += p_incr) {</span><br><span style="color: hsl(120, 100%, 40%);">+              if ((sector_end - p) < 12)</span><br><span style="color: hsl(120, 100%, 40%);">+                 break;</span><br><span style="color: hsl(120, 100%, 40%);">+                hdr = (struct record_hdr *)p;</span><br><span style="color: hsl(120, 100%, 40%);">+         if (hdr->valid_flag == 0xFFFF)       /* blank flash */</span><br><span style="color: hsl(120, 100%, 40%);">+                     break;</span><br><span style="color: hsl(120, 100%, 40%);">+                if (hdr->native_len > hdr->rounded_len) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    printf("Bad record at 0x%" PRIx32 ": native length "</span><br><span style="color: hsl(120, 100%, 40%);">+                              "> rounded length\n", (uint32_t) p);</span><br><span style="color: hsl(120, 100%, 40%);">+                     return;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+             if (hdr->rounded_len & 3) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    printf("Bad record at 0x%" PRIx32 ": rounded length "</span><br><span style="color: hsl(120, 100%, 40%);">+                             "is not aligned to 4\n", (uint32_t) p);</span><br><span style="color: hsl(120, 100%, 40%);">+                     return;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+             p_incr = hdr->rounded_len + 8;</span><br><span style="color: hsl(120, 100%, 40%);">+             if (p_incr > (sector_end - p)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   printf("Bad record at 0x%" PRIx32 ": rounded length "</span><br><span style="color: hsl(120, 100%, 40%);">+                             "spills past the end of the sector\n", (uint32_t) p);</span><br><span style="color: hsl(120, 100%, 40%);">+                       return;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+             if (hdr->valid_flag != 0x000C)</span><br><span style="color: hsl(120, 100%, 40%);">+                     continue;</span><br><span style="color: hsl(120, 100%, 40%);">+             payload = (void *)(hdr + 1);</span><br><span style="color: hsl(120, 100%, 40%);">+          switch (hdr->type) {</span><br><span style="color: hsl(120, 100%, 40%);">+               case 0x0000:</span><br><span style="color: hsl(120, 100%, 40%);">+                  if (hdr->native_len != 0x94)</span><br><span style="color: hsl(120, 100%, 40%);">+                               break;</span><br><span style="color: hsl(120, 100%, 40%);">+                        if (*(uint32_t *)(payload + 0x5C) != 0xAA)</span><br><span style="color: hsl(120, 100%, 40%);">+                            break;</span><br><span style="color: hsl(120, 100%, 40%);">+                        printf("Found 900 MHz band calibration record at "</span><br><span style="color: hsl(120, 100%, 40%);">+                          "0x%" PRIx32 ", applying\n", (uint32_t) p);</span><br><span style="color: hsl(120, 100%, 40%);">+                       apply_levels(rf_tx_levels_900, payload + 0x60, 5, 15);</span><br><span style="color: hsl(120, 100%, 40%);">+                        break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 0x0001:</span><br><span style="color: hsl(120, 100%, 40%);">+                  if (hdr->native_len != 0xC8)</span><br><span style="color: hsl(120, 100%, 40%);">+                               break;</span><br><span style="color: hsl(120, 100%, 40%);">+                        if (*(uint32_t *)(payload + 0x7C) != 0xAA)</span><br><span style="color: hsl(120, 100%, 40%);">+                            break;</span><br><span style="color: hsl(120, 100%, 40%);">+                        printf("Found 1800 MHz band calibration record at "</span><br><span style="color: hsl(120, 100%, 40%);">+                         "0x%" PRIx32 ", applying\n", (uint32_t) p);</span><br><span style="color: hsl(120, 100%, 40%);">+                       apply_levels(rf_tx_levels_1800, payload + 0x80, 0, 16);</span><br><span style="color: hsl(120, 100%, 40%);">+                       break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 0x0002:</span><br><span style="color: hsl(120, 100%, 40%);">+                  if (hdr->native_len != 0xB4)</span><br><span style="color: hsl(120, 100%, 40%);">+                               break;</span><br><span style="color: hsl(120, 100%, 40%);">+                        if (*(uint32_t *)(payload + 0x70) != 0xAA)</span><br><span style="color: hsl(120, 100%, 40%);">+                            break;</span><br><span style="color: hsl(120, 100%, 40%);">+                        printf("Found 1900 MHz band calibration record at "</span><br><span style="color: hsl(120, 100%, 40%);">+                         "0x%" PRIx32 ", applying\n", (uint32_t) p);</span><br><span style="color: hsl(120, 100%, 40%);">+                       apply_levels(rf_tx_levels_1900, payload + 0x74, 0, 16);</span><br><span style="color: hsl(120, 100%, 40%);">+                       break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 0x0018:</span><br><span style="color: hsl(120, 100%, 40%);">+                  if (hdr->native_len != 0x88)</span><br><span style="color: hsl(120, 100%, 40%);">+                               break;</span><br><span style="color: hsl(120, 100%, 40%);">+                        if (*(uint32_t *)(payload + 0x54) != 0xAA)</span><br><span style="color: hsl(120, 100%, 40%);">+                            break;</span><br><span style="color: hsl(120, 100%, 40%);">+                        printf("Found 850 MHz band calibration record at "</span><br><span style="color: hsl(120, 100%, 40%);">+                          "0x%" PRIx32 ", applying\n", (uint32_t) p);</span><br><span style="color: hsl(120, 100%, 40%);">+                       apply_levels(rf_tx_levels_850, payload + 0x58, 5, 15);</span><br><span style="color: hsl(120, 100%, 40%);">+                        break;</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%);">+}</span><br><span>diff --git a/src/target/firmware/board/compal/readcal_small.c b/src/target/firmware/board/compal/readcal_small.c</span><br><span>new file mode 100644</span><br><span>index 0000000..a69c509</span><br><span>--- /dev/null</span><br><span>+++ b/src/target/firmware/board/compal/readcal_small.c</span><br><span>@@ -0,0 +1,30 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2017 by Mychaela Falconia <mychaela.falconia@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 2 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU General Public License along</span><br><span style="color: hsl(120, 100%, 40%);">+ * with this program; if not, write to the Free Software Foundation, Inc.,</span><br><span style="color: hsl(120, 100%, 40%);">+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdint.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <rf/readcal.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+extern void read_compal_factory_records(uint32_t flash_addr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void read_factory_rf_calibration(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    read_compal_factory_records(0x3FC000);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/target/firmware/board/compal/rf_tables.c b/src/target/firmware/board/compal/rf_tables.c</span><br><span>new file mode 100644</span><br><span>index 0000000..4f8ae5c</span><br><span>--- /dev/null</span><br><span>+++ b/src/target/firmware/board/compal/rf_tables.c</span><br><span>@@ -0,0 +1,582 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2017 by Mychaela Falconia <mychaela.falconia@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+ * Tweaked (coding style changes) by Vadim Yanitskiy <axilirator@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 2 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU General Public License along</span><br><span style="color: hsl(120, 100%, 40%);">+ * with this program; if not, write to the Free Software Foundation, Inc.,</span><br><span style="color: hsl(120, 100%, 40%);">+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdint.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <rf/txcal.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <rf/vcxocal.h></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%);">+ * The following AFC initial DAC value and AFC slope settings are unchanged</span><br><span style="color: hsl(120, 100%, 40%);">+ * from the old OsmocomBB code in which they were hard-coded in layer1/afc.c.</span><br><span style="color: hsl(120, 100%, 40%);">+ * This AFC slope setting corresponds very closely to the original Leonardo</span><br><span style="color: hsl(120, 100%, 40%);">+ * Psi values which are used by Motorola's official fw at least on the C139,</span><br><span style="color: hsl(120, 100%, 40%);">+ * hence I have good reason to believe that they are indeed correct for the</span><br><span style="color: hsl(120, 100%, 40%);">+ * Mot C1xx hardware target family.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int16_t afc_initial_dac_value = -700;</span><br><span style="color: hsl(120, 100%, 40%);">+int16_t afc_slope = 287;</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%);">+ * The following Tx levels and ramps tables are the ones compiled into</span><br><span style="color: hsl(120, 100%, 40%);">+ * Compal's firmware; more specifically, they have been extracted out</span><br><span style="color: hsl(120, 100%, 40%);">+ * of the one special C11x fw version for which we got the linker map</span><br><span style="color: hsl(120, 100%, 40%);">+ * file with symbols.  In normal operation the APC DAC values in the</span><br><span style="color: hsl(120, 100%, 40%);">+ * levels tables are replaced with the ones read from the per-band</span><br><span style="color: hsl(120, 100%, 40%);">+ * factory calibration records, but for the Tx ramp templates the</span><br><span style="color: hsl(120, 100%, 40%);">+ * compiled-in tables are always used - these are calibrated per design</span><br><span style="color: hsl(120, 100%, 40%);">+ * rather than per unit.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+struct txcal_tx_level rf_tx_levels_850[RF_TX_LEVELS_TABLE_SIZE] = {</span><br><span style="color: hsl(120, 100%, 40%);">+     { 560,  0,  0 }, /* 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 560,  0,  0 }, /* 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 560,  0,  0 }, /* 2 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 560,  0,  0 }, /* 3 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 560,  0,  0 }, /* 4 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 638,  0,  0 }, /* 5 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 554,  1,  0 }, /* 6 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 467,  2,  0 }, /* 7 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 395,  3,  0 }, /* 8 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 337,  4,  0 }, /* 9 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 290,  5,  0 }, /* 10 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 253,  6,  0 }, /* 11 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 224,  7,  0 }, /* 12 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 201,  8,  0 }, /* 13 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 183,  9,  0 }, /* 14 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 168, 10,  0 }, /* 15 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 157, 11,  0 }, /* 16 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 148, 12,  0 }, /* 17 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 141, 13,  0 }, /* 18 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 136, 14,  0 }, /* 19 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  46, 14,  0 }, /* 20 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  46, 14,  0 }, /* 21 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  46, 14,  0 }, /* 22 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  46, 14,  0 }, /* 23 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  46, 14,  0 }, /* 24 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  46, 14,  0 }, /* 25 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  46, 14,  0 }, /* 26 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  46, 14,  0 }, /* 27 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  46, 14,  0 }, /* 28 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  46, 14,  0 }, /* 29 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  46, 14,  0 }, /* 30 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  46, 14,  0 }, /* 31 */</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%);">+struct txcal_tx_level rf_tx_levels_900[RF_TX_LEVELS_TABLE_SIZE] = {</span><br><span style="color: hsl(120, 100%, 40%);">+  { 550,  0,  0 }, /* 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 550,  0,  0 }, /* 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 550,  0,  0 }, /* 2 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 550,  0,  0 }, /* 3 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 550,  0,  0 }, /* 4 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 550,  0,  0 }, /* 5 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 476,  1,  0 }, /* 6 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 402,  2,  0 }, /* 7 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 338,  3,  0 }, /* 8 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 294,  4,  0 }, /* 9 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 260,  5,  0 }, /* 10 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 226,  6,  0 }, /* 11 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 204,  7,  0 }, /* 12 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 186,  8,  0 }, /* 13 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 172,  9,  0 }, /* 14 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 161, 10,  0 }, /* 15 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 153, 11,  0 }, /* 16 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 146, 12,  0 }, /* 17 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 141, 13,  0 }, /* 18 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 137, 14,  0 }, /* 19 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  43, 14,  0 }, /* 20 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  43, 14,  0 }, /* 21 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  43, 14,  0 }, /* 22 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  43, 14,  0 }, /* 23 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  43, 14,  0 }, /* 24 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  43, 14,  0 }, /* 25 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  43, 14,  0 }, /* 26 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  43, 14,  0 }, /* 27 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  43, 14,  0 }, /* 28 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  43, 14,  0 }, /* 29 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  43, 14,  0 }, /* 30 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  43, 14,  0 }, /* 31 */</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%);">+struct txcal_tx_level rf_tx_levels_1800[RF_TX_LEVELS_TABLE_SIZE] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ { 480,  0,  0 }, /* 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 416,  1,  0 }, /* 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 352,  2,  0 }, /* 2 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 308,  3,  0 }, /* 3 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 266,  4,  0 }, /* 4 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 242,  5,  0 }, /* 5 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 218,  6,  0 }, /* 6 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 200,  7,  0 }, /* 7 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 186,  8,  0 }, /* 8 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 175,  9,  0 }, /* 9 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 167, 10,  0 }, /* 10 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 160, 11,  0 }, /* 11 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 156, 12,  0 }, /* 12 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 152, 13,  0 }, /* 13 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 145, 14,  0 }, /* 14 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 142, 15,  0 }, /* 15 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  61, 15,  0 }, /* 16 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  61, 15,  0 }, /* 17 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  61, 15,  0 }, /* 18 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  61, 15,  0 }, /* 19 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  61, 15,  0 }, /* 20 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  61, 15,  0 }, /* 21 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  61, 15,  0 }, /* 22 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  61, 15,  0 }, /* 23 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  61, 15,  0 }, /* 24 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  61, 15,  0 }, /* 25 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  61, 15,  0 }, /* 26 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  61, 15,  0 }, /* 27 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  61, 15,  0 }, /* 28 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 750,  0,  0 }, /* 29 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 750,  0,  0 }, /* 30 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 750,  0,  0 }, /* 31 */</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%);">+struct txcal_tx_level rf_tx_levels_1900[RF_TX_LEVELS_TABLE_SIZE] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ { 520,  0,  0 }, /* 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 465,  1,  0 }, /* 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 390,  2,  0 }, /* 2 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 330,  3,  0 }, /* 3 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 285,  4,  0 }, /* 4 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 250,  5,  0 }, /* 5 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 225,  6,  0 }, /* 6 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 205,  7,  0 }, /* 7 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 190,  8,  0 }, /* 8 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 177,  9,  0 }, /* 9 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 168, 10,  0 }, /* 10 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 161, 11,  0 }, /* 11 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 155, 12,  0 }, /* 12 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 150, 13,  0 }, /* 13 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 147, 14,  0 }, /* 14 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 143, 15,  0 }, /* 15 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  62, 15,  0 }, /* 16 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  62, 15,  0 }, /* 17 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  62, 15,  0 }, /* 18 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  62, 15,  0 }, /* 19 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  62, 15,  0 }, /* 20 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  62, 15,  0 }, /* 21 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  62, 15,  0 }, /* 22 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  62, 15,  0 }, /* 23 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  62, 15,  0 }, /* 24 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  62, 15,  0 }, /* 25 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  62, 15,  0 }, /* 26 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  62, 15,  0 }, /* 27 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  62, 15,  0 }, /* 28 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 915,  0,  0 }, /* 29 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 915,  0,  0 }, /* 30 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 915,  0,  0 }, /* 31 */</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%);">+struct txcal_ramp_def rf_tx_ramps_850[RF_TX_RAMP_SIZE] = {</span><br><span style="color: hsl(120, 100%, 40%);">+   { /* profile 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 28,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4, 31, 31, 31,  3,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 31, 31, 18, 22,  6, 10,  2,  1,  1,  3,  3,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31,  1,  0,  0,  0,  0,  0,  0,  0,  0,  3, 31, 31, 31,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 31, 31, 31,  6,  8,  8,  9,  4,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 2 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0, 31, 31, 29,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 31, 25, 21, 20, 13, 14,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 3 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0, 31, 31, 22,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 27, 28, 23, 19, 13, 14,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 4 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 21,  0,  0,  0,  0,  0,  0,  0,  0,  0, 31, 31, 14,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 31, 21, 31,  2, 31,  4,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 5 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 30,  0,  0,  0,  0,  0,  0,  0,  0,  0, 31, 31,  5,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 21, 31, 31,  2, 31,  4,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 6 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31,  7,  0,  0,  0,  0,  0,  0,  0,  0, 31, 28,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 31, 31, 28, 14,  3, 21,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 7 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 16,  0,  0,  0,  0,  0,  0,  0,  0, 31, 19,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 20, 30, 30, 10, 28, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 8 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 26,  0,  0,  0,  0,  0,  0,  0,  0, 31,  9,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 20, 26, 26, 18, 18, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 9 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 31,  2,  0,  0,  0,  0,  0,  0,  0, 31,  2,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 16, 16, 26, 26, 26,  0,  0, 18,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 10 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 31, 11,  0,  0,  0,  0,  0,  0,  0,  0, 24,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 10, 12, 31, 26, 29, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 11 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 31, 18,  0,  0,  0,  0,  0,  0,  0,  0, 17,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 2, 20, 31, 26, 31,  0,  0, 18,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 12 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 31, 25,  0,  0,  0,  0,  0,  0,  0,  0, 10,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 2, 20, 31, 26, 31,  0,  0,  0, 18,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 13 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 31, 30,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 1, 16, 31, 31, 31,  0, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 14 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 31, 31,  0,  0,  0,  0,  0,  0,  0,  4,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 4,  8, 10, 20, 31, 31, 20,  4,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 15 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 31, 31,  0,  0,  0,  0,  0,  0,  0,  4,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 4,  8, 10, 20, 31, 31, 20,  4,  0,  0,  0,  0,  0,  0,  0,  0 },</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct txcal_ramp_def rf_tx_ramps_900[RF_TX_RAMP_SIZE] = {</span><br><span style="color: hsl(120, 100%, 40%);">+  { /* profile 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 30,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 31, 31, 31,  5,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 31, 31, 28, 15,  2,  0, 19,  2,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0, 30, 26, 29,  8,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 31, 31, 29, 14,  2,  1, 15,  2,  3,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 2 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0, 31, 27, 24,  1,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 30, 31, 25, 14,  2,  2, 15,  7,  2,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 3 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 22,  0,  0,  0,  0,  0,  0,  0,  0,  0, 31, 14, 29,  1,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 31, 29, 31, 13,  2,  2, 15,  2,  3,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 4 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 30,  0,  0,  0,  0,  0,  0,  0,  0,  0, 31, 17, 19,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 31, 30, 30, 15,  1,  2, 17,  2,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 5 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31,  7,  0,  0,  0,  0,  0,  0,  0,  0, 31, 19,  7,  2,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 29, 31, 29, 16,  4,  0, 14,  2,  1,  2,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 6 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 16,  0,  0,  0,  0,  0,  0,  0,  0, 30,  0, 20,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 19, 26, 26, 28, 10,  0, 19,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 7 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 25,  0,  0,  0,  0,  0,  0,  0,  0, 31,  0,  8,  2,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 19, 28, 31, 24,  4,  0, 19,  3,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 8 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 31,  2,  0,  0,  0,  0,  0,  0,  0, 31,  2,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 19, 28, 31, 24,  4,  0, 17,  5,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 9 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 31,  9,  0,  0,  0,  0,  0,  0,  0, 26,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 18, 25, 28, 31,  2,  2, 19,  3,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 10 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 31, 16,  0,  0,  0,  0,  0,  0,  0,  0, 19,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 14, 21, 24, 29,  6,  2, 23,  5,  4,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 11 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 31, 22,  0,  0,  0,  0,  0,  0,  0,  0, 12,  0,  1,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 8, 26, 26, 28, 12, 12,  5,  5,  0,  6,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 12 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 31, 27,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 8, 14, 27, 30, 20, 19, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 13 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 31, 31,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0,  1,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 9, 10, 15, 26, 25, 10, 17, 13,  3,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 14 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 30, 30,  1,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  4, 15, 21, 21, 21, 21, 15, 10,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 15 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 30, 30,  1,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  4, 15, 21, 21, 21, 21, 15, 10,  0,  0,  0,  0,  0,  0,  0 },</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct txcal_ramp_def rf_tx_ramps_1800[RF_TX_RAMP_SIZE] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ { /* profile 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0, 31, 31, 27,  4,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 28, 31, 18,  8,  8, 13,  9, 13,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0, 31, 31, 24,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 10, 30, 30, 20,  8, 30,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 2 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 19,  0,  0,  0,  0,  0,  0,  0,  0,  0, 31, 31, 16,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 10, 30, 31, 24, 31,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 3 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 27,  0,  0,  0,  0,  0,  0,  0,  0,  0, 28, 23, 19,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 31, 14, 31,  5, 24, 13, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 4 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31,  4,  0,  0,  0,  0,  0,  0,  0,  0, 10, 21, 31,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 20, 22, 31, 10, 22, 13, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 5 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 13,  0,  0,  0,  0,  0,  0,  0,  0, 31, 22,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 22, 14, 26, 22, 22, 17,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 6 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 21,  0,  0,  0,  0,  0,  0,  0,  0, 24, 21,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 10, 31, 31, 25, 17, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 7 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 28,  0,  0,  0,  0,  0,  0,  0,  0, 28, 10,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 17, 24, 28, 21, 24, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 8 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 31,  4,  0,  0,  0,  0,  0,  0,  0, 27,  4,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 9, 23, 31, 24, 24, 13,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 9 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 31, 12,  0,  0,  0,  0,  0,  0,  0,  0, 13, 10,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 9, 23, 31, 24, 24, 13,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 10 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 31, 17,  0,  0,  0,  0,  0,  0,  0,  0, 12,  6,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 10, 10, 31, 31, 24, 13,  5,  4,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 11 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 31, 21,  0,  0,  0,  0,  0,  0,  0,  0, 14,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 4, 14, 31, 31, 26, 13,  5,  4,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 12 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 31, 27,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 2, 14, 31, 31, 28, 13,  5,  4,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 13 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 31, 29,  0,  0,  0,  0,  0,  0,  0,  0,  6,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  6, 14, 31, 31, 24, 13,  5,  4,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 14 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 31, 31,  1,  0,  0,  0,  0,  0,  0,  0,  3,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 2,  4,  4, 18, 31, 31, 24,  5,  5,  4,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 15 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 31, 31,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 3,  2,  2, 22, 22, 21, 21, 21,  9,  5,  0,  0,  0,  0,  0,  0 },</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct txcal_ramp_def rf_tx_ramps_1900[RF_TX_RAMP_SIZE] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ { /* profile 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31,  4,  0,  0,  0,  0,  0,  0,  0,  0, 14, 31, 31, 17,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 31, 31, 15, 25,  8, 10,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31,  8,  0,  0,  0,  0,  0,  0,  0,  0,  5, 31, 31, 22,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 31, 21, 31, 20,  4,  0, 21,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 2 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 16,  0,  0,  0,  0,  0,  0,  0,  0,  6, 31, 31, 13,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 30, 31, 24, 31, 10,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 3 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 24,  0,  0,  0,  0,  0,  0,  0,  0,  3, 31, 31,  8,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 31, 31, 19, 23, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 4 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31,  2,  0,  0,  0,  0,  0,  0,  0,  6, 31, 22,  5,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 31, 31, 14, 24,  5, 13, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 5 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 10,  0,  0,  0,  0,  0,  0,  0,  0, 31, 25,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 31, 19, 20,  8, 24, 17,  5,  4,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 6 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 30, 19,  0,  0,  0,  0,  0,  0,  0,  0, 31, 17,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 2, 31, 31, 25, 17, 22,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 7 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 26,  0,  0,  0,  0,  0,  0,  0,  0, 31,  9,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 14, 24, 25, 30, 24, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 8 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 31,  2,  0,  0,  0,  0,  0,  0,  0, 31,  2,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 12, 17, 27, 31, 24, 13,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 9 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 30, 10,  0,  0,  0,  0,  0,  0,  0, 25,  1,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 21, 31, 31, 26, 13,  4,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 10 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 31, 11,  0,  0,  0,  0,  0,  0,  0, 24,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 14, 31, 31, 28, 13,  5,  4,  2,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 11 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 31, 19,  0,  0,  0,  0,  0,  0,  0,  0, 16,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 6, 14, 31, 31, 24, 13,  5,  4,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 12 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 31, 25,  0,  0,  0,  0,  0,  0,  0,  0, 10,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 6, 14, 31, 31, 24, 13,  5,  4,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 13 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 31, 29,  0,  0,  0,  0,  0,  0,  0,  0,  6,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 6, 14, 31, 31, 24, 13,  5,  4,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 14 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 31, 31,  1,  0,  0,  0,  0,  0,  0,  0,  3,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 3, 16, 31, 31, 24, 14,  5,  4,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 15 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 31, 31, 31, 31,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 4,  6, 21, 21, 21, 21, 15, 15,  4,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span>diff --git a/src/target/firmware/board/compal_e99/readcal.c b/src/target/firmware/board/compal_e99/readcal.c</span><br><span>new file mode 100644</span><br><span>index 0000000..dcbf6b0</span><br><span>--- /dev/null</span><br><span>+++ b/src/target/firmware/board/compal_e99/readcal.c</span><br><span>@@ -0,0 +1,30 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2017 by Mychaela Falconia <mychaela.falconia@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 2 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU General Public License along</span><br><span style="color: hsl(120, 100%, 40%);">+ * with this program; if not, write to the Free Software Foundation, Inc.,</span><br><span style="color: hsl(120, 100%, 40%);">+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdint.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <rf/readcal.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+extern void read_compal_factory_records(uint32_t flash_addr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void read_factory_rf_calibration(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        read_compal_factory_records(0x7E0000);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/target/firmware/board/gta0x/init.c b/src/target/firmware/board/gta0x/init.c</span><br><span>index b93f79c..73d74bb 100644</span><br><span>--- a/src/target/firmware/board/gta0x/init.c</span><br><span>+++ b/src/target/firmware/board/gta0x/init.c</span><br><span>@@ -30,6 +30,7 @@</span><br><span> #include <keypad.h></span><br><span> #include <console.h></span><br><span> #include <flash/cfi_flash.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <tiffs.h></span><br><span> </span><br><span> #include <calypso/irq.h></span><br><span> #include <calypso/clock.h></span><br><span>@@ -132,4 +133,7 @@</span><br><span> </span><br><span>    /* Initialize ABB driver (uses SPI) */</span><br><span>       twl3025_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Initialize TIFFS reader */</span><br><span style="color: hsl(120, 100%, 40%);">+ tiffs_init(0x380000, 0x10000, 7);</span><br><span> }</span><br><span>diff --git a/src/target/firmware/board/gta0x/rf_tables.c b/src/target/firmware/board/gta0x/rf_tables.c</span><br><span>new file mode 100644</span><br><span>index 0000000..03ad0dc</span><br><span>--- /dev/null</span><br><span>+++ b/src/target/firmware/board/gta0x/rf_tables.c</span><br><span>@@ -0,0 +1,598 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2017 by Mychaela Falconia <mychaela.falconia@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+ * Tweaked (coding style changes) by Vadim Yanitskiy <axilirator@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 2 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU General Public License along</span><br><span style="color: hsl(120, 100%, 40%);">+ * with this program; if not, write to the Free Software Foundation, Inc.,</span><br><span style="color: hsl(120, 100%, 40%);">+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdint.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <rf/txcal.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <rf/vcxocal.h></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%);">+ * Here is a typical set of AFC Psi parameters for an FCDEV3B modem board,</span><br><span style="color: hsl(120, 100%, 40%);">+ * computed by FreeCalypso fc-rfcal-vcxo calibration tool from frequency</span><br><span style="color: hsl(120, 100%, 40%);">+ * offset measurements made with a CMU200 RF tester:</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Psi_sta_inv: 3462</span><br><span style="color: hsl(120, 100%, 40%);">+ * Psi_st: 15</span><br><span style="color: hsl(120, 100%, 40%);">+ * Psi_st_32: 992326</span><br><span style="color: hsl(120, 100%, 40%);">+ * Psi_st_inv: 4328</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * The following AFC slope number is the closest OsmocomBB-style afc_slope</span><br><span style="color: hsl(120, 100%, 40%);">+ * integer corresponding to these Psi numbers; the true value is somewhere</span><br><span style="color: hsl(120, 100%, 40%);">+ * between 454 and 455.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This AFC slope setting is expected to be correct for both Openmoko and</span><br><span style="color: hsl(120, 100%, 40%);">+ * FreeCalypso hardware as we use the same VCXO components as were used</span><br><span style="color: hsl(120, 100%, 40%);">+ * by Openmoko.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int16_t afc_slope = 454;</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%);">+ * The compiled-in AFC initial DAC value below is the same as was used by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the old OsmocomBB code written for Mot C1xx phones, but it will normally</span><br><span style="color: hsl(120, 100%, 40%);">+ * be overridden by the per-unit factory calibration value read from the</span><br><span style="color: hsl(120, 100%, 40%);">+ * /gsm/rf/afcdac file in FFS.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int16_t afc_initial_dac_value = -700;</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%);">+ * The following Tx levels and ramps tables are the ones compiled into</span><br><span style="color: hsl(120, 100%, 40%);">+ * the official Openmoko and FreeCalypso firmwares for GTA0x and FCDEV3B</span><br><span style="color: hsl(120, 100%, 40%);">+ * devices; these are the tables which the firmware uses in the absence</span><br><span style="color: hsl(120, 100%, 40%);">+ * of per-unit calibration files in FFS.  Any /gsm/rf/tx/levels.* files</span><br><span style="color: hsl(120, 100%, 40%);">+ * found in FFS directly overwrite the compiled-in levels tables, and</span><br><span style="color: hsl(120, 100%, 40%);">+ * any /gsm/rf/tx/ramps.* files likewise directly overwrite the</span><br><span style="color: hsl(120, 100%, 40%);">+ * compiled-in ramps tables.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+struct txcal_tx_level rf_tx_levels_850[RF_TX_LEVELS_TABLE_SIZE] = {</span><br><span style="color: hsl(120, 100%, 40%);">+     { 507,  0,  0 }, /* 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 507,  0,  0 }, /* 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 507,  0,  0 }, /* 2 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 507,  0,  0 }, /* 3 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 507,  0,  0 }, /* 4 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 507,  0,  0 }, /* 5 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 417,  1,  0 }, /* 6 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 350,  2,  0 }, /* 7 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 282,  3,  0 }, /* 8 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 226,  4,  0 }, /* 9 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 183,  5,  0 }, /* 10 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 148,  6,  0 }, /* 11 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 121,  7,  0 }, /* 12 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  98,  8,  0 }, /* 13 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  80,  9,  0 }, /* 14 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  66, 10,  0 }, /* 15 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  54, 11,  0 }, /* 16 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  44, 12,  0 }, /* 17 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  36, 13,  0 }, /* 18 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  29, 14,  0 }, /* 19 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  29, 14,  0 }, /* 20 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  29, 14,  0 }, /* 21 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  29, 14,  0 }, /* 22 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  29, 14,  0 }, /* 23 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  29, 14,  0 }, /* 24 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  29, 14,  0 }, /* 25 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  29, 14,  0 }, /* 26 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  29, 14,  0 }, /* 27 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  29, 14,  0 }, /* 28 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  29, 14,  0 }, /* 29 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  29, 14,  0 }, /* 30 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  29, 14,  0 }, /* 31 */</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%);">+struct txcal_tx_level rf_tx_levels_900[RF_TX_LEVELS_TABLE_SIZE] = {</span><br><span style="color: hsl(120, 100%, 40%);">+  { 465,  0,  0 }, /* 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 465,  0,  0 }, /* 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 465,  0,  0 }, /* 2 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 465,  0,  0 }, /* 3 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 465,  0,  0 }, /* 4 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 465,  0,  0 }, /* 5 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 387,  1,  0 }, /* 6 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 324,  2,  0 }, /* 7 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 260,  3,  0 }, /* 8 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 210,  4,  0 }, /* 9 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 170,  5,  0 }, /* 10 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 138,  6,  0 }, /* 11 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 113,  7,  0 }, /* 12 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  92,  8,  0 }, /* 13 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  76,  9,  0 }, /* 14 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  62, 10,  0 }, /* 15 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  51, 11,  0 }, /* 16 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  42, 12,  0 }, /* 17 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  34, 13,  0 }, /* 18 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  27, 14,  0 }, /* 19 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  27, 14,  0 }, /* 20 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  27, 14,  0 }, /* 21 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  27, 14,  0 }, /* 22 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  27, 14,  0 }, /* 23 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  27, 14,  0 }, /* 24 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  27, 14,  0 }, /* 25 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  27, 14,  0 }, /* 26 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  27, 14,  0 }, /* 27 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  27, 14,  0 }, /* 28 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  27, 14,  0 }, /* 29 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  27, 14,  0 }, /* 30 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  27, 14,  0 }, /* 31 */</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%);">+struct txcal_tx_level rf_tx_levels_1800[RF_TX_LEVELS_TABLE_SIZE] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ { 436,  0,  0 }, /* 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 363,  1,  0 }, /* 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 310,  2,  0 }, /* 2 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 253,  3,  0 }, /* 3 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 205,  4,  0 }, /* 4 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 168,  5,  0 }, /* 5 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 138,  6,  0 }, /* 6 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 113,  7,  0 }, /* 7 */</span><br><span style="color: hsl(120, 100%, 40%);">+      {  93,  8,  0 }, /* 8 */</span><br><span style="color: hsl(120, 100%, 40%);">+      {  76,  9,  0 }, /* 9 */</span><br><span style="color: hsl(120, 100%, 40%);">+      {  61, 10,  0 }, /* 10 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  50, 11,  0 }, /* 11 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  40, 12,  0 }, /* 12 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  32, 13,  0 }, /* 13 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  26, 14,  0 }, /* 14 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  20, 15,  0 }, /* 15 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  20, 15,  0 }, /* 16 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  20, 15,  0 }, /* 17 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  20, 15,  0 }, /* 18 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  20, 15,  0 }, /* 19 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  20, 15,  0 }, /* 20 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  20, 15,  0 }, /* 21 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  20, 15,  0 }, /* 22 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  20, 15,  0 }, /* 23 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  20, 15,  0 }, /* 24 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  20, 15,  0 }, /* 25 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  20, 15,  0 }, /* 26 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  20, 15,  0 }, /* 27 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  20, 15,  0 }, /* 28 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  20,  0,  0 }, /* 29 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  20,  0,  0 }, /* 30 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  20,  0,  0 }, /* 31 */</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%);">+struct txcal_tx_level rf_tx_levels_1900[RF_TX_LEVELS_TABLE_SIZE] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ { 429,  0,  0 }, /* 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 353,  1,  0 }, /* 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 302,  2,  0 }, /* 2 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 246,  3,  0 }, /* 3 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 200,  4,  0 }, /* 4 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 164,  5,  0 }, /* 5 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 135,  6,  0 }, /* 6 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 111,  7,  0 }, /* 7 */</span><br><span style="color: hsl(120, 100%, 40%);">+      {  91,  8,  0 }, /* 8 */</span><br><span style="color: hsl(120, 100%, 40%);">+      {  75,  9,  0 }, /* 9 */</span><br><span style="color: hsl(120, 100%, 40%);">+      {  60, 10,  0 }, /* 10 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  49, 11,  0 }, /* 11 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  40, 12,  0 }, /* 12 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  33, 13,  0 }, /* 13 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  26, 14,  0 }, /* 14 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  26, 15,  0 }, /* 15 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  26, 15,  0 }, /* 16 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  26, 15,  0 }, /* 17 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  26, 15,  0 }, /* 18 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  26, 15,  0 }, /* 19 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  26, 15,  0 }, /* 20 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  26, 15,  0 }, /* 21 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  26, 15,  0 }, /* 22 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  26, 15,  0 }, /* 23 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  26, 15,  0 }, /* 24 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  26, 15,  0 }, /* 25 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  26, 15,  0 }, /* 26 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  26, 15,  0 }, /* 27 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  26, 15,  0 }, /* 28 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  26,  0,  0 }, /* 29 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  26,  0,  0 }, /* 30 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  26,  0,  0 }, /* 31 */</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%);">+struct txcal_ramp_def rf_tx_ramps_850[RF_TX_RAMP_SIZE] = {</span><br><span style="color: hsl(120, 100%, 40%);">+   { /* profile 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  0,  0,  0,  9, 18, 25, 31, 30, 15,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 11, 31, 31, 31, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  0,  1,  1,  7, 16, 28, 31, 31, 13,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  8, 31, 31, 31, 27,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 2 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  0,  1,  1,  8, 16, 29, 31, 31, 11,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  8, 28, 31, 31, 30,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 3 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  0,  2,  0,  6, 18, 28, 31, 31, 12,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  9, 24, 31, 31, 31,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 4 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  0,  3,  0,  5, 19, 31, 31, 31,  8,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  7, 31, 31, 31, 28,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 5 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  0,  2,  0,  7, 18, 31, 31, 31,  8,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  7, 31, 31, 31, 28,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 6 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  0,  3,  0,  5, 20, 31, 31, 31,  7,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 10, 21, 31, 31, 31,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 7 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  0,  4,  0,  9, 23, 22, 31, 31,  8,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  9, 24, 30, 31, 30,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 8 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  0,  5,  0,  8, 21, 24, 31, 31,  8,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  8, 23, 31, 31, 31,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 9 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  5,  0,  3,  1, 27, 22, 31, 31,  8,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  8, 27, 25, 26, 31, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 10 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  5,  0,  0,  2,  7, 22, 23, 31, 31,  7,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  7, 25, 30, 31, 31,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 11 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  5,  0,  4,  8, 21, 21, 31, 31,  7,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  8, 21, 31, 31, 31,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 12 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  7,  0,  0, 12, 22, 25, 31, 27,  4,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  9, 12, 21, 31, 31, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 13 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  0,  7,  0,  8, 15, 31, 31, 31,  5,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  6, 14, 23, 31, 31, 23,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 14 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0, 20,  0,  0,  8, 15, 14, 31, 31,  9,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  7, 31, 31, 31, 28,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 15 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct txcal_ramp_def rf_tx_ramps_900[RF_TX_RAMP_SIZE] = {</span><br><span style="color: hsl(120, 100%, 40%);">+  { /* profile 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  0,  0,  0,  9, 18, 25, 31, 30, 15,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 11, 31, 31, 31, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  0,  1,  1,  7, 16, 28, 31, 31, 13,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  8, 31, 31, 31, 27,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 2 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  0,  1,  1,  8, 16, 29, 31, 31, 11,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  8, 28, 31, 31, 30,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 3 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  0,  2,  0,  6, 18, 28, 31, 31, 12,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  9, 24, 31, 31, 31,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 4 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  0,  3,  0,  5, 19, 31, 31, 31,  8,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  7, 31, 31, 31, 28,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 5 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  0,  2,  0,  7, 18, 31, 31, 31,  8,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  7, 31, 31, 31, 28,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 6 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  0,  3,  0,  5, 20, 31, 31, 31,  7,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 10, 21, 31, 31, 31,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 7 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  0,  4,  0,  9, 23, 22, 31, 31,  8,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  9, 24, 30, 31, 30,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 8 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  0,  5,  0,  8, 21, 24, 31, 31,  8,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  8, 23, 31, 31, 31,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 9 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  5,  0,  3,  1, 27, 22, 31, 31,  8,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  8, 27, 25, 26, 31, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 10 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  5,  0,  0,  2,  7, 22, 23, 31, 31,  7,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  7, 25, 30, 31, 31,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 11 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  5,  0,  4,  8, 21, 21, 31, 31,  7,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  8, 21, 31, 31, 31,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 12 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  7,  0,  0, 12, 22, 25, 31, 27,  4,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  9, 12, 21, 31, 31, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 13 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  0,  7,  0,  8, 15, 31, 31, 31,  5,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  6, 14, 23, 31, 31, 23,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 14 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0, 20,  0,  0,  8, 15, 14, 31, 31,  9,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  7, 31, 31, 31, 28,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 15 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct txcal_ramp_def rf_tx_ramps_1800[RF_TX_RAMP_SIZE] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ { /* profile 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  0,  2,  3,  5, 16, 31, 31, 31,  9,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 11, 31, 31, 31, 10, 11,  3,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  0,  2,  3,  4, 17, 30, 31, 31, 10,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 10, 31, 31, 31, 13,  9,  3,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 2 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  0,  4,  2,  2, 18, 31, 31, 31,  9,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 10, 26, 31, 31, 16, 10,  4,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 3 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  0,  3,  4,  4, 15, 31, 31, 31,  9,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  9, 31, 31, 31, 13,  6,  7,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 4 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  0,  4,  3,  7, 11, 31, 31, 31, 10,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  8, 31, 31, 31, 11,  9,  7,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 5 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  4,  3,  2,  7, 14, 25, 31, 31, 11,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 14, 31, 31, 31,  9,  8,  4,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 6 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  7,  1,  3, 10, 12, 25, 31, 31,  8,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  7, 30, 31, 31, 14,  4,  6,  5,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 7 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  3,  5,  0,  5,  8, 12, 26, 31, 31,  7,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  7, 31, 31, 31, 15,  0,  8,  5,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 8 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  9,  0,  3, 10, 16, 21, 31, 31,  7,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 11, 28, 31, 27, 10, 11,  0, 10,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 9 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0, 10,  0,  6,  9, 15, 22, 29, 31,  6,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  9, 22, 31, 31, 12,  5,  0, 18,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 10 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0, 14,  0,  0,  8,  6, 20, 21, 29, 24,  6,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  8, 28, 29, 26, 14,  6,  0, 17,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 11 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0, 16,  0,  3,  5,  8, 16, 31, 28, 18,  3,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  6, 18, 26, 31, 16,  9,  7,  0, 15,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 12 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0, 19,  0,  3,  6,  8, 21, 24, 31, 14,  2,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  0, 12, 31, 31, 27,  4,  0, 23,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 13 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0, 14, 14,  0,  0, 24, 31, 31, 14,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  0, 11, 31, 31, 22, 11,  3, 19,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 14 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0, 30,  1,  4,  8, 18, 31, 31,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  0,  8, 31, 31, 22,  5,  0, 31,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 15 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0, 31, 13,  0,  0, 14, 31, 31,  8,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  0,  4, 31, 31, 25,  5,  0,  5, 26,  1,  0,  0,  0,  0,  0 },</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct txcal_ramp_def rf_tx_ramps_1900[RF_TX_RAMP_SIZE] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ { /* profile 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  0,  7,  0,  0, 16, 31, 31, 31, 12,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 13, 31, 31, 31, 18,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  0,  2,  3,  4, 17, 30, 31, 31, 10,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 10, 31, 31, 31, 13,  9,  3,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 2 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  0,  4,  2,  2, 18, 31, 31, 31,  9,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 10, 26, 31, 31, 16, 10,  4,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 3 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  0,  3,  4,  4, 15, 31, 31, 31,  9,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  9, 31, 31, 31, 13,  6,  7,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 4 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  0,  4,  3,  0, 18, 31, 31, 31, 10,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  8, 31, 31, 31, 11,  9,  7,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 5 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  4,  3,  2,  7, 14, 25, 31, 31, 11,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 14, 31, 31, 31,  9,  8,  4,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 6 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  7,  1,  3, 10, 12, 25, 31, 31,  8,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  7, 30, 31, 31, 14,  4,  6,  5,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 7 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  3,  5,  0,  5,  8, 12, 26, 31, 31,  7,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  7, 31, 31, 31, 15,  0,  8,  5,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 8 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  9,  0,  3, 10, 16, 21, 31, 31,  7,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 11, 28, 31, 27, 10, 11,  0, 10,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 9 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0, 10,  0,  6,  9, 15, 22, 29, 31,  6,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  9, 22, 31, 31, 12,  5,  0, 18,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 10 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0, 14,  0,  0,  4, 10, 20, 21, 29, 24,  6,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  8, 28, 29, 26, 14,  6,  0, 17,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 11 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0, 16,  0,  3,  5,  8, 16, 31, 28, 18,  3,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  6, 18, 26, 31, 16,  9,  7,  0, 15,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 12 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0, 19,  0,  3,  6,  8, 21, 24, 31, 14,  2,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  0, 12, 31, 31, 27,  4,  0, 23,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 13 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0, 14, 14,  0,  0, 24, 31, 31, 14,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  0, 11, 31, 31, 22, 11,  3, 19,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 14 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0, 30,  1,  4,  8, 18, 31, 31,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  0,  8, 31, 31, 22,  5,  0, 31,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 15 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0, 30,  1,  4,  8, 18, 31, 31,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  0,  8, 31, 31, 22,  5,  0, 31,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span>diff --git a/src/target/firmware/board/pirelli_dpl10/readcal.c b/src/target/firmware/board/pirelli_dpl10/readcal.c</span><br><span>new file mode 100644</span><br><span>index 0000000..8b8fa33</span><br><span>--- /dev/null</span><br><span>+++ b/src/target/firmware/board/pirelli_dpl10/readcal.c</span><br><span>@@ -0,0 +1,90 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2017 by Mychaela Falconia <mychaela.falconia@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+ * Tweaked (coding style changes) by Vadim Yanitskiy <axilirator@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 2 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU General Public License along</span><br><span style="color: hsl(120, 100%, 40%);">+ * with this program; if not, write to the Free Software Foundation, Inc.,</span><br><span style="color: hsl(120, 100%, 40%);">+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdio.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdint.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <string.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <rf/readcal.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <rf/txcal.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <rf/vcxocal.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int16_t afcdac_shifted;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void afcdac_postproc(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     afc_initial_dac_value = afcdac_shifted >> 3;</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%);">+static int verify_checksum(const uint8_t *start, size_t len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      const uint8_t *p, *endp;</span><br><span style="color: hsl(120, 100%, 40%);">+      uint8_t accum;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      p = start;</span><br><span style="color: hsl(120, 100%, 40%);">+    endp = start + len;</span><br><span style="color: hsl(120, 100%, 40%);">+   accum = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+    while (p < endp)</span><br><span style="color: hsl(120, 100%, 40%);">+           accum += *p++;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      if (accum == *p)</span><br><span style="color: hsl(120, 100%, 40%);">+              return 0;       /* good */</span><br><span style="color: hsl(120, 100%, 40%);">+    else</span><br><span style="color: hsl(120, 100%, 40%);">+          return -1;      /* bad */</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%);">+static const struct calmap {</span><br><span style="color: hsl(120, 100%, 40%);">+  char            *desc;</span><br><span style="color: hsl(120, 100%, 40%);">+        unsigned        offset;</span><br><span style="color: hsl(120, 100%, 40%);">+       size_t          record_len;</span><br><span style="color: hsl(120, 100%, 40%);">+   void            *buffer;</span><br><span style="color: hsl(120, 100%, 40%);">+      void            (*postproc)(void);</span><br><span style="color: hsl(120, 100%, 40%);">+} rf_cal_list[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+       { "afcdac",          0x528, 2,   &afcdac_shifted,     afcdac_postproc },</span><br><span style="color: hsl(120, 100%, 40%);">+        { "Tx ramps 900",    0x72B, 512, rf_tx_ramps_900,     NULL },</span><br><span style="color: hsl(120, 100%, 40%);">+       { "Tx levels 900",   0x92C, 128, rf_tx_levels_900,    NULL },</span><br><span style="color: hsl(120, 100%, 40%);">+       { "Tx calchan 900",  0x9AD, 128, rf_tx_chan_cal_900,  NULL },</span><br><span style="color: hsl(120, 100%, 40%);">+       { "Tx ramps 1800",   0xA2E, 512, rf_tx_ramps_1800,    NULL },</span><br><span style="color: hsl(120, 100%, 40%);">+       { "Tx levels 1800",  0xC2F, 128, rf_tx_levels_1800,   NULL },</span><br><span style="color: hsl(120, 100%, 40%);">+       { "Tx calchan 1800", 0xCB0, 128, rf_tx_chan_cal_1800, NULL },</span><br><span style="color: hsl(120, 100%, 40%);">+       { "Tx ramps 1900",   0xD31, 512, rf_tx_ramps_1900,    NULL },</span><br><span style="color: hsl(120, 100%, 40%);">+       { "Tx levels 1900",  0xF32, 128, rf_tx_levels_1900,   NULL },</span><br><span style="color: hsl(120, 100%, 40%);">+       { "Tx calchan 1900", 0xFB3, 128, rf_tx_chan_cal_1900, NULL },</span><br><span style="color: hsl(120, 100%, 40%);">+       { NULL,              0,     0,   NULL,                NULL }</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%);">+void read_factory_rf_calibration(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ const struct calmap *tp;</span><br><span style="color: hsl(120, 100%, 40%);">+      const uint8_t *record;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      puts("Checking factory data block for the RF calibration records\n");</span><br><span style="color: hsl(120, 100%, 40%);">+       for (tp = rf_cal_list; tp->desc; tp++) {</span><br><span style="color: hsl(120, 100%, 40%);">+           record = (const uint8_t *)0x027F0000 + tp->offset;</span><br><span style="color: hsl(120, 100%, 40%);">+         if (verify_checksum(record, tp->record_len) < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                        continue;</span><br><span style="color: hsl(120, 100%, 40%);">+             printf("Found '%s' record, applying\n", tp->desc);</span><br><span style="color: hsl(120, 100%, 40%);">+               memcpy(tp->buffer, record, tp->record_len);</span><br><span style="color: hsl(120, 100%, 40%);">+             if (tp->postproc)</span><br><span style="color: hsl(120, 100%, 40%);">+                  tp->postproc();</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/target/firmware/board/pirelli_dpl10/rf_tables.c b/src/target/firmware/board/pirelli_dpl10/rf_tables.c</span><br><span>new file mode 100644</span><br><span>index 0000000..2edc15e</span><br><span>--- /dev/null</span><br><span>+++ b/src/target/firmware/board/pirelli_dpl10/rf_tables.c</span><br><span>@@ -0,0 +1,593 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2017 by Mychaela Falconia <mychaela.falconia@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+ * Tweaked (coding style changes) by Vadim Yanitskiy <axilirator@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 2 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU General Public License along</span><br><span style="color: hsl(120, 100%, 40%);">+ * with this program; if not, write to the Free Software Foundation, Inc.,</span><br><span style="color: hsl(120, 100%, 40%);">+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdint.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <rf/txcal.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <rf/vcxocal.h></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%);">+ * Pirelli's official fw runs with the following Psi parameters, as read out</span><br><span style="color: hsl(120, 100%, 40%);">+ * of a running fw via rftr 9 Test Mode command:</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Psi_sta_inv: 6974</span><br><span style="color: hsl(120, 100%, 40%);">+ * Psi_st: 8</span><br><span style="color: hsl(120, 100%, 40%);">+ * Psi_st_32: 492713</span><br><span style="color: hsl(120, 100%, 40%);">+ * Psi_st_inv: 8717</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * The following AFC slope number is the closest OsmocomBB-style afc_slope</span><br><span style="color: hsl(120, 100%, 40%);">+ * integer corresponding to these Psi numbers; the true value is somewhere</span><br><span style="color: hsl(120, 100%, 40%);">+ * between 225 and 226.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int16_t afc_slope = 226;</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%);">+ * The compiled-in AFC initial DAC value below is the same as was used by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the old OsmocomBB code written for Mot C1xx phones, but it will normally</span><br><span style="color: hsl(120, 100%, 40%);">+ * be overridden by the per-unit factory calibration value read from</span><br><span style="color: hsl(120, 100%, 40%);">+ * Pirelli's factory data block.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int16_t afc_initial_dac_value = -700;</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%);">+ * The following Tx levels and ramps tables are the ones compiled into</span><br><span style="color: hsl(120, 100%, 40%);">+ * Pirelli's firmware; these are the tables which the firmware uses in</span><br><span style="color: hsl(120, 100%, 40%);">+ * the absence of per-unit calibration records in the factory data block</span><br><span style="color: hsl(120, 100%, 40%);">+ * in the last 64 KiB sector of the flash.  In normal operation the</span><br><span style="color: hsl(120, 100%, 40%);">+ * records read from that block fully override all of these compiled-in</span><br><span style="color: hsl(120, 100%, 40%);">+ * tables, with the exception of 850 MHz bands ones - the Pirelli DP-L10</span><br><span style="color: hsl(120, 100%, 40%);">+ * does not support that band, and there are no calibration records for it.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+struct txcal_tx_level rf_tx_levels_850[RF_TX_LEVELS_TABLE_SIZE] = {</span><br><span style="color: hsl(120, 100%, 40%);">+      { 600,  0,  0 }, /* 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 600,  0,  0 }, /* 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 600,  0,  0 }, /* 2 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 600,  0,  0 }, /* 3 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 600,  0,  0 }, /* 4 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 600,  0,  0 }, /* 5 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 540,  1,  0 }, /* 6 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 450,  2,  0 }, /* 7 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 385,  3,  0 }, /* 8 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 330,  4,  0 }, /* 9 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 285,  5,  0 }, /* 10 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 250,  6,  0 }, /* 11 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 220,  7,  0 }, /* 12 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 195,  8,  0 }, /* 13 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 175,  9,  0 }, /* 14 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 160, 10,  0 }, /* 15 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 145, 11,  0 }, /* 16 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 133, 12,  0 }, /* 17 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 123, 13,  0 }, /* 18 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 115, 14,  0 }, /* 19 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 115, 14,  0 }, /* 20 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 115, 14,  0 }, /* 21 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 115, 14,  0 }, /* 22 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 115, 14,  0 }, /* 23 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 115, 14,  0 }, /* 24 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 115, 14,  0 }, /* 25 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 115, 14,  0 }, /* 26 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 115, 14,  0 }, /* 27 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 115, 14,  0 }, /* 28 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 115, 14,  0 }, /* 29 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 115, 14,  0 }, /* 30 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 115, 14,  0 }, /* 31 */</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%);">+struct txcal_tx_level rf_tx_levels_900[RF_TX_LEVELS_TABLE_SIZE] = {</span><br><span style="color: hsl(120, 100%, 40%);">+  { 570,  0,  0 }, /* 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 570,  0,  0 }, /* 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 570,  0,  0 }, /* 2 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 570,  0,  0 }, /* 3 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 570,  0,  0 }, /* 4 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 570,  0,  0 }, /* 5 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 496,  1,  1 }, /* 6 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 437,  2,  1 }, /* 7 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 385,  3,  1 }, /* 8 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 339,  4,  1 }, /* 9 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 299,  5,  2 }, /* 10 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 263,  6,  2 }, /* 11 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 232,  7,  2 }, /* 12 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 204,  8,  2 }, /* 13 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 180,  9,  2 }, /* 14 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 159, 10,  3 }, /* 15 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 141, 11,  3 }, /* 16 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 125, 12,  3 }, /* 17 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 111, 13,  3 }, /* 18 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  99, 14,  3 }, /* 19 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  99, 14,  0 }, /* 20 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  99, 14,  0 }, /* 21 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  99, 14,  0 }, /* 22 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  99, 14,  0 }, /* 23 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  99, 14,  0 }, /* 24 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  99, 14,  0 }, /* 25 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  99, 14,  0 }, /* 26 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  99, 14,  0 }, /* 27 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  99, 14,  0 }, /* 28 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  99, 14,  0 }, /* 29 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  99, 14,  0 }, /* 30 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  99, 14,  0 }, /* 31 */</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%);">+struct txcal_tx_level rf_tx_levels_1800[RF_TX_LEVELS_TABLE_SIZE] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ { 640,  0,  0 }, /* 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 558,  1,  0 }, /* 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 493,  2,  1 }, /* 2 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 435,  3,  1 }, /* 3 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 384,  4,  1 }, /* 4 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 338,  5,  1 }, /* 5 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 297,  6,  1 }, /* 6 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 261,  7,  1 }, /* 7 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 228,  8,  2 }, /* 8 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 199,  9,  2 }, /* 9 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 174, 10,  3 }, /* 10 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 151, 11,  3 }, /* 11 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 132, 12,  3 }, /* 12 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 115, 13,  3 }, /* 13 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 100, 14,  3 }, /* 14 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  87, 15,  3 }, /* 15 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  87, 15,  0 }, /* 16 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  87, 15,  0 }, /* 17 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  87, 15,  0 }, /* 18 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  87, 15,  0 }, /* 19 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  87, 15,  0 }, /* 20 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  87, 15,  0 }, /* 21 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  87, 15,  0 }, /* 22 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  87, 15,  0 }, /* 23 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  87, 15,  0 }, /* 24 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  87, 15,  0 }, /* 25 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  87, 15,  0 }, /* 26 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  87, 15,  0 }, /* 27 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  87, 15,  0 }, /* 28 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  87,  0,  0 }, /* 29 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  87,  0,  0 }, /* 30 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  87,  0,  0 }, /* 31 */</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%);">+struct txcal_tx_level rf_tx_levels_1900[RF_TX_LEVELS_TABLE_SIZE] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ { 577,  0,  0 }, /* 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 493,  1,  0 }, /* 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 432,  2,  0 }, /* 2 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 379,  3,  0 }, /* 3 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 335,  4,  1 }, /* 4 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 291,  5,  1 }, /* 5 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 255,  6,  1 }, /* 6 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 222,  7,  2 }, /* 7 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 194,  8,  2 }, /* 8 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 169,  9,  2 }, /* 9 */</span><br><span style="color: hsl(120, 100%, 40%);">+      { 147, 10,  2 }, /* 10 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 128, 11,  2 }, /* 11 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 111, 12,  3 }, /* 12 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  97, 13,  3 }, /* 13 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  85, 14,  3 }, /* 14 */</span><br><span style="color: hsl(120, 100%, 40%);">+     {  74, 15,  3 }, /* 15 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 101, 15,  0 }, /* 16 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 101, 15,  0 }, /* 17 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 101, 15,  0 }, /* 18 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 101, 15,  0 }, /* 19 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 101, 15,  0 }, /* 20 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 101, 15,  0 }, /* 21 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 101, 15,  0 }, /* 22 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 101, 15,  0 }, /* 23 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 101, 15,  0 }, /* 24 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 101, 15,  0 }, /* 25 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 101, 15,  0 }, /* 26 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 101, 15,  0 }, /* 27 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 101, 15,  0 }, /* 28 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 101,  0,  0 }, /* 29 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 101,  0,  0 }, /* 30 */</span><br><span style="color: hsl(120, 100%, 40%);">+     { 101,  0,  0 }, /* 31 */</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%);">+struct txcal_ramp_def rf_tx_ramps_850[RF_TX_RAMP_SIZE] = {</span><br><span style="color: hsl(120, 100%, 40%);">+   { /* profile 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 14,  0,  0,  0,  1, 19, 29, 31, 29,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 14,  0,  0,  0,  1, 19, 29, 31, 29,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 2 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 14,  0,  0,  0,  1, 19, 29, 31, 29,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 3 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 14,  0,  0,  0,  1, 19, 29, 31, 29,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 4 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 14,  0,  0,  0,  1, 19, 29, 31, 29,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 5 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 14,  0,  0,  0,  1, 19, 29, 31, 29,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 6 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 14,  0,  0,  0,  1, 19, 29, 31, 29,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 7 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 14,  0,  0,  0,  1, 19, 29, 31, 29,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 8 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 14,  0,  0,  0,  1, 19, 29, 31, 29,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 9 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 14,  0,  0,  0,  1, 19, 29, 31, 29,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 10 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 14,  0,  0,  0,  1, 19, 29, 31, 29,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 11 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 14,  0,  0,  0,  1, 19, 29, 31, 29,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 12 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 14,  0,  0,  0,  1, 19, 29, 31, 29,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 13 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 14,  0,  0,  0,  1, 19, 29, 31, 29,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 14 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 14,  0,  0,  0,  1, 19, 29, 31, 29,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 15 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct txcal_ramp_def rf_tx_ramps_900[RF_TX_RAMP_SIZE] = {</span><br><span style="color: hsl(120, 100%, 40%);">+  { /* profile 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 14,  0,  0,  0,  1, 19, 29, 31, 29,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 15, 10,  3, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 19,  0,  0,  0,  1, 19, 29, 31, 29,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 2 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 19,  0,  0,  0,  1, 19, 29, 31, 29,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 3 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0, 19,  0,  0,  0,  1, 19, 29, 31, 29,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 4 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0, 19,  0,  0,  0,  1, 19, 29, 31, 29,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 5 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 31,  0,  0,  0,  0,  0,  8, 29, 31, 29,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 6 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 31,  0,  0,  0,  0,  0,  8, 29, 31, 29,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 7 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 31,  0,  0,  0,  0,  0,  8, 29, 31, 29,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 8 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 31,  0,  0,  0,  0,  0,  8, 29, 31, 29,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 9 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 31,  0,  0,  0,  0,  0,  8, 29, 31, 29,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 10 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 31,  8,  0,  0,  0,  0,  0, 29, 31, 29,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 11 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 31, 12,  0,  0,  0,  0,  0, 25, 31, 29,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 12 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 31, 16,  0,  0,  0,  0,  0, 21, 31, 29,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 13 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 31, 20,  0,  0,  0,  0,  0, 17, 31, 29,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 14 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 31, 24,  0,  0,  0,  0,  0, 13, 31, 29,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 15 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct txcal_ramp_def rf_tx_ramps_1800[RF_TX_RAMP_SIZE] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ { /* profile 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 14,  0,  0,  0,  1, 19, 29, 31, 29,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 14,  0,  0,  0,  1, 19, 29, 31, 29,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 2 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 14,  0,  0,  0,  1, 19, 29, 31, 29,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 3 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 14,  0,  0,  0,  1, 19, 29, 31, 29,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 4 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 14,  0,  0,  0,  1, 19, 29, 31, 29,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 5 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 14,  0,  0,  0,  1, 19, 29, 31, 29,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 6 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 14,  0,  0,  0,  1, 19, 29, 31, 29,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 7 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 14,  0,  0,  0,  1, 19, 29, 31, 29,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 8 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 14,  0,  0,  0,  1, 19, 29, 31, 29,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 9 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 14,  0,  0,  0,  1, 19, 29, 31, 29,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 10 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 14,  0,  0,  0,  1, 19, 29, 31, 29,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 11 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 14,  0,  0,  0,  1, 19, 29, 31, 29,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 12 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 14,  0,  0,  0,  1, 19, 29, 31, 29,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 13 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 14,  0,  0,  0,  1, 19, 29, 31, 29,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 14 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 14,  0,  0,  0,  1, 19, 29, 31, 29,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 15 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 14,  0,  0,  0,  1, 19, 29, 31, 29,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct txcal_ramp_def rf_tx_ramps_1900[RF_TX_RAMP_SIZE] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ { /* profile 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 14,  0,  0,  0,  1, 19, 29, 31, 29,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 14,  0,  0,  0,  1, 19, 29, 31, 29,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 2 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 19,  0,  0,  0,  0,  1, 19, 29, 31, 29,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 3 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 19,  0,  0,  0,  0,  1, 19, 29, 31, 29,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 4 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 19,  0,  0,  0,  0,  1, 19, 29, 31, 29,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 5 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 19,  0,  0,  0,  0,  1, 19, 29, 31, 29,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 6 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 31,  0,  0,  0,  0,  0,  8, 29, 31, 29,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 7 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 31,  0,  0,  0,  0,  0,  8, 29, 31, 29,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 8 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 31,  0,  0,  0,  0,  0,  8, 29, 31, 29,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 9 */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 31,  8,  0,  0,  0,  0,  0, 29, 31, 29,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 10 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 31,  8,  0,  0,  0,  0,  0, 29, 31, 29,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 11 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 31,  8,  0,  0,  0,  0,  0, 29, 31, 29,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 12 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 31, 12,  0,  0,  0,  0,  0, 25, 31, 29,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 13 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 14,  0,  0,  0,  1, 19, 29, 31, 29,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 14 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 14,  0,  0,  0,  1, 19, 29, 31, 29,  5,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    { /* profile 15 */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-up */</span><br><span style="color: hsl(120, 100%, 40%);">+         { 0,  0,  0, 14,  0,  0,  1, 19, 29, 31, 29,  5,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ramp-down */</span><br><span style="color: hsl(120, 100%, 40%);">+               { 0, 19,  9, 31, 29, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span>diff --git a/src/target/firmware/include/layer1/apc.h b/src/target/firmware/include/layer1/apc.h</span><br><span>deleted file mode 100644</span><br><span>index 3d73c23..0000000</span><br><span>--- a/src/target/firmware/include/layer1/apc.h</span><br><span>+++ /dev/null</span><br><span>@@ -1,10 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-#ifndef _L1_APC_H</span><br><span style="color: hsl(0, 100%, 40%);">-#define _L1_APC_H</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* determine the AUXAPC value by the Tx Power Level */</span><br><span style="color: hsl(0, 100%, 40%);">-int16_t apc_tx_dbm2auxapc(enum gsm_band band, int8_t dbm);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* determine the AUXAPC value by the Tx Power Level */</span><br><span style="color: hsl(0, 100%, 40%);">-int16_t apc_tx_pwrlvl2auxapc(enum gsm_band band, uint8_t lvl);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span>diff --git a/src/target/firmware/include/rf/readcal.h b/src/target/firmware/include/rf/readcal.h</span><br><span>new file mode 100644</span><br><span>index 0000000..1f16bda</span><br><span>--- /dev/null</span><br><span>+++ b/src/target/firmware/include/rf/readcal.h</span><br><span>@@ -0,0 +1 @@</span><br><span style="color: hsl(120, 100%, 40%);">+void read_factory_rf_calibration(void);</span><br><span>diff --git a/src/target/firmware/include/rf/txcal.h b/src/target/firmware/include/rf/txcal.h</span><br><span>new file mode 100644</span><br><span>index 0000000..1031942</span><br><span>--- /dev/null</span><br><span>+++ b/src/target/firmware/include/rf/txcal.h</span><br><span>@@ -0,0 +1,49 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * RF Tx calibration structures matching those used by official</span><br><span style="color: hsl(120, 100%, 40%);">+ * TI/FreeCalypso firmwares; these structures appear in the flash file</span><br><span style="color: hsl(120, 100%, 40%);">+ * system (FFS) of FCDEV3B and GTA0x devices and in the factory data</span><br><span style="color: hsl(120, 100%, 40%);">+ * block on the Pirelli DP-L10 phone.</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%);">+#define RF_TX_CHAN_CAL_TABLE_SIZE  4 /*!< channel calibration table size */</span><br><span style="color: hsl(120, 100%, 40%);">+#define RF_TX_NUM_SUB_BANDS        8 /*!< number of sub-bands in channel calibration table */</span><br><span style="color: hsl(120, 100%, 40%);">+#define RF_TX_LEVELS_TABLE_SIZE   32 /*!< level table size */</span><br><span style="color: hsl(120, 100%, 40%);">+#define RF_TX_RAMP_SIZE           16 /*!< number of ramp definitions */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* APC of Tx Power (pcm-file "rf/tx/level.gsm|dcs") */</span><br><span style="color: hsl(120, 100%, 40%);">+struct txcal_tx_level {</span><br><span style="color: hsl(120, 100%, 40%);">+     uint16_t apc;           /*!< 0..31 */</span><br><span style="color: hsl(120, 100%, 40%);">+      uint8_t ramp_index;     /*!< 0..RF_TX_RAMP_SIZE */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t chan_cal_index; /*!< 0..RF_TX_CHAN_CAL_TABLE_SIZE */</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%);">+/* Power ramp definition structure */</span><br><span style="color: hsl(120, 100%, 40%);">+struct txcal_ramp_def {</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t ramp_up[16];    /*!< Ramp-up profile */</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t ramp_down[16];  /*!< Ramp-down profile */</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%);">+/* Tx channel calibration structure */</span><br><span style="color: hsl(120, 100%, 40%);">+struct txcal_chan_cal {</span><br><span style="color: hsl(120, 100%, 40%);">+   uint16_t arfcn_limit;</span><br><span style="color: hsl(120, 100%, 40%);">+ int16_t chan_cal;</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%);">+extern struct txcal_tx_level rf_tx_levels_850[RF_TX_LEVELS_TABLE_SIZE];</span><br><span style="color: hsl(120, 100%, 40%);">+extern struct txcal_tx_level rf_tx_levels_900[RF_TX_LEVELS_TABLE_SIZE];</span><br><span style="color: hsl(120, 100%, 40%);">+extern struct txcal_tx_level rf_tx_levels_1800[RF_TX_LEVELS_TABLE_SIZE];</span><br><span style="color: hsl(120, 100%, 40%);">+extern struct txcal_tx_level rf_tx_levels_1900[RF_TX_LEVELS_TABLE_SIZE];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+extern struct txcal_ramp_def rf_tx_ramps_850[RF_TX_RAMP_SIZE];</span><br><span style="color: hsl(120, 100%, 40%);">+extern struct txcal_ramp_def rf_tx_ramps_900[RF_TX_RAMP_SIZE];</span><br><span style="color: hsl(120, 100%, 40%);">+extern struct txcal_ramp_def rf_tx_ramps_1800[RF_TX_RAMP_SIZE];</span><br><span style="color: hsl(120, 100%, 40%);">+extern struct txcal_ramp_def rf_tx_ramps_1900[RF_TX_RAMP_SIZE];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+extern struct txcal_chan_cal rf_tx_chan_cal_850[RF_TX_CHAN_CAL_TABLE_SIZE]</span><br><span style="color: hsl(120, 100%, 40%);">+                                               [RF_TX_NUM_SUB_BANDS];</span><br><span style="color: hsl(120, 100%, 40%);">+extern struct txcal_chan_cal rf_tx_chan_cal_900[RF_TX_CHAN_CAL_TABLE_SIZE]</span><br><span style="color: hsl(120, 100%, 40%);">+                                            [RF_TX_NUM_SUB_BANDS];</span><br><span style="color: hsl(120, 100%, 40%);">+extern struct txcal_chan_cal rf_tx_chan_cal_1800[RF_TX_CHAN_CAL_TABLE_SIZE]</span><br><span style="color: hsl(120, 100%, 40%);">+                                           [RF_TX_NUM_SUB_BANDS];</span><br><span style="color: hsl(120, 100%, 40%);">+extern struct txcal_chan_cal rf_tx_chan_cal_1900[RF_TX_CHAN_CAL_TABLE_SIZE]</span><br><span style="color: hsl(120, 100%, 40%);">+                                           [RF_TX_NUM_SUB_BANDS];</span><br><span>diff --git a/src/target/firmware/include/rf/vcxocal.h b/src/target/firmware/include/rf/vcxocal.h</span><br><span>new file mode 100644</span><br><span>index 0000000..8c49595</span><br><span>--- /dev/null</span><br><span>+++ b/src/target/firmware/include/rf/vcxocal.h</span><br><span>@@ -0,0 +1,13 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * Old OsmocomBB fw code used the same fixed and hard-coded numbers for</span><br><span style="color: hsl(120, 100%, 40%);">+ * the slope of the VCXO and the initial AFC DAC setting for all Calypso</span><br><span style="color: hsl(120, 100%, 40%);">+ * targets, but this approach is incorrect because different phone/modem</span><br><span style="color: hsl(120, 100%, 40%);">+ * board designs use different VC(TC)XO components with different properties,</span><br><span style="color: hsl(120, 100%, 40%);">+ * and some manufacturers have done per-unit calibration of their VC(TC)XO.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * We now have global variables in which these configuration or calibration</span><br><span style="color: hsl(120, 100%, 40%);">+ * values are stored, and this header file provides the extern definitions</span><br><span style="color: hsl(120, 100%, 40%);">+ * for these global vars.</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%);">+extern int16_t afc_initial_dac_value, afc_slope;</span><br><span>diff --git a/src/target/firmware/layer1/Makefile b/src/target/firmware/layer1/Makefile</span><br><span>index 0c710a5..0a24e05 100644</span><br><span>--- a/src/target/firmware/layer1/Makefile</span><br><span>+++ b/src/target/firmware/layer1/Makefile</span><br><span>@@ -2,7 +2,7 @@</span><br><span> LIBRARIES+=layer1</span><br><span> LIB_layer1_DIR=layer1</span><br><span> LIB_layer1_SRCS=avg.c agc.c afc.c toa.c sync.c tdma_sched.c tpu_window.c init.c \</span><br><span style="color: hsl(0, 100%, 40%);">-               l23_api.c mframe_sched.c sched_gsmtime.c async.c rfch.c apc.c</span><br><span style="color: hsl(120, 100%, 40%);">+         l23_api.c mframe_sched.c sched_gsmtime.c async.c rfch.c</span><br><span> </span><br><span> LIB_layer1_SRCS += prim_pm.c prim_rach.c prim_tx_nb.c prim_rx_nb.c prim_fbsb.c \</span><br><span>                 prim_freq.c prim_utils.c prim_tch.c</span><br><span>diff --git a/src/target/firmware/layer1/afc.c b/src/target/firmware/layer1/afc.c</span><br><span>index a51a107..1a198e3 100644</span><br><span>--- a/src/target/firmware/layer1/afc.c</span><br><span>+++ b/src/target/firmware/layer1/afc.c</span><br><span>@@ -30,7 +30,7 @@</span><br><span> #include <layer1/avg.h></span><br><span> #include <calypso/dsp.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define AFC_INITIAL_DAC_VALUE     -700</span><br><span style="color: hsl(120, 100%, 40%);">+#include <rf/vcxocal.h></span><br><span> </span><br><span> /* Over how many TDMA frames do we want to average? (this may change in dedicated mode) */</span><br><span> #define AFC_PERIOD             40</span><br><span>@@ -53,7 +53,6 @@</span><br><span>               .period = AFC_PERIOD,</span><br><span>                .min_valid = AFC_MIN_MUN_VALID,</span><br><span>      },</span><br><span style="color: hsl(0, 100%, 40%);">-      .dac_value = AFC_INITIAL_DAC_VALUE,</span><br><span> };</span><br><span> </span><br><span> /* The AFC DAC in the ABB has to be configured as follows:</span><br><span>@@ -66,10 +65,6 @@</span><br><span> #define AFC_NORM_FACTOR_GSM ((1<<15) / 947)</span><br><span> #define AFC_NORM_FACTOR_DCS    ((1<<15) / 1894)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* we assume 8.769ppb per LSB, equals 0.008769 * 32768 == 287 */</span><br><span style="color: hsl(0, 100%, 40%);">-//#define AFC_SLOPE           320</span><br><span style="color: hsl(0, 100%, 40%);">-#define AFC_SLOPE            287</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* The DSP can measure the frequency error in the following ranges:</span><br><span>  *        FB_MODE0:       +/- 20 kHz</span><br><span>  *        FB_MODE1:       +/-  4 kHz</span><br><span>@@ -92,7 +87,7 @@</span><br><span>               afc_norm_factor = AFC_NORM_FACTOR_DCS;</span><br><span>       }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   delta = (int16_t) ((afc_norm_factor * (int32_t)freq_error) / AFC_SLOPE);</span><br><span style="color: hsl(120, 100%, 40%);">+      delta = (int16_t) ((afc_norm_factor * (int32_t)freq_error) / afc_slope);</span><br><span>     printd("afc_correct(error=%dHz, arfcn=%u): delta=%d, afc_dac(old=%d,new=%d)\n",</span><br><span>            freq_error, arfcn, delta, afc_state.dac_value, afc_state.dac_value+delta);</span><br><span>   afc_state.dac_value += delta;</span><br><span>@@ -106,7 +101,7 @@</span><br><span> </span><br><span> void afc_reset(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    afc_state.dac_value = AFC_INITIAL_DAC_VALUE;</span><br><span style="color: hsl(120, 100%, 40%);">+  afc_state.dac_value = afc_initial_dac_value;</span><br><span> }</span><br><span> </span><br><span> void afc_input(int32_t freq_error, uint16_t arfcn, int valid)</span><br><span>diff --git a/src/target/firmware/layer1/apc.c b/src/target/firmware/layer1/apc.c</span><br><span>deleted file mode 100644</span><br><span>index 480c760..0000000</span><br><span>--- a/src/target/firmware/layer1/apc.c</span><br><span>+++ /dev/null</span><br><span>@@ -1,57 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/* APC (Automatic Power Control) Implementation */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* (C) 2010 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * All Rights Reserved</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(0, 100%, 40%);">- * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(0, 100%, 40%);">- * the Free Software Foundation; either version 2 of the License, or</span><br><span style="color: hsl(0, 100%, 40%);">- * (at your option) any later version.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(0, 100%, 40%);">- * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(0, 100%, 40%);">- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(0, 100%, 40%);">- * GNU General Public License for more details.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * You should have received a copy of the GNU General Public License along</span><br><span style="color: hsl(0, 100%, 40%);">- * with this program; if not, write to the Free Software Foundation, Inc.,</span><br><span style="color: hsl(0, 100%, 40%);">- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</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%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <errno.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/utils.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/gsm_utils.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <layer1/apc.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* calibration table defined in board file */</span><br><span style="color: hsl(0, 100%, 40%);">-extern const int16_t dbm2apc_gsm900[];</span><br><span style="color: hsl(0, 100%, 40%);">-extern const int dbm2apc_gsm900_max;</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%);">-/* determine the AUXAPC value by the Tx Power Level */</span><br><span style="color: hsl(0, 100%, 40%);">-int16_t apc_tx_dbm2auxapc(enum gsm_band band, int8_t dbm)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     if (dbm < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-         return -ERANGE;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* FIXME: offsets for different bands! */</span><br><span style="color: hsl(0, 100%, 40%);">-       if (dbm > dbm2apc_gsm900_max)</span><br><span style="color: hsl(0, 100%, 40%);">-                dbm = dbm2apc_gsm900_max;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return dbm2apc_gsm900[dbm];</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%);">-/* determine the AUXAPC value by the Tx Power Level */</span><br><span style="color: hsl(0, 100%, 40%);">-int16_t apc_tx_pwrlvl2auxapc(enum gsm_band band, uint8_t lvl)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        /* convert tx power level to dBm */</span><br><span style="color: hsl(0, 100%, 40%);">-     int dbm = ms_pwr_dbm(band, lvl);</span><br><span style="color: hsl(0, 100%, 40%);">-        if (dbm < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-         return dbm;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     return apc_tx_dbm2auxapc(band, dbm);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span>diff --git a/src/target/firmware/layer1/sync.c b/src/target/firmware/layer1/sync.c</span><br><span>index 36f4297..fe2916f 100644</span><br><span>--- a/src/target/firmware/layer1/sync.c</span><br><span>+++ b/src/target/firmware/layer1/sync.c</span><br><span>@@ -50,13 +50,14 @@</span><br><span> #include <layer1/sync.h></span><br><span> #include <layer1/afc.h></span><br><span> #include <layer1/agc.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <layer1/apc.h></span><br><span> #include <layer1/tdma_sched.h></span><br><span> #include <layer1/mframe_sched.h></span><br><span> #include <layer1/sched_gsmtime.h></span><br><span> #include <layer1/tpu_window.h></span><br><span> #include <layer1/l23_api.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#include <rf/txcal.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #include <l1ctl_proto.h></span><br><span> </span><br><span> struct l1s_state l1s;</span><br><span>@@ -324,16 +325,57 @@</span><br><span> </span><br><span> void l1s_tx_apc_helper(uint16_t arfcn)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+  struct txcal_chan_cal (*my_chan_cal)[RF_TX_NUM_SUB_BANDS];</span><br><span style="color: hsl(120, 100%, 40%);">+    struct txcal_chan_cal (*chan_cal)[RF_TX_NUM_SUB_BANDS];</span><br><span style="color: hsl(120, 100%, 40%);">+       struct txcal_tx_level *levels, *mylevel;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct txcal_ramp_def *ramps, *myramp;</span><br><span>       int16_t auxapc;</span><br><span style="color: hsl(0, 100%, 40%);">- enum gsm_band band;</span><br><span>  int i;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      /* Get DAC setting */</span><br><span style="color: hsl(0, 100%, 40%);">-   band = gsm_arfcn2band(arfcn);</span><br><span style="color: hsl(0, 100%, 40%);">-   auxapc = apc_tx_pwrlvl2auxapc(band, l1s.tx_power);</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Figure out which band we are working in */</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (gsm_arfcn2band(arfcn)) {</span><br><span style="color: hsl(120, 100%, 40%);">+      case GSM_BAND_850:</span><br><span style="color: hsl(120, 100%, 40%);">+            levels = rf_tx_levels_850;</span><br><span style="color: hsl(120, 100%, 40%);">+            ramps = rf_tx_ramps_850;</span><br><span style="color: hsl(120, 100%, 40%);">+              chan_cal = rf_tx_chan_cal_850;</span><br><span style="color: hsl(120, 100%, 40%);">+                break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case GSM_BAND_900:</span><br><span style="color: hsl(120, 100%, 40%);">+            levels = rf_tx_levels_900;</span><br><span style="color: hsl(120, 100%, 40%);">+            ramps = rf_tx_ramps_900;</span><br><span style="color: hsl(120, 100%, 40%);">+              chan_cal = rf_tx_chan_cal_900;</span><br><span style="color: hsl(120, 100%, 40%);">+                break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case GSM_BAND_1800:</span><br><span style="color: hsl(120, 100%, 40%);">+           levels = rf_tx_levels_1800;</span><br><span style="color: hsl(120, 100%, 40%);">+           ramps = rf_tx_ramps_1800;</span><br><span style="color: hsl(120, 100%, 40%);">+             chan_cal = rf_tx_chan_cal_1800;</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case GSM_BAND_1900:</span><br><span style="color: hsl(120, 100%, 40%);">+           levels = rf_tx_levels_1900;</span><br><span style="color: hsl(120, 100%, 40%);">+           ramps = rf_tx_ramps_1900;</span><br><span style="color: hsl(120, 100%, 40%);">+             chan_cal = rf_tx_chan_cal_1900;</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</span><br><span style="color: hsl(120, 100%, 40%);">+              puts("Error: invalid band in l1s_tx_apc_helper()!\n");</span><br><span style="color: hsl(120, 100%, 40%);">+              return;</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%);">+   /* Figure out our Tx power level, APC and ramp index */</span><br><span style="color: hsl(120, 100%, 40%);">+       mylevel = levels + (l1s.tx_power & 0x1F);</span><br><span style="color: hsl(120, 100%, 40%);">+ auxapc = mylevel->apc;</span><br><span style="color: hsl(120, 100%, 40%);">+     myramp = ramps + mylevel->ramp_index;</span><br><span style="color: hsl(120, 100%, 40%);">+      my_chan_cal = chan_cal + mylevel->chan_cal_index;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Channel calibration correction */</span><br><span style="color: hsl(120, 100%, 40%);">+  arfcn &= ~ARFCN_FLAG_MASK;</span><br><span style="color: hsl(120, 100%, 40%);">+        for (i = 0; i < RF_TX_NUM_SUB_BANDS; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                if (arfcn <= (*my_chan_cal)[i].arfcn_limit)</span><br><span style="color: hsl(120, 100%, 40%);">+                        break;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (i < RF_TX_NUM_SUB_BANDS)</span><br><span style="color: hsl(120, 100%, 40%);">+               auxapc = ((uint32_t)auxapc * (*my_chan_cal)[i].chan_cal) / 128;</span><br><span> </span><br><span>  /* Load the ApcOffset into the DSP */</span><br><span style="color: hsl(0, 100%, 40%);">-   #define  MY_OFFSET      4</span><br><span style="color: hsl(120, 100%, 40%);">+     #define  MY_OFFSET      48      /* what the official TCS211 fw uses */</span><br><span>       dsp_api.ndb->d_apcoff = ABB_VAL(APCOFF, (1 << 6) | MY_OFFSET) | 1; /* 2x slope for the GTA-02 ramp */</span><br><span> </span><br><span>   /* Load the TX Power into the DSP */</span><br><span>@@ -346,7 +388,8 @@</span><br><span> </span><br><span>       /* Update the ramp according to the PCL */</span><br><span>   for (i = 0; i < 16; i++)</span><br><span style="color: hsl(0, 100%, 40%);">-             dsp_api.ndb->a_ramp[i] = ABB_VAL(APCRAM, twl3025_default_ramp[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+         dsp_api.ndb->a_ramp[i] = ABB_VAL(APCRAM,</span><br><span style="color: hsl(120, 100%, 40%);">+                   ABB_RAMP_VAL(myramp->ramp_up[i], myramp->ramp_down[i]));</span><br><span> </span><br><span>   /* The Ramp Table is sent to ABB only once after RF init routine called */</span><br><span>   dsp_api.db_w->d_ctrl_abb |= (1 << B_RAMP) | (1 << B_BULRAMPDEL);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/12887">change 12887</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/12887"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmocom-bb </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Icf2693b751d86ec1d2563412d606c13d4c91a806 </div>
<div style="display:none"> Gerrit-Change-Number: 12887 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Vadim Yanitskiy <axilirator@gmail.com> </div>