<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-e1-hardware/+/26706">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">icE1usb firmware: Detect A-bit in TS0; set flag in usb xfer hdr<br><br>Scan over every odd E1 frame TS0 byte to check if the A-bit is<br>set, indiciating a remote alarm.  If so, set a new flag in the<br>USB IN transfer header.<br><br>Change-Id: Ic4f57cf79bd32cf75f81ef3073cb8d4a2d1857d8<br>---<br>M firmware/ice40-riscv/icE1usb/e1.c<br>M firmware/ice40-riscv/icE1usb/usb_e1.c<br>2 files changed, 25 insertions(+), 4 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-e1-hardware refs/changes/06/26706/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/firmware/ice40-riscv/icE1usb/e1.c b/firmware/ice40-riscv/icE1usb/e1.c</span><br><span>index 5e57480..1955936 100644</span><br><span>--- a/firmware/ice40-riscv/icE1usb/e1.c</span><br><span>+++ b/firmware/ice40-riscv/icE1usb/e1.c</span><br><span>@@ -288,12 +288,16 @@</span><br><span> #include "dma.h"</span><br><span> </span><br><span> unsigned int</span><br><span style="color: hsl(0, 100%, 40%);">-e1_rx_need_data(unsigned int usb_addr, unsigned int max_frames, unsigned int *pos)</span><br><span style="color: hsl(120, 100%, 40%);">+e1_rx_need_data(unsigned int usb_addr, unsigned int max_frames, unsigned int *pos,</span><br><span style="color: hsl(120, 100%, 40%);">+          unsigned int *alarm_cnt)</span><br><span> {</span><br><span>        unsigned int ofs;</span><br><span>    int tot_frames = 0;</span><br><span>  int n_frames;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+     if (alarm_cnt)</span><br><span style="color: hsl(120, 100%, 40%);">+                *alarm_cnt = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    while (max_frames) {</span><br><span>                 /* Get some data from the FIFO */</span><br><span>            n_frames = e1f_frame_read(&g_e1.rx.fifo, &ofs, max_frames);</span><br><span>@@ -314,6 +318,19 @@</span><br><span>           max_frames -= n_frames;</span><br><span>              tot_frames += n_frames;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+           /* While DMA is running: Determine if remote end indicates any alarms */</span><br><span style="color: hsl(120, 100%, 40%);">+              if (alarm_cnt) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      for (int i = 0; i < n_frames; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                               unsigned int frame_nr = ofs + i;</span><br><span style="color: hsl(120, 100%, 40%);">+                              /* A bit is present in every odd frame TS0 */</span><br><span style="color: hsl(120, 100%, 40%);">+                         if (frame_nr & 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                       uint8_t ts0 = *e1_data_ptr(0, ofs + i, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+                                    if (ts0 & 0x20)</span><br><span style="color: hsl(120, 100%, 40%);">+                                   *alarm_cnt++;</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%);">+</span><br><span>          /* Wait for DMA completion */</span><br><span>                while (dma_poll());</span><br><span>  }</span><br><span>diff --git a/firmware/ice40-riscv/icE1usb/usb_e1.c b/firmware/ice40-riscv/icE1usb/usb_e1.c</span><br><span>index e180fec..b96e761 100644</span><br><span>--- a/firmware/ice40-riscv/icE1usb/usb_e1.c</span><br><span>+++ b/firmware/ice40-riscv/icE1usb/usb_e1.c</span><br><span>@@ -42,7 +42,8 @@</span><br><span> </span><br><span> </span><br><span> /* Hack */</span><br><span style="color: hsl(0, 100%, 40%);">-unsigned int e1_rx_need_data(unsigned int usb_addr, unsigned int max_len, unsigned int *pos);</span><br><span style="color: hsl(120, 100%, 40%);">+unsigned int e1_rx_need_data(unsigned int usb_addr, unsigned int max_len, unsigned int *pos,</span><br><span style="color: hsl(120, 100%, 40%);">+                            unsigned int *alarm_cnt);</span><br><span> unsigned int e1_tx_feed_data(unsigned int usb_addr, unsigned int len);</span><br><span> unsigned int e1_tx_level(void);</span><br><span> unsigned int e1_rx_level(void);</span><br><span>@@ -115,7 +116,7 @@</span><br><span>         {</span><br><span>            uint32_t ptr = usb_ep_regs[2].in.bd[bdi].ptr;</span><br><span>                uint32_t hdr;</span><br><span style="color: hsl(0, 100%, 40%);">-           unsigned int pos;</span><br><span style="color: hsl(120, 100%, 40%);">+             unsigned int pos, alarm_cnt;</span><br><span> </span><br><span>             /* Error check */</span><br><span>            if ((usb_ep_regs[2].in.bd[bdi].csr & USB_BD_STATE_MSK) == USB_BD_STATE_DONE_ERR)</span><br><span>@@ -133,10 +134,13 @@</span><br><span>                 else if (!n)</span><br><span>                         break;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-              n = e1_rx_need_data((ptr >> 2) + 1, n, &pos);</span><br><span style="color: hsl(120, 100%, 40%);">+               n = e1_rx_need_data((ptr >> 2) + 1, n, &pos, &alarm_cnt);</span><br><span> </span><br><span>          /* Write header: currently version and pos (mfr/fr number) */</span><br><span>                hdr = (0 << 28) | (pos & 0xff);</span><br><span style="color: hsl(120, 100%, 40%);">+             /* indicate at least one remote alarm was reported within the frames of this transfer */</span><br><span style="color: hsl(120, 100%, 40%);">+              if (alarm_cnt)</span><br><span style="color: hsl(120, 100%, 40%);">+                        hdr |= (1 << 8);</span><br><span>               usb_data_write(ptr, &hdr, 4);</span><br><span> </span><br><span>                /* Resubmit */</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-e1-hardware/+/26706">change 26706</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/osmo-e1-hardware/+/26706"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-e1-hardware </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ic4f57cf79bd32cf75f81ef3073cb8d4a2d1857d8 </div>
<div style="display:none"> Gerrit-Change-Number: 26706 </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>