<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmocom-bb/+/20329">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">firmware: gtm900b: fix flash-based hardware variant autodetection<br><br>The original code used simplified logic whereby it assumed that<br>Spansion flash means MG01GSMT and Samsung flash means MGCxGSMT.<br>However, there exist MGC2GSMT hw variants with Spansion S71PL032J<br>flash in them, thus it is necessary to check the complete device ID<br>rather than just the flash manufacturer ID to distinguish between<br>MG01GSMT with 8 MiB flash (S71PL064J) and MGCxGSMT with 4 MiB flash<br>(S71PL032J, K5A3281CTM or K5L3316CAM).<br><br>Distinguishing between 4 MiB and 8 MiB flash chip types is also<br>necessary in order to configure TIFFS reader for the correct FFS<br>location matching that used by the original firmware, which is<br>in turn necessary in order to read factory RF calibration values.<br><br>Closes: OS#4769<br>Change-Id: Iaa5bd295e9cbf6b525fa385f9d6cd7fcd7f8a4dd<br>---<br>M src/target/firmware/board/gtm900b/init.c<br>M src/target/firmware/board/gtm900b/rffe_gtm900b.c<br>2 files changed, 72 insertions(+), 33 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/29/20329/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/target/firmware/board/gtm900b/init.c b/src/target/firmware/board/gtm900b/init.c</span><br><span>index 8de9956..934e96e 100644</span><br><span>--- a/src/target/firmware/board/gtm900b/init.c</span><br><span>+++ b/src/target/firmware/board/gtm900b/init.c</span><br><span>@@ -56,6 +56,8 @@</span><br><span> #define LPG_LCR_REG  0xfffe7800</span><br><span> #define LPG_PM_REG        0xfffe7801</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int gtm900_hw_is_mg01gsmt;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static void board_io_init(void)</span><br><span> {</span><br><span>         uint16_t reg;</span><br><span>@@ -85,6 +87,68 @@</span><br><span>   writew(reg, ARM_CONF_REG);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * There exist two firmware-incompatible versions of GTM900-B hardware:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MG01GSMT and MGCxGSMT.  They have different flash chip types (8 MiB</span><br><span style="color: hsl(120, 100%, 40%);">+ * vs. 4 MiB) with correspondingly different TIFFS configurations</span><br><span style="color: hsl(120, 100%, 40%);">+ * (and we need TIFFS in order to read factory RF calibration values),</span><br><span style="color: hsl(120, 100%, 40%);">+ * and they have different (incompatible) RFFE control signals.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * We are going to check the flash chip type and use it to decide which</span><br><span style="color: hsl(120, 100%, 40%);">+ * hw variant we are running on.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+static void board_flash_init(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       uint16_t manufacturer_id, device_id[3];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Use an address above the Calypso boot ROM</span><br><span style="color: hsl(120, 100%, 40%);">+   * so we don't need to unmap it to access the flash. */</span><br><span style="color: hsl(120, 100%, 40%);">+   flash_get_id((void *)0x40000, &manufacturer_id, device_id);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     switch (manufacturer_id) {</span><br><span style="color: hsl(120, 100%, 40%);">+    case CFI_MANUF_SPANSION:</span><br><span style="color: hsl(120, 100%, 40%);">+              /* is it S71PL064J? */</span><br><span style="color: hsl(120, 100%, 40%);">+                if (device_id[0] == 0x227E && device_id[1] == 0x2202 &&</span><br><span style="color: hsl(120, 100%, 40%);">+                   device_id[2] == 0x2201) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 gtm900_hw_is_mg01gsmt = 1;</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%);">+             /* is it S71PL032J? */</span><br><span style="color: hsl(120, 100%, 40%);">+                if (device_id[0] == 0x227E && device_id[1] == 0x220A &&</span><br><span style="color: hsl(120, 100%, 40%);">+                   device_id[2] == 0x2201) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 gtm900_hw_is_mg01gsmt = 0;</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%);">+             goto bad;</span><br><span style="color: hsl(120, 100%, 40%);">+     case CFI_MANUF_SAMSUNG:</span><br><span style="color: hsl(120, 100%, 40%);">+               /* is it K5A3281CTM? */</span><br><span style="color: hsl(120, 100%, 40%);">+               if (device_id[0] == 0x22A0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 gtm900_hw_is_mg01gsmt = 0;</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%);">+             /* is it K5L3316CAM? */</span><br><span style="color: hsl(120, 100%, 40%);">+               if (device_id[0] == 0x257E && device_id[1] == 0x2503 &&</span><br><span style="color: hsl(120, 100%, 40%);">+                   device_id[2] == 0x2501) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 gtm900_hw_is_mg01gsmt = 0;</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%);">+             /* FALL THRU */</span><br><span style="color: hsl(120, 100%, 40%);">+       default:</span><br><span style="color: hsl(120, 100%, 40%);">+      bad:</span><br><span style="color: hsl(120, 100%, 40%);">+          printf("Unknown module detected, "</span><br><span style="color: hsl(120, 100%, 40%);">+                 "flash ID 0x%04x 0x%04x 0x%04x 0x%04x\n"</span><br><span style="color: hsl(120, 100%, 40%);">+                    "Please contact mailing list!\n\n", manufacturer_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                device_id[0], device_id[1], device_id[2]);</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%);">+   /* Initialize TIFFS reader */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (gtm900_hw_is_mg01gsmt)</span><br><span style="color: hsl(120, 100%, 40%);">+            tiffs_init(0x700000, 0x10000, 15);</span><br><span style="color: hsl(120, 100%, 40%);">+    else</span><br><span style="color: hsl(120, 100%, 40%);">+          tiffs_init(0x380000, 0x10000, 7);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> void board_init(int with_irq)</span><br><span> {</span><br><span>         /*</span><br><span>@@ -151,4 +215,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 board flash */</span><br><span style="color: hsl(120, 100%, 40%);">+  board_flash_init();</span><br><span> }</span><br><span>diff --git a/src/target/firmware/board/gtm900b/rffe_gtm900b.c b/src/target/firmware/board/gtm900b/rffe_gtm900b.c</span><br><span>index 633c637..3efb5e2 100644</span><br><span>--- a/src/target/firmware/board/gtm900b/rffe_gtm900b.c</span><br><span>+++ b/src/target/firmware/board/gtm900b/rffe_gtm900b.c</span><br><span>@@ -1,5 +1,5 @@</span><br><span> /* RF frontend driver for Huawei GTM900-B modems, supporting both</span><br><span style="color: hsl(0, 100%, 40%);">- * MG01GSMT and MG01GSMT hardware variants */</span><br><span style="color: hsl(120, 100%, 40%);">+ * MG01GSMT and MGCxGSMT hardware variants */</span><br><span> </span><br><span> /* (C) 2019 by Steve Markgraf <steve@steve-m.de></span><br><span>  *</span><br><span>@@ -63,12 +63,7 @@</span><br><span>  * Tx2: high band PA output</span><br><span>  */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-typedef enum rffe_var {</span><br><span style="color: hsl(0, 100%, 40%);">-      RFFE_MGC2GSMT,</span><br><span style="color: hsl(0, 100%, 40%);">-  RFFE_MG01GSMT</span><br><span style="color: hsl(0, 100%, 40%);">-} rffe_var_t;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static rffe_var_t rffe_variant = RFFE_MGC2GSMT;</span><br><span style="color: hsl(120, 100%, 40%);">+extern int gtm900_hw_is_mg01gsmt;    /* set in init.c */</span><br><span> </span><br><span> static inline void rffe_mode_mgc2gsmt(enum gsm_band band, int tx)</span><br><span> {</span><br><span>@@ -139,10 +134,10 @@</span><br><span> /* switch RF Frontend Mode */</span><br><span> void rffe_mode(enum gsm_band band, int tx)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   if (rffe_variant == RFFE_MGC2GSMT)</span><br><span style="color: hsl(0, 100%, 40%);">-              rffe_mode_mgc2gsmt(band, tx);</span><br><span style="color: hsl(0, 100%, 40%);">-   else</span><br><span style="color: hsl(120, 100%, 40%);">+  if (gtm900_hw_is_mg01gsmt)</span><br><span>           rffe_mode_mg01gsmt(band, tx);</span><br><span style="color: hsl(120, 100%, 40%);">+ else</span><br><span style="color: hsl(120, 100%, 40%);">+          rffe_mode_mgc2gsmt(band, tx);</span><br><span> }</span><br><span> </span><br><span> uint32_t rffe_get_rx_ports(void)</span><br><span>@@ -166,7 +161,6 @@</span><br><span> void rffe_init(void)</span><br><span> {</span><br><span>        uint16_t reg;</span><br><span style="color: hsl(0, 100%, 40%);">-   uint16_t manufacturer_id = 0;</span><br><span> </span><br><span>    reg = readw(ARM_CONF_REG);</span><br><span>   reg &= ~ (1 << 7);    /* TSPACT4 I/O function, not nRDYMEM */</span><br><span>@@ -176,28 +170,6 @@</span><br><span>       tsp_setup(IOTA_STROBE, 1, 0, 0);</span><br><span> </span><br><span>         trf6151_init(RITA_STROBE, RITA_RESET);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  /* Detect the used RFFE variant based on the used flash chip.</span><br><span style="color: hsl(0, 100%, 40%);">-    * The MGC2GSMT uses a Samsung flash, whereas the MG01GSMT uses</span><br><span style="color: hsl(0, 100%, 40%);">-  * a Spansion flash. We use an address above the Calpso bootrom</span><br><span style="color: hsl(0, 100%, 40%);">-  * so we do not need to unmap it to access the flash. */</span><br><span style="color: hsl(0, 100%, 40%);">-        flash_get_id((void *)0x40000, &manufacturer_id, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      switch (manufacturer_id) {</span><br><span style="color: hsl(0, 100%, 40%);">-      case CFI_MANUF_SPANSION:</span><br><span style="color: hsl(0, 100%, 40%);">-                printf("Detected MG01GSMT module\n\n");</span><br><span style="color: hsl(0, 100%, 40%);">-               rffe_variant = RFFE_MG01GSMT;</span><br><span style="color: hsl(0, 100%, 40%);">-           break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case CFI_MANUF_SAMSUNG:</span><br><span style="color: hsl(0, 100%, 40%);">-         printf("Detected MGC2GSMT module\n\n");</span><br><span style="color: hsl(0, 100%, 40%);">-               rffe_variant = RFFE_MGC2GSMT;</span><br><span style="color: hsl(0, 100%, 40%);">-           break;</span><br><span style="color: hsl(0, 100%, 40%);">-  default:</span><br><span style="color: hsl(0, 100%, 40%);">-                printf("Unknown module detected, flash ID 0x%4.4x\n"</span><br><span style="color: hsl(0, 100%, 40%);">-                 "Please contact mailing list!\n\n", manufacturer_id);</span><br><span style="color: hsl(0, 100%, 40%);">-          rffe_variant = RFFE_MGC2GSMT;</span><br><span style="color: hsl(0, 100%, 40%);">-           break;</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span> }</span><br><span> </span><br><span> uint8_t rffe_get_gain(void)</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmocom-bb/+/20329">change 20329</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/c/osmocom-bb/+/20329"/><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-Change-Id: Iaa5bd295e9cbf6b525fa385f9d6cd7fcd7f8a4dd </div>
<div style="display:none"> Gerrit-Change-Number: 20329 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>