<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/13669">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Harald Welte: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">manual_test.c: New manual board testing mode<br><br>Change-Id: I8fc94fa08521224eff79d0aa9d7b42ceeaa760c9<br>---<br>M sysmoOCTSIM/gcc/Makefile<br>M sysmoOCTSIM/main.c<br>A sysmoOCTSIM/manual_test.c<br>3 files changed, 260 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/sysmoOCTSIM/gcc/Makefile b/sysmoOCTSIM/gcc/Makefile</span><br><span>index 7496377..376ddaf 100644</span><br><span>--- a/sysmoOCTSIM/gcc/Makefile</span><br><span>+++ b/sysmoOCTSIM/gcc/Makefile</span><br><span>@@ -77,6 +77,7 @@</span><br><span> gcc/gcc/startup_same54.o \</span><br><span> hal/src/hal_usb_device.o \</span><br><span> main.o \</span><br><span style="color: hsl(120, 100%, 40%);">+manual_test.o \</span><br><span> i2c_bitbang.o \</span><br><span> octsim_i2c.o \</span><br><span> ncn8025.o \</span><br><span>@@ -124,6 +125,7 @@</span><br><span> "gcc/gcc/startup_same54.o" \</span><br><span> "hal/src/hal_usb_device.o" \</span><br><span> "main.o" \</span><br><span style="color: hsl(120, 100%, 40%);">+"manual_test.o" \</span><br><span> "i2c_bitbang.o" \</span><br><span> "octsim_i2c.o" \</span><br><span> "ncn8025.o" \</span><br><span>@@ -177,6 +179,7 @@</span><br><span> "hal/src/hal_usart_async.d" \</span><br><span> "hpl/osc32kctrl/hpl_osc32kctrl.d" \</span><br><span> "main.d" \</span><br><span style="color: hsl(120, 100%, 40%);">+"manual_test.d" \</span><br><span> "i2c_bitbang.d" \</span><br><span> "octsim_i2c.d" \</span><br><span> "ncn8025.d" \</span><br><span>diff --git a/sysmoOCTSIM/main.c b/sysmoOCTSIM/main.c</span><br><span>index 93b90db..6c4e9e6 100644</span><br><span>--- a/sysmoOCTSIM/main.c</span><br><span>+++ b/sysmoOCTSIM/main.c</span><br><span>@@ -211,7 +211,7 @@</span><br><span> </span><br><span> </span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+extern void testmode_init(void);</span><br><span> </span><br><span> int main(void)</span><br><span> {</span><br><span>@@ -230,6 +230,7 @@</span><br><span>   command_register(&cmd_sim_clkdiv);</span><br><span>       command_register(&cmd_sim_voltage);</span><br><span>      command_register(&cmd_sim_led);</span><br><span style="color: hsl(120, 100%, 40%);">+   testmode_init();</span><br><span> </span><br><span>         printf("\r\n\r\nsysmocom sysmoOCTSIM\r\n");</span><br><span> </span><br><span>diff --git a/sysmoOCTSIM/manual_test.c b/sysmoOCTSIM/manual_test.c</span><br><span>new file mode 100644</span><br><span>index 0000000..5cc9bca</span><br><span>--- /dev/null</span><br><span>+++ b/sysmoOCTSIM/manual_test.c</span><br><span>@@ -0,0 +1,255 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright (C) 2019 Harald Welte <laforge@gnumonks.org></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</span><br><span style="color: hsl(120, 100%, 40%);">+ * modify it under the terms of the GNU General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * as published by the Free Software Foundation; either version 2</span><br><span style="color: hsl(120, 100%, 40%);">+ * of the License, or (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</span><br><span style="color: hsl(120, 100%, 40%);">+ * along with this program; if not, write to the Free Software</span><br><span style="color: hsl(120, 100%, 40%);">+ * Foundation, Inc., 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%);">+#include <stdlib.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdio.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <parts.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include "atmel_start.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "atmel_start_pins.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include "i2c_bitbang.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "octsim_i2c.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "ncn8025.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include "command.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+enum testmode_test {</span><br><span style="color: hsl(120, 100%, 40%);">+      TEST_USER_LED,</span><br><span style="color: hsl(120, 100%, 40%);">+        /* test the per-slot LED by blinking it shortly */</span><br><span style="color: hsl(120, 100%, 40%);">+    TEST_LED,</span><br><span style="color: hsl(120, 100%, 40%);">+     /* test the voltages of the SIMVCC */</span><br><span style="color: hsl(120, 100%, 40%);">+ TEST_VOLTAGE,</span><br><span style="color: hsl(120, 100%, 40%);">+ /* test the clock rates of the SIMCLK pin */</span><br><span style="color: hsl(120, 100%, 40%);">+  TEST_CLOCK,</span><br><span style="color: hsl(120, 100%, 40%);">+   /* test the RST line by asserting it low and then back high */</span><br><span style="color: hsl(120, 100%, 40%);">+        TEST_RST,</span><br><span style="color: hsl(120, 100%, 40%);">+     /* test the RST line by asserting it low and then back high */</span><br><span style="color: hsl(120, 100%, 40%);">+        TEST_IO,</span><br><span style="color: hsl(120, 100%, 40%);">+      _NUM_TESTS</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+static const char *test_names[_NUM_TESTS] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ [TEST_USER_LED] = "USER_LED",</span><br><span style="color: hsl(120, 100%, 40%);">+       [TEST_LED]      = "LED",</span><br><span style="color: hsl(120, 100%, 40%);">+    [TEST_VOLTAGE]  = "VOLTAGE",</span><br><span style="color: hsl(120, 100%, 40%);">+        [TEST_CLOCK]    = "CLOCK",</span><br><span style="color: hsl(120, 100%, 40%);">+  [TEST_RST]      = "RST",</span><br><span style="color: hsl(120, 100%, 40%);">+    [TEST_IO]       = "IO",</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 testmode_state {</span><br><span style="color: hsl(120, 100%, 40%);">+      uint8_t slot;</span><br><span style="color: hsl(120, 100%, 40%);">+ enum testmode_test test_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+   int test_int;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ncn8025_settings ncn;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+static struct testmode_state g_tms;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define BLINK_MS 500</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void set_slot(uint8_t slot)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        printf("changing slot to %u\r\n", slot);</span><br><span style="color: hsl(120, 100%, 40%);">+    g_tms.slot = slot;</span><br><span style="color: hsl(120, 100%, 40%);">+    g_tms.ncn = (struct ncn8025_settings) {</span><br><span style="color: hsl(120, 100%, 40%);">+               .rstin = false,</span><br><span style="color: hsl(120, 100%, 40%);">+               .cmdvcc = false,</span><br><span style="color: hsl(120, 100%, 40%);">+              .led = false,</span><br><span style="color: hsl(120, 100%, 40%);">+         .clkdiv = SIM_CLKDIV_8,</span><br><span style="color: hsl(120, 100%, 40%);">+               .vsel = SIM_VOLT_3V0,</span><br><span style="color: hsl(120, 100%, 40%);">+ };</span><br><span style="color: hsl(120, 100%, 40%);">+    ncn8025_set(g_tms.slot, &g_tms.ncn);</span><br><span style="color: hsl(120, 100%, 40%);">+      ncn8025_get(g_tms.slot, &g_tms.ncn);</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 next_test(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ g_tms.test_nr = (g_tms.test_nr + 1) % _NUM_TESTS;</span><br><span style="color: hsl(120, 100%, 40%);">+     g_tms.test_int = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   printf("changing test to %s\r\n", test_names[g_tms.test_nr]);</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 test_user_led(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      printf("blinking User LED\r\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  gpio_set_pin_function(PIN_PC26, GPIO_PIN_FUNCTION_OFF);</span><br><span style="color: hsl(120, 100%, 40%);">+       gpio_set_pin_direction(PIN_PC26, GPIO_DIRECTION_OUT);</span><br><span style="color: hsl(120, 100%, 40%);">+ gpio_set_pin_level(PIN_PC26, true);</span><br><span style="color: hsl(120, 100%, 40%);">+   delay_ms(BLINK_MS);</span><br><span style="color: hsl(120, 100%, 40%);">+   gpio_set_pin_level(PIN_PC26, false);</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 test_led(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      printf("blinking Slot LED\r\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  g_tms.ncn.led = true;</span><br><span style="color: hsl(120, 100%, 40%);">+ ncn8025_set(g_tms.slot, &g_tms.ncn);</span><br><span style="color: hsl(120, 100%, 40%);">+      delay_ms(BLINK_MS);</span><br><span style="color: hsl(120, 100%, 40%);">+   g_tms.ncn.led = false;</span><br><span style="color: hsl(120, 100%, 40%);">+        ncn8025_set(g_tms.slot, &g_tms.ncn);</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 enum ncn8025_sim_voltage voltage[3] = { SIM_VOLT_1V8, SIM_VOLT_3V0, SIM_VOLT_5V0 };</span><br><span style="color: hsl(120, 100%, 40%);">+static const char *voltage_name[3] = { "1.8", "3.0", "5.0" };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void ncn_change_voltage(enum ncn8025_sim_voltage vsel)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    /* first disable the output; VSEL changes require output to be disabled */</span><br><span style="color: hsl(120, 100%, 40%);">+    g_tms.ncn.cmdvcc = false;</span><br><span style="color: hsl(120, 100%, 40%);">+     ncn8025_set(g_tms.slot, &g_tms.ncn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* then re-enable it with the new voltage setting */</span><br><span style="color: hsl(120, 100%, 40%);">+  g_tms.ncn.vsel = vsel;</span><br><span style="color: hsl(120, 100%, 40%);">+        g_tms.ncn.cmdvcc = true;</span><br><span style="color: hsl(120, 100%, 40%);">+      ncn8025_set(g_tms.slot, &g_tms.ncn);</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 test_voltage(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      printf("Testing Voltage %s\r\n", voltage_name[g_tms.test_int]);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   ncn_change_voltage(voltage[g_tms.test_int]);</span><br><span style="color: hsl(120, 100%, 40%);">+  g_tms.test_int = (g_tms.test_int+1) % 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 enum ncn8025_sim_clkdiv clk_div[4] = { SIM_CLKDIV_8, SIM_CLKDIV_4, SIM_CLKDIV_2, SIM_CLKDIV_1 };</span><br><span style="color: hsl(120, 100%, 40%);">+static const uint8_t clk_div_val[4] = { 8, 4, 2, 1 };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void test_clock(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      printf("Testing Clock Divider %u\r\n", clk_div_val[g_tms.test_int]);</span><br><span style="color: hsl(120, 100%, 40%);">+        g_tms.ncn.cmdvcc = true;</span><br><span style="color: hsl(120, 100%, 40%);">+      g_tms.ncn.clkdiv = clk_div[g_tms.test_int];</span><br><span style="color: hsl(120, 100%, 40%);">+   ncn8025_set(g_tms.slot, &g_tms.ncn);</span><br><span style="color: hsl(120, 100%, 40%);">+      g_tms.test_int = (g_tms.test_int+1) % 4;</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 test_rst(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  printf("blinking RST\r\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* well-defined voltage for LED brightness */</span><br><span style="color: hsl(120, 100%, 40%);">+ ncn_change_voltage(SIM_VOLT_3V0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   g_tms.ncn.cmdvcc = true;</span><br><span style="color: hsl(120, 100%, 40%);">+      g_tms.ncn.rstin = true;</span><br><span style="color: hsl(120, 100%, 40%);">+       ncn8025_set(g_tms.slot, &g_tms.ncn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    delay_ms(BLINK_MS);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ g_tms.ncn.rstin = false;</span><br><span style="color: hsl(120, 100%, 40%);">+      ncn8025_set(g_tms.slot, &g_tms.ncn);</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%);">+#ifndef SIM7_IO</span><br><span style="color: hsl(120, 100%, 40%);">+#define SIM7_IO PIN_PB21</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+static const enum gpio_port sim_io_gpio[] = { SIM0_IO, SIM1_IO, SIM2_IO, SIM3_IO,</span><br><span style="color: hsl(120, 100%, 40%);">+                                         SIM4_IO, SIM5_IO, SIM6_IO, SIM7_IO };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void test_io(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   enum gpio_port gpio = sim_io_gpio[g_tms.slot];</span><br><span style="color: hsl(120, 100%, 40%);">+        printf("blinking I/O\r\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* well-defined voltage for LED brightness */</span><br><span style="color: hsl(120, 100%, 40%);">+ ncn_change_voltage(SIM_VOLT_3V0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   gpio_set_pin_function(gpio, GPIO_PIN_FUNCTION_OFF);</span><br><span style="color: hsl(120, 100%, 40%);">+   gpio_set_pin_direction(gpio, GPIO_DIRECTION_OUT);</span><br><span style="color: hsl(120, 100%, 40%);">+     gpio_set_pin_level(gpio, false);</span><br><span style="color: hsl(120, 100%, 40%);">+      delay_ms(BLINK_MS);</span><br><span style="color: hsl(120, 100%, 40%);">+   gpio_set_pin_level(gpio, true);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* FIXME: restore tack to original function! */</span><br><span style="color: hsl(120, 100%, 40%);">+       //gpio_set_pin_function(sim_io_gpio[g_tms.slot], GPIO_PIN_FUNCTION_OFF);</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%);">+typedef void (*test_fn)(void);</span><br><span style="color: hsl(120, 100%, 40%);">+static const test_fn test_functions[_NUM_TESTS] = {</span><br><span style="color: hsl(120, 100%, 40%);">+    [TEST_USER_LED] = test_user_led,</span><br><span style="color: hsl(120, 100%, 40%);">+      [TEST_LED] = test_led,</span><br><span style="color: hsl(120, 100%, 40%);">+        [TEST_VOLTAGE] = test_voltage,</span><br><span style="color: hsl(120, 100%, 40%);">+        [TEST_CLOCK] = test_clock,</span><br><span style="color: hsl(120, 100%, 40%);">+    [TEST_RST] = test_rst,</span><br><span style="color: hsl(120, 100%, 40%);">+        [TEST_IO] = test_io,</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 execute_test(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("(%u) %-10s: ", g_tms.slot, test_names[g_tms.test_nr]);</span><br><span style="color: hsl(120, 100%, 40%);">+      test_functions[g_tms.test_nr]();</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 wait_for_key_and_process(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   int c;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      do {</span><br><span style="color: hsl(120, 100%, 40%);">+  } while (!usart_sync_is_rx_not_empty(&UART_debug));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     c = getchar();</span><br><span style="color: hsl(120, 100%, 40%);">+        if (c < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+         return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  switch (c) {</span><br><span style="color: hsl(120, 100%, 40%);">+  case '0':</span><br><span style="color: hsl(120, 100%, 40%);">+     case '1':</span><br><span style="color: hsl(120, 100%, 40%);">+     case '2':</span><br><span style="color: hsl(120, 100%, 40%);">+     case '3':</span><br><span style="color: hsl(120, 100%, 40%);">+     case '4':</span><br><span style="color: hsl(120, 100%, 40%);">+     case '5':</span><br><span style="color: hsl(120, 100%, 40%);">+     case '6':</span><br><span style="color: hsl(120, 100%, 40%);">+     case '7':</span><br><span style="color: hsl(120, 100%, 40%);">+             set_slot(c - '0');</span><br><span style="color: hsl(120, 100%, 40%);">+            execute_test();</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case 'n':</span><br><span style="color: hsl(120, 100%, 40%);">+     case 'N':</span><br><span style="color: hsl(120, 100%, 40%);">+             next_test();</span><br><span style="color: hsl(120, 100%, 40%);">+          execute_test();</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case 'Q':</span><br><span style="color: hsl(120, 100%, 40%);">+     case 'q':</span><br><span style="color: hsl(120, 100%, 40%);">+             printf("Leaving Test Mode\r\n");</span><br><span style="color: hsl(120, 100%, 40%);">+            return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+    case ' ':</span><br><span style="color: hsl(120, 100%, 40%);">+             execute_test();</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%);">+     return 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%);">+DEFUN(testmode_fn, cmd_testmode,</span><br><span style="color: hsl(120, 100%, 40%);">+      "testmode", "Enter board testing mode (Use `Q` to exit)")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      printf("Manual test mode. 'Q': exit, 'N': next test, SPACE: re-run, '0'-'7': slot\r\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  printf("SPACE will start the current test (%s)\r\n", test_names[g_tms.test_nr]);</span><br><span style="color: hsl(120, 100%, 40%);">+    while (1) {</span><br><span style="color: hsl(120, 100%, 40%);">+           if (wait_for_key_and_process() < 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%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void testmode_init(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   command_register(&cmd_testmode);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/13669">change 13669</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/13669"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-ccid-firmware </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I8fc94fa08521224eff79d0aa9d7b42ceeaa760c9 </div>
<div style="display:none"> Gerrit-Change-Number: 13669 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>