<p>steve-m has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmocom-bb/+/15151">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">fw/flash: Read extended ID, expose API<br><br>We now unlock the flash before reading the<br>extended ID (required for Spansion and Samsung<br>flash chips). These commands will be ignored<br>by Intel/ST flash chips, and this change has been<br>verified with all flash chips we support.<br><br>Furthermore, expose the API for reading the flash ID.<br><br>Change-Id: I3bcd71c84c8931bcd574953063737b51a41738a3<br>---<br>M src/target/firmware/flash/cfi_flash.c<br>M src/target/firmware/include/flash/cfi_flash.h<br>2 files changed, 36 insertions(+), 14 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/51/15151/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/target/firmware/flash/cfi_flash.c b/src/target/firmware/flash/cfi_flash.c</span><br><span>index 974165d..2f8cde0 100644</span><br><span>--- a/src/target/firmware/flash/cfi_flash.c</span><br><span>+++ b/src/target/firmware/flash/cfi_flash.c</span><br><span>@@ -69,12 +69,6 @@</span><br><span>    struct cfi_region erase_regions[CFI_FLASH_MAX_ERASE_REGIONS];</span><br><span> } __attribute__ ((packed));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* manufacturer ids */</span><br><span style="color: hsl(0, 100%, 40%);">-enum cfi_manuf {</span><br><span style="color: hsl(0, 100%, 40%);">-  CFI_MANUF_ST    = 0x0020,</span><br><span style="color: hsl(0, 100%, 40%);">-       CFI_MANUF_INTEL = 0x0089,</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* algorithm ids */</span><br><span> enum cfi_algo {</span><br><span>        CFI_ALGO_INTEL_3 = 0x03</span><br><span>@@ -83,6 +77,7 @@</span><br><span> /* various command bytes */</span><br><span> enum cfi_flash_cmd {</span><br><span>   CFI_CMD_RESET = 0xff,</span><br><span style="color: hsl(120, 100%, 40%);">+ CFI_CMD_RESET_TO_READ_MODE = 0xF0,</span><br><span>   CFI_CMD_READ_ID = 0x90,</span><br><span>      CFI_CMD_CFI = 0x98,</span><br><span>  CFI_CMD_READ_STATUS = 0x70,</span><br><span>@@ -91,6 +86,8 @@</span><br><span>      CFI_CMD_BLOCK_ERASE = 0x20,</span><br><span>  CFI_CMD_ERASE_CONFIRM = 0xD0,</span><br><span>        CFI_CMD_PROTECT = 0x60,</span><br><span style="color: hsl(120, 100%, 40%);">+       CFI_CMD_UNLOCK1 = 0xAA,</span><br><span style="color: hsl(120, 100%, 40%);">+       CFI_CMD_UNLOCK2 = 0x55,</span><br><span> };</span><br><span> </span><br><span> /* protection commands */</span><br><span>@@ -104,6 +101,8 @@</span><br><span> enum flash_offset {</span><br><span>  CFI_OFFSET_MANUFACTURER_ID = 0x00,</span><br><span>   CFI_OFFSET_DEVICE_ID = 0x01,</span><br><span style="color: hsl(120, 100%, 40%);">+  CFI_OFFSET_EXT_DEVICE_ID1 = 0x0E,</span><br><span style="color: hsl(120, 100%, 40%);">+     CFI_OFFSET_EXT_DEVICE_ID2 = 0x0F,</span><br><span>    CFI_OFFSET_INTEL_PROTECTION = 0x81,</span><br><span>  CFI_OFFSET_CFI_RESP = 0x10</span><br><span> };</span><br><span>@@ -125,6 +124,9 @@</span><br><span>       CFI_STATUS_RESERVED = 0x01</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define CFI_CMD_ADDR1                     0xAAA</span><br><span style="color: hsl(120, 100%, 40%);">+#define CFI_CMD_ADDR2                    0x555</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> __ramtext</span><br><span> static inline void flash_write_cmd(const void *base_addr, uint16_t cmd)</span><br><span> {</span><br><span>@@ -379,17 +381,27 @@</span><br><span>         return res;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* Internal: retrieve manufacturer and device id from id space */</span><br><span style="color: hsl(120, 100%, 40%);">+/* retrieve manufacturer and extended device id from id space */</span><br><span> __ramtext</span><br><span style="color: hsl(0, 100%, 40%);">-static int get_id(void *base_addr,</span><br><span style="color: hsl(120, 100%, 40%);">+int flash_get_id(void *base_addr,</span><br><span>              uint16_t * manufacturer_id, uint16_t * device_id)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        flash_write_cmd(base_addr, CFI_CMD_READ_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+  flash_write_cmd(base_addr, CFI_CMD_RESET_TO_READ_MODE);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     *manufacturer_id = flash_read16(base_addr, CFI_OFFSET_MANUFACTURER_ID);</span><br><span style="color: hsl(0, 100%, 40%);">- *device_id = flash_read16(base_addr, CFI_OFFSET_DEVICE_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+   flash_write_cmd(base_addr + CFI_CMD_ADDR1, CFI_CMD_UNLOCK1);</span><br><span style="color: hsl(120, 100%, 40%);">+  flash_write_cmd(base_addr + CFI_CMD_ADDR2, CFI_CMD_UNLOCK2);</span><br><span style="color: hsl(120, 100%, 40%);">+  flash_write_cmd(base_addr + CFI_CMD_ADDR1, CFI_CMD_READ_ID);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        flash_write_cmd(base_addr, CFI_CMD_RESET);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (manufacturer_id)</span><br><span style="color: hsl(120, 100%, 40%);">+          *manufacturer_id = flash_read16(base_addr, CFI_OFFSET_MANUFACTURER_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (device_id) {</span><br><span style="color: hsl(120, 100%, 40%);">+              device_id[0] = flash_read16(base_addr, CFI_OFFSET_DEVICE_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+         device_id[1] = flash_read16(base_addr, CFI_OFFSET_EXT_DEVICE_ID1);</span><br><span style="color: hsl(120, 100%, 40%);">+            device_id[2] = flash_read16(base_addr, CFI_OFFSET_EXT_DEVICE_ID2);</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%);">+   flash_write_cmd(base_addr, CFI_CMD_RESET_TO_READ_MODE);</span><br><span> </span><br><span>  return 0;</span><br><span> }</span><br><span>@@ -524,12 +536,12 @@</span><br><span> {</span><br><span>  int res;</span><br><span>     unsigned u;</span><br><span style="color: hsl(0, 100%, 40%);">-     uint16_t m_id, d_id;</span><br><span style="color: hsl(120, 100%, 40%);">+  uint16_t m_id, d_id[3];</span><br><span>      uint32_t base;</span><br><span>       struct cfi_query qry;</span><br><span> </span><br><span>    /* retrieve and check manufacturer and device id */</span><br><span style="color: hsl(0, 100%, 40%);">-     res = get_id(base_addr, &m_id, &d_id);</span><br><span style="color: hsl(120, 100%, 40%);">+        res = flash_get_id(base_addr, &m_id, d_id);</span><br><span>      if (res) {</span><br><span>           return res;</span><br><span>  }</span><br><span>diff --git a/src/target/firmware/include/flash/cfi_flash.h b/src/target/firmware/include/flash/cfi_flash.h</span><br><span>index 9d8b33a..8589fb6 100644</span><br><span>--- a/src/target/firmware/include/flash/cfi_flash.h</span><br><span>+++ b/src/target/firmware/include/flash/cfi_flash.h</span><br><span>@@ -26,6 +26,14 @@</span><br><span>      FLASH_LOCKED_DOWN</span><br><span> } flash_lock_t;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* manufacturer ids */</span><br><span style="color: hsl(120, 100%, 40%);">+enum cfi_manuf {</span><br><span style="color: hsl(120, 100%, 40%);">+    CFI_MANUF_ST       = 0x0020,</span><br><span style="color: hsl(120, 100%, 40%);">+  CFI_MANUF_INTEL    = 0x0089,</span><br><span style="color: hsl(120, 100%, 40%);">+  CFI_MANUF_SPANSION = 0x0001,</span><br><span style="color: hsl(120, 100%, 40%);">+  CFI_MANUF_SAMSUNG  = 0x00EC,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int flash_init(flash_t *flash, void *base_addr);</span><br><span> </span><br><span> flash_lock_t flash_block_getlock(flash_t *flash, uint32_t block_offset);</span><br><span>@@ -38,4 +46,6 @@</span><br><span> </span><br><span> int flash_program(flash_t *flash, uint32_t dst_offset, void *src, uint32_t nbytes);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int flash_get_id(void *base_addr, uint16_t * manufacturer_id, uint16_t * device_id);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #endif</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmocom-bb/+/15151">change 15151</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/+/15151"/><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: I3bcd71c84c8931bcd574953063737b51a41738a3 </div>
<div style="display:none"> Gerrit-Change-Number: 15151 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: steve-m <steve@steve-m.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>