<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/simtrace2/+/17478">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  laforge: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">pio_it.c: Permit repeated calls to PIO_ConfigureIt()<br><br>The original code assumes that calls to PIO_ConfigureIt() are only<br>made once e.g. during board start-up.  Hoewever, we call those<br>at USB SetConfiguration time, when we know which particular hardware<br>function we are supposed to perform.   This means that after the host<br>has issued SetConfiguration more than a given number of times, the<br>code will assert() due to overflow of the static array.<br><br>Let's check if we already have allocated an array slot for a given pin<br>and reuse that allocated array bucket rather than allocating new ones<br>for the same pin.<br><br>Change-Id: I0c46d4b51eeebd58a8786d65e31e7a84e65b6a8e<br>Related: OS#4454<br>---<br>M firmware/atmel_softpack_libraries/libchip_sam3s/source/pio_it.c<br>M hardware/board_gpio.gnumeric<br>2 files changed, 19 insertions(+), 7 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/firmware/atmel_softpack_libraries/libchip_sam3s/source/pio_it.c b/firmware/atmel_softpack_libraries/libchip_sam3s/source/pio_it.c</span><br><span>index 7feccd1..781b914 100644</span><br><span>--- a/firmware/atmel_softpack_libraries/libchip_sam3s/source/pio_it.c</span><br><span>+++ b/firmware/atmel_softpack_libraries/libchip_sam3s/source/pio_it.c</span><br><span>@@ -211,6 +211,16 @@</span><br><span>     NVIC_EnableIRQ( PIOC_IRQn ) ;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static InterruptSource *find_intsource4pin(const Pin *pPin)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    unsigned int i ;</span><br><span style="color: hsl(120, 100%, 40%);">+    for (i = 0; i < _dwNumSources; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+        if (_aIntSources[i].pPin == pPin)</span><br><span style="color: hsl(120, 100%, 40%);">+           return &_aIntSources[i];</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+    return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /**</span><br><span>  * Configures a PIO or a group of PIO to generate an interrupt on status</span><br><span>  * change. The provided interrupt handler will be called with the triggering</span><br><span>@@ -228,15 +238,17 @@</span><br><span> </span><br><span>     assert( pPin ) ;</span><br><span>     pio = pPin->pio ;</span><br><span style="color: hsl(0, 100%, 40%);">-    assert( _dwNumSources < MAX_INTERRUPT_SOURCES ) ;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    /* Define new source */</span><br><span style="color: hsl(0, 100%, 40%);">-    TRACE_DEBUG( "PIO_ConfigureIt: Defining new source #%" PRIu32 ".\n\r",  _dwNumSources ) ;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    pSource = &(_aIntSources[_dwNumSources]) ;</span><br><span style="color: hsl(0, 100%, 40%);">-    pSource->pPin = pPin ;</span><br><span style="color: hsl(120, 100%, 40%);">+    pSource = find_intsource4pin(pPin);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!pSource) {</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Define new source */</span><br><span style="color: hsl(120, 100%, 40%);">+        TRACE_DEBUG( "PIO_ConfigureIt: Defining new source #%" PRIu32 ".\n\r",  _dwNumSources ) ;</span><br><span style="color: hsl(120, 100%, 40%);">+        assert( _dwNumSources < MAX_INTERRUPT_SOURCES ) ;</span><br><span style="color: hsl(120, 100%, 40%);">+        pSource = &(_aIntSources[_dwNumSources]) ;</span><br><span style="color: hsl(120, 100%, 40%);">+        pSource->pPin = pPin ;</span><br><span style="color: hsl(120, 100%, 40%);">+        _dwNumSources++ ;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span>     pSource->handler = handler ;</span><br><span style="color: hsl(0, 100%, 40%);">-    _dwNumSources++ ;</span><br><span> </span><br><span>     /* PIO3 with additional interrupt support</span><br><span>      * Configure additional interrupt mode registers */</span><br><span>diff --git a/hardware/board_gpio.gnumeric b/hardware/board_gpio.gnumeric</span><br><span>index 1ec9ff6..0e4893d 100644</span><br><span>--- a/hardware/board_gpio.gnumeric</span><br><span>+++ b/hardware/board_gpio.gnumeric</span><br><span>Binary files differ</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/simtrace2/+/17478">change 17478</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/simtrace2/+/17478"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: simtrace2 </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I0c46d4b51eeebd58a8786d65e31e7a84e65b6a8e </div>
<div style="display:none"> Gerrit-Change-Number: 17478 </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-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>