<p>Hoernchen has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/16254">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">enable the final slot<br><br>Change-Id: I1c18459d7e43e6fbd1022fabb52138904f2bf480<br>---<br>M sysmoOCTSIM/atmel_start.c<br>M sysmoOCTSIM/atmel_start_pins.h<br>M sysmoOCTSIM/command.c<br>M sysmoOCTSIM/config/hpl_sercom_config.h<br>M sysmoOCTSIM/cuart_driver_asf4_usart_async.c<br>M sysmoOCTSIM/driver_init.c<br>M sysmoOCTSIM/driver_init.h<br>M sysmoOCTSIM/gcc/Makefile<br>M sysmoOCTSIM/libosmo_emb.c<br>M sysmoOCTSIM/main.c<br>D sysmoOCTSIM/manual_test.c<br>M sysmoOCTSIM/stdio_start.c<br>12 files changed, 357 insertions(+), 267 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-ccid-firmware refs/changes/54/16254/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/sysmoOCTSIM/atmel_start.c b/sysmoOCTSIM/atmel_start.c</span><br><span>index 6670364..931a09a 100644</span><br><span>--- a/sysmoOCTSIM/atmel_start.c</span><br><span>+++ b/sysmoOCTSIM/atmel_start.c</span><br><span>@@ -14,6 +14,8 @@</span><br><span>  system_init();</span><br><span>       dma_memory_init();</span><br><span>   dma_memory_register_callback(DMA_MEMORY_COMPLETE_CB, M2M_DMA_complete_cb);</span><br><span style="color: hsl(0, 100%, 40%);">-//    stdio_redirect_init();</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef ENABLE_DBG_UART7</span><br><span style="color: hsl(120, 100%, 40%);">+       stdio_redirect_init();</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span>       usb_init();</span><br><span> }</span><br><span>diff --git a/sysmoOCTSIM/atmel_start_pins.h b/sysmoOCTSIM/atmel_start_pins.h</span><br><span>index 7cbaed5..0c33536 100644</span><br><span>--- a/sysmoOCTSIM/atmel_start_pins.h</span><br><span>+++ b/sysmoOCTSIM/atmel_start_pins.h</span><br><span>@@ -60,6 +60,7 @@</span><br><span> #define SWITCH GPIO(GPIO_PORTC, 14)</span><br><span> #define MUX_STAT GPIO(GPIO_PORTC, 15)</span><br><span> #define SIM6_IO GPIO(GPIO_PORTC, 16)</span><br><span style="color: hsl(120, 100%, 40%);">+#define SIM7_IO GPIO(GPIO_PORTB, 21)</span><br><span> #define USER_LED GPIO(GPIO_PORTC, 26)</span><br><span> #define SCL4 GPIO(GPIO_PORTC, 27)</span><br><span> #define SDA4 GPIO(GPIO_PORTC, 28)</span><br><span>diff --git a/sysmoOCTSIM/command.c b/sysmoOCTSIM/command.c</span><br><span>index 454cd2f..48d8c11 100644</span><br><span>--- a/sysmoOCTSIM/command.c</span><br><span>+++ b/sysmoOCTSIM/command.c</span><br><span>@@ -78,6 +78,7 @@</span><br><span> </span><br><span> void command_try_recv(void)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef ENABLE_DBG_UART7</span><br><span>     unsigned int i = 0;</span><br><span> </span><br><span>      /* yield CPU after maximum of 10 received characters */</span><br><span>@@ -101,6 +102,7 @@</span><br><span> </span><br><span>            i++;</span><br><span>         }</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span> }</span><br><span> </span><br><span> void command_init(const char *prompt)</span><br><span>diff --git a/sysmoOCTSIM/config/hpl_sercom_config.h b/sysmoOCTSIM/config/hpl_sercom_config.h</span><br><span>index bb2bbff..86b4c0a 100644</span><br><span>--- a/sysmoOCTSIM/config/hpl_sercom_config.h</span><br><span>+++ b/sysmoOCTSIM/config/hpl_sercom_config.h</span><br><span>@@ -1910,6 +1910,8 @@</span><br><span> </span><br><span> #include <peripheral_clk_config.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef ENABLE_DBG_UART7</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #ifndef CONF_SERCOM_7_USART_ENABLE</span><br><span> #define CONF_SERCOM_7_USART_ENABLE 1</span><br><span> #endif</span><br><span>@@ -2176,7 +2178,281 @@</span><br><span> #define CONF_SERCOM_7_USART_RECEIVE_PULSE_LENGTH 0</span><br><span> #endif</span><br><span> #endif</span><br><span style="color: hsl(120, 100%, 40%);">+#else</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#include <peripheral_clk_config.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef CONF_SERCOM_7_USART_ENABLE</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_ENABLE 1</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+// <h> Basic Configuration</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+// <q> Receive buffer enable</span><br><span style="color: hsl(120, 100%, 40%);">+// <i> Enable input buffer in SERCOM module</span><br><span style="color: hsl(120, 100%, 40%);">+// <id> usart_rx_enable</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef CONF_SERCOM_7_USART_RXEN</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_RXEN 1</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+// <q> Transmitt buffer enable</span><br><span style="color: hsl(120, 100%, 40%);">+// <i> Enable output buffer in SERCOM module</span><br><span style="color: hsl(120, 100%, 40%);">+// <id> usart_tx_enable</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef CONF_SERCOM_7_USART_TXEN</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_TXEN 1</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+// <o> Frame parity</span><br><span style="color: hsl(120, 100%, 40%);">+// <0x1=>Even parity</span><br><span style="color: hsl(120, 100%, 40%);">+// <i> Parity bit mode for USART frame</span><br><span style="color: hsl(120, 100%, 40%);">+// <id> usart_parity</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef CONF_SERCOM_7_USART_PARITY</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_PARITY 1</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+// <o> Character Size</span><br><span style="color: hsl(120, 100%, 40%);">+// <0x0=>8 bits</span><br><span style="color: hsl(120, 100%, 40%);">+// <0x1=>9 bits</span><br><span style="color: hsl(120, 100%, 40%);">+// <0x5=>5 bits</span><br><span style="color: hsl(120, 100%, 40%);">+// <0x6=>6 bits</span><br><span style="color: hsl(120, 100%, 40%);">+// <0x7=>7 bits</span><br><span style="color: hsl(120, 100%, 40%);">+// <i> Data character size in USART frame</span><br><span style="color: hsl(120, 100%, 40%);">+// <id> usart_character_size</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef CONF_SERCOM_7_USART_CHSIZE</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_CHSIZE 0x0</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+// <o> Stop Bit</span><br><span style="color: hsl(120, 100%, 40%);">+// <0=>One stop bit</span><br><span style="color: hsl(120, 100%, 40%);">+// <1=>Two stop bits</span><br><span style="color: hsl(120, 100%, 40%);">+// <i> Number of stop bits in USART frame</span><br><span style="color: hsl(120, 100%, 40%);">+// <id> usart_stop_bit</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef CONF_SERCOM_7_USART_SBMODE</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_SBMODE 1</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+// <o> Baud rate <1-3000000></span><br><span style="color: hsl(120, 100%, 40%);">+// <i> USART baud rate setting</span><br><span style="color: hsl(120, 100%, 40%);">+// <id> usart_baud_rate</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef CONF_SERCOM_7_USART_BAUD</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_BAUD 6720</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+// </h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+// <h> ISO7816 configuration</span><br><span style="color: hsl(120, 100%, 40%);">+// <o> ISO7816 Protocol Type</span><br><span style="color: hsl(120, 100%, 40%);">+// <0x1=> T=0</span><br><span style="color: hsl(120, 100%, 40%);">+// <0x0=> T=1</span><br><span style="color: hsl(120, 100%, 40%);">+// <i> Define ISO7816 protocol type as 0.</span><br><span style="color: hsl(120, 100%, 40%);">+// <id> usart_iso7816_type</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef CONF_SERCOM_7_USART_ISO7816_PROTOCOL_T</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_ISO7816_PROTOCOL_T 0x0</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+// <o> ISO7816 Inhibit Not Acknowledge</span><br><span style="color: hsl(120, 100%, 40%);">+// <0x0=> NACK is transmitted when a parity error is received.</span><br><span style="color: hsl(120, 100%, 40%);">+// <0x1=> NACK is not transmitted when a parity error is received.</span><br><span style="color: hsl(120, 100%, 40%);">+// <i> Define whether a NACK is transmitted when a parity error is received.</span><br><span style="color: hsl(120, 100%, 40%);">+// <id> usart_inack</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef CONF_SERCOM_7_USART_INACK</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_INACK 0x0</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+// <o> ISO7816 Disable Successive Not Acknowledge</span><br><span style="color: hsl(120, 100%, 40%);">+// <0x0=> The successive receive NACK is disable.</span><br><span style="color: hsl(120, 100%, 40%);">+// <0x1=> The successive receive NACK is enable.</span><br><span style="color: hsl(120, 100%, 40%);">+// <i> Define whether NACK will be sent on parity error reception.</span><br><span style="color: hsl(120, 100%, 40%);">+// <id> usart_dsnack</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef CONF_SERCOM_7_USART_DSNACK</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_DSNACK 0x0</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+// <o> ISO7816 Maximum Iterations<0-7></span><br><span style="color: hsl(120, 100%, 40%);">+// <i> Define the maximum number of retransmit iterations.</span><br><span style="color: hsl(120, 100%, 40%);">+// <id> usart_maxiter</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef CONF_SERCOM_7_USART_MAXITER</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_MAXITER 0x7</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+// <o> ISO7816 Guard Time</span><br><span style="color: hsl(120, 100%, 40%);">+// <0x2=> 2-bit times</span><br><span style="color: hsl(120, 100%, 40%);">+// <0x3=> 3-bit times</span><br><span style="color: hsl(120, 100%, 40%);">+// <0x4=> 4-bit times</span><br><span style="color: hsl(120, 100%, 40%);">+// <0x5=> 5-bit times</span><br><span style="color: hsl(120, 100%, 40%);">+// <0x6=> 6-bit times</span><br><span style="color: hsl(120, 100%, 40%);">+// <0x7=> 7-bit times</span><br><span style="color: hsl(120, 100%, 40%);">+// <i> Define the guard time.</span><br><span style="color: hsl(120, 100%, 40%);">+// <id> usart_gtime</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef CONF_SERCOM_7_USART_GTIME</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_GTIME 0x2</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+// <q> Inverse transmission and reception enabled</span><br><span style="color: hsl(120, 100%, 40%);">+// <i> Define inverse transmission and reception enabled.</span><br><span style="color: hsl(120, 100%, 40%);">+// <id> usart_inverse_enabled</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef CONF_SERCOM_7_USART_INVERSE_ENABLED</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_INVERSE_ENABLED 0x0</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#if (CONF_SERCOM_7_USART_INVERSE_ENABLED == 1)</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_RXINV 0x1</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_TXINV 0x1</span><br><span style="color: hsl(120, 100%, 40%);">+#else</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_RXINV 0x0</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_TXINV 0x0</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+// </h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+// <e> Advanced configuration</span><br><span style="color: hsl(120, 100%, 40%);">+// <id> usart_advanced</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef CONF_SERCOM_7_USART_ADVANCED_CONFIG</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_ADVANCED_CONFIG 0</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+// <q> Run in stand-by</span><br><span style="color: hsl(120, 100%, 40%);">+// <i> Keep the module running in standby sleep mode</span><br><span style="color: hsl(120, 100%, 40%);">+// <id> usart_arch_runstdby</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef CONF_SERCOM_7_USART_RUNSTDBY</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_RUNSTDBY 0</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+// <q> Immediate Buffer Overflow Notification</span><br><span style="color: hsl(120, 100%, 40%);">+// <i> Controls when the BUFOVF status bit is asserted</span><br><span style="color: hsl(120, 100%, 40%);">+// <id> usart_arch_ibon</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef CONF_SERCOM_7_USART_IBON</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_IBON 0</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+// <q> Start of Frame Detection Enable</span><br><span style="color: hsl(120, 100%, 40%);">+// <i> Will wake the device from any sleep mode if usart_init and usart_enable was run priort to going to sleep. (receive buffer must be enabled)</span><br><span style="color: hsl(120, 100%, 40%);">+// <id> usart_arch_sfde</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef CONF_SERCOM_7_USART_SFDE</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_SFDE 0</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+// <q> Collision Detection Enable</span><br><span style="color: hsl(120, 100%, 40%);">+// <i> Collision detection enable</span><br><span style="color: hsl(120, 100%, 40%);">+// <id> usart_arch_cloden</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef CONF_SERCOM_7_USART_CLODEN</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_CLODEN 0</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+// <o> Operating Mode</span><br><span style="color: hsl(120, 100%, 40%);">+// <0x1=>USART with internal clock</span><br><span style="color: hsl(120, 100%, 40%);">+// <i> Drive the shift register by an internal clock generated by the baud rate generator.</span><br><span style="color: hsl(120, 100%, 40%);">+// <id> usart_arch_clock_mode</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef CONF_SERCOM_7_USART_MODE</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_MODE 0x1</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+// <o> Data Order</span><br><span style="color: hsl(120, 100%, 40%);">+// <0=>MSB is transmitted first</span><br><span style="color: hsl(120, 100%, 40%);">+// <1=>LSB is transmitted first</span><br><span style="color: hsl(120, 100%, 40%);">+// <i> Data order of the data bits in the frame</span><br><span style="color: hsl(120, 100%, 40%);">+// <id> usart_arch_dord</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef CONF_SERCOM_7_USART_DORD</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_DORD 1</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+// <o> Debug Stop Mode</span><br><span style="color: hsl(120, 100%, 40%);">+// <i> Behavior of the baud-rate generator when CPU is halted by external debugger.</span><br><span style="color: hsl(120, 100%, 40%);">+// <0=>Keep running</span><br><span style="color: hsl(120, 100%, 40%);">+// <1=>Halt</span><br><span style="color: hsl(120, 100%, 40%);">+// <id> usart_arch_dbgstop</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef CONF_SERCOM_7_USART_DEBUG_STOP_MODE</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_DEBUG_STOP_MODE 0</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+// Does not do anything in USRT mode</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_SAMPR 0x0</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_SAMPA 0x0</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_FRACTIONAL 0x0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+// Does not do anything in UART mode</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_CPOL 0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+// Does not do anything in USRT mode</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_ENC 0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+// </e></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef CONF_SERCOM_7_USART_CMODE</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_CMODE CONF_SERCOM_7_USART_ISO7816_PROTOCOL_T</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* RX is on PIN_PC16 */</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef CONF_SERCOM_7_USART_RXPO</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_RXPO 0</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* TX uses the same pin with RX */</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef CONF_SERCOM_7_USART_TXPO</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_TXPO 2</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Set iso7816 mode */</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_PMODE (CONF_SERCOM_7_USART_PARITY - 1)</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_FORM 7</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#if CONF_SERCOM_7_USART_CMODE == 0</span><br><span style="color: hsl(120, 100%, 40%);">+// Calculate BAUD register value in UART mode</span><br><span style="color: hsl(120, 100%, 40%);">+#if CONF_SERCOM_7_USART_SAMPR == 0</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef CONF_SERCOM_7_USART_BAUD_RATE</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_BAUD_RATE                                                                                  \</span><br><span style="color: hsl(120, 100%, 40%);">+     65536 - ((65536 * 16.0f * CONF_SERCOM_7_USART_BAUD) / CONF_GCLK_SERCOM7_CORE_FREQUENCY)</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef CONF_SERCOM_7_USART_RECEIVE_PULSE_LENGTH</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_RECEIVE_PULSE_LENGTH 0</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+#elif CONF_SERCOM_7_USART_SAMPR == 1</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef CONF_SERCOM_7_USART_BAUD_RATE</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_BAUD_RATE                                                                                  \</span><br><span style="color: hsl(120, 100%, 40%);">+  ((CONF_GCLK_SERCOM7_CORE_FREQUENCY) / (CONF_SERCOM_7_USART_BAUD * 16)) - (CONF_SERCOM_7_USART_FRACTIONAL / 8)</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef CONF_SERCOM_7_USART_RECEIVE_PULSE_LENGTH</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_RECEIVE_PULSE_LENGTH 0</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+#elif CONF_SERCOM_7_USART_SAMPR == 2</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef CONF_SERCOM_7_USART_BAUD_RATE</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_BAUD_RATE                                                                                  \</span><br><span style="color: hsl(120, 100%, 40%);">+    65536 - ((65536 * 8.0f * CONF_SERCOM_7_USART_BAUD) / CONF_GCLK_SERCOM7_CORE_FREQUENCY)</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef CONF_SERCOM_7_USART_RECEIVE_PULSE_LENGTH</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_RECEIVE_PULSE_LENGTH 0</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+#elif CONF_SERCOM_7_USART_SAMPR == 3</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef CONF_SERCOM_7_USART_BAUD_RATE</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_BAUD_RATE                                                                                  \</span><br><span style="color: hsl(120, 100%, 40%);">+   ((CONF_GCLK_SERCOM7_CORE_FREQUENCY) / (CONF_SERCOM_7_USART_BAUD * 8)) - (CONF_SERCOM_7_USART_FRACTIONAL / 8)</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef CONF_SERCOM_7_USART_RECEIVE_PULSE_LENGTH</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_RECEIVE_PULSE_LENGTH 0</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+#elif CONF_SERCOM_7_USART_SAMPR == 4</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef CONF_SERCOM_7_USART_BAUD_RATE</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_BAUD_RATE                                                                                  \</span><br><span style="color: hsl(120, 100%, 40%);">+     65536 - ((65536 * 3.0f * CONF_SERCOM_7_USART_BAUD) / CONF_GCLK_SERCOM7_CORE_FREQUENCY)</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef CONF_SERCOM_7_USART_RECEIVE_PULSE_LENGTH</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_RECEIVE_PULSE_LENGTH 0</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#elif CONF_SERCOM_7_USART_CMODE == 1</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef CONF_SERCOM_7_USART_BAUD_RATE</span><br><span style="color: hsl(120, 100%, 40%);">+// Calculate BAUD register value in USRT mode</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_BAUD_RATE (CONF_GCLK_SERCOM7_CORE_FREQUENCY) / (2 * CONF_SERCOM_7_USART_BAUD) - 1</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef CONF_SERCOM_7_USART_RECEIVE_PULSE_LENGTH</span><br><span style="color: hsl(120, 100%, 40%);">+#define CONF_SERCOM_7_USART_RECEIVE_PULSE_LENGTH 0</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+#else</span><br><span style="color: hsl(120, 100%, 40%);">+#error CMODE value for SERCOM 7 in USART mode not known</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span> // <<< end of configuration section >>></span><br><span> </span><br><span> #endif // HPL_SERCOM_CONFIG_H</span><br><span>diff --git a/sysmoOCTSIM/cuart_driver_asf4_usart_async.c b/sysmoOCTSIM/cuart_driver_asf4_usart_async.c</span><br><span>index c7d29eb..87f5123 100644</span><br><span>--- a/sysmoOCTSIM/cuart_driver_asf4_usart_async.c</span><br><span>+++ b/sysmoOCTSIM/cuart_driver_asf4_usart_async.c</span><br><span>@@ -13,7 +13,11 @@</span><br><span> </span><br><span> #include "cuart.h"</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef ENABLE_DBG_UART7</span><br><span style="color: hsl(120, 100%, 40%);">+static struct usart_async_descriptor* SIM_peripheral_descriptors[] = {&SIM0, &SIM1, &SIM2, &SIM3, &SIM4, &SIM5, &SIM6, &SIM7};</span><br><span style="color: hsl(120, 100%, 40%);">+#else</span><br><span> static struct usart_async_descriptor* SIM_peripheral_descriptors[] = {&SIM0, &SIM1, &SIM2, &SIM3, &SIM4, &SIM5, &SIM6, NULL};</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span> </span><br><span> extern struct card_uart *cuart4slot_nr(uint8_t slot_nr);</span><br><span> </span><br><span>diff --git a/sysmoOCTSIM/driver_init.c b/sysmoOCTSIM/driver_init.c</span><br><span>index 7071ea5..1cfd8cf 100644</span><br><span>--- a/sysmoOCTSIM/driver_init.c</span><br><span>+++ b/sysmoOCTSIM/driver_init.c</span><br><span>@@ -33,7 +33,11 @@</span><br><span> #define SIM6_BUFFER_SIZE 512</span><br><span> </span><br><span> /*! The buffer size for USART */</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef ENABLE_DBG_UART7</span><br><span> #define UART_DEBUG_BUFFER_SIZE 4096</span><br><span style="color: hsl(120, 100%, 40%);">+#else</span><br><span style="color: hsl(120, 100%, 40%);">+#define SIM7_BUFFER_SIZE 512</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span> </span><br><span> struct usart_async_descriptor SIM0;</span><br><span> struct usart_async_descriptor SIM1;</span><br><span>@@ -42,6 +46,9 @@</span><br><span> struct usart_async_descriptor SIM4;</span><br><span> struct usart_async_descriptor SIM5;</span><br><span> struct usart_async_descriptor SIM6;</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef ENABLE_DBG_UART7</span><br><span style="color: hsl(120, 100%, 40%);">+struct usart_async_descriptor SIM7;</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span> </span><br><span> static uint8_t SIM0_buffer[SIM0_BUFFER_SIZE];</span><br><span> static uint8_t SIM1_buffer[SIM1_BUFFER_SIZE];</span><br><span>@@ -50,12 +57,14 @@</span><br><span> static uint8_t SIM4_buffer[SIM4_BUFFER_SIZE];</span><br><span> static uint8_t SIM5_buffer[SIM5_BUFFER_SIZE];</span><br><span> static uint8_t SIM6_buffer[SIM6_BUFFER_SIZE];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef ENABLE_DBG_UART7</span><br><span style="color: hsl(120, 100%, 40%);">+static uint8_t SIM7_buffer[SIM7_BUFFER_SIZE];</span><br><span style="color: hsl(120, 100%, 40%);">+#else</span><br><span> struct usart_async_rings_descriptor UART_debug;</span><br><span style="color: hsl(0, 100%, 40%);">-struct calendar_descriptor CALENDAR_0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static uint8_t UART_DEBUG_buffer_rx[UART_DEBUG_BUFFER_SIZE];</span><br><span> static uint8_t UART_DEBUG_buffer_tx[UART_DEBUG_BUFFER_SIZE];</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+struct calendar_descriptor CALENDAR_0;</span><br><span> </span><br><span> void CALENDAR_0_CLOCK_init(void)</span><br><span> {</span><br><span>@@ -327,6 +336,7 @@</span><br><span>        SIM6_PORT_init();</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef ENABLE_DBG_UART7</span><br><span> /**</span><br><span>  * \brief USART Clock initialization function</span><br><span>  *</span><br><span>@@ -365,7 +375,44 @@</span><br><span>     usart_async_rings_init(&UART_debug, SERCOM7, UART_DEBUG_buffer_rx, UART_DEBUG_BUFFER_SIZE, UART_DEBUG_buffer_tx, UART_DEBUG_BUFFER_SIZE, (void *)NULL);</span><br><span>  UART_debug_PORT_init();</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+#else</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief USART Clock initialization function</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Enables register interface and peripheral clock</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+void SIM7_CLOCK_init()</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   hri_gclk_write_PCHCTRL_reg(GCLK, SERCOM7_GCLK_ID_CORE, CONF_GCLK_SERCOM7_CORE_SRC | (1 << GCLK_PCHCTRL_CHEN_Pos));</span><br><span style="color: hsl(120, 100%, 40%);">+      hri_gclk_write_PCHCTRL_reg(GCLK, SERCOM7_GCLK_ID_SLOW, CONF_GCLK_SERCOM7_SLOW_SRC | (1 << GCLK_PCHCTRL_CHEN_Pos));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    hri_mclk_set_APBDMASK_SERCOM7_bit(MCLK);</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%);">+ * \brief USART pinmux initialization function</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Set each required pin to USART functionality</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+void SIM7_PORT_init()</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%);">+      gpio_set_pin_function(SIM7_IO, PINMUX_PB21D_SERCOM7_PAD0);</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%);">+ * \brief USART initialization function</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Enables USART peripheral, clocks and initializes USART driver</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+void SIM7_init(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     SIM7_CLOCK_init();</span><br><span style="color: hsl(120, 100%, 40%);">+    usart_async_init(&SIM7, SERCOM7, SIM7_buffer, SIM7_BUFFER_SIZE, (void *)NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+    SIM7_PORT_init();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span> void USB_DEVICE_INSTANCE_PORT_init(void)</span><br><span> {</span><br><span> </span><br><span>@@ -923,8 +970,11 @@</span><br><span>     SIM4_init();</span><br><span>         SIM5_init();</span><br><span>         SIM6_init();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef ENABLE_DBG_UART7</span><br><span style="color: hsl(120, 100%, 40%);">+        SIM7_init();</span><br><span style="color: hsl(120, 100%, 40%);">+#else</span><br><span>  UART_debug_init();</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span> </span><br><span>       USB_DEVICE_INSTANCE_init();</span><br><span> }</span><br><span>diff --git a/sysmoOCTSIM/driver_init.h b/sysmoOCTSIM/driver_init.h</span><br><span>index de5e441..f9d23b7 100644</span><br><span>--- a/sysmoOCTSIM/driver_init.h</span><br><span>+++ b/sysmoOCTSIM/driver_init.h</span><br><span>@@ -36,7 +36,11 @@</span><br><span> extern struct usart_async_descriptor SIM4;</span><br><span> extern struct usart_async_descriptor SIM5;</span><br><span> extern struct usart_async_descriptor SIM6;</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef ENABLE_DBG_UART7</span><br><span> extern struct usart_async_rings_descriptor UART_debug;</span><br><span style="color: hsl(120, 100%, 40%);">+#else</span><br><span style="color: hsl(120, 100%, 40%);">+extern struct usart_async_descriptor SIM7;</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span> </span><br><span> void CALENDAR_0_CLOCK_init(void);</span><br><span> void CALENDAR_0_init(void);</span><br><span>@@ -69,6 +73,10 @@</span><br><span> void SIM6_CLOCK_init(void);</span><br><span> void SIM6_init(void);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+void SIM7_PORT_init(void);</span><br><span style="color: hsl(120, 100%, 40%);">+void SIM7_CLOCK_init(void);</span><br><span style="color: hsl(120, 100%, 40%);">+void SIM7_init(void);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> void UART_debug_PORT_init(void);</span><br><span> void UART_debug_CLOCK_init(void);</span><br><span> void UART_debug_init(void);</span><br><span>diff --git a/sysmoOCTSIM/gcc/Makefile b/sysmoOCTSIM/gcc/Makefile</span><br><span>index 95a582f..7a37036 100644</span><br><span>--- a/sysmoOCTSIM/gcc/Makefile</span><br><span>+++ b/sysmoOCTSIM/gcc/Makefile</span><br><span>@@ -126,7 +126,6 @@</span><br><span>         i2c_bitbang.o \</span><br><span>      libosmo_emb.o \</span><br><span>      main.o \</span><br><span style="color: hsl(0, 100%, 40%);">-        manual_test.o \</span><br><span>      ncn8025.o \</span><br><span>  octsim_i2c.o \</span><br><span>       stdio_redirect/gcc/read.o \</span><br><span>diff --git a/sysmoOCTSIM/libosmo_emb.c b/sysmoOCTSIM/libosmo_emb.c</span><br><span>index e550b07..8f363b4 100644</span><br><span>--- a/sysmoOCTSIM/libosmo_emb.c</span><br><span>+++ b/sysmoOCTSIM/libosmo_emb.c</span><br><span>@@ -156,10 +156,11 @@</span><br><span> </span><br><span>     /* logging */</span><br><span>        log_init(&log_info, g_tall_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">-//  stderr_target = log_target_create_stderr_raw();</span><br><span style="color: hsl(0, 100%, 40%);">- //log_add_target(stderr_target);</span><br><span style="color: hsl(0, 100%, 40%);">-        //log_set_all_filter(stderr_target, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef ENABLE_DBG_UART7</span><br><span style="color: hsl(120, 100%, 40%);">+      stderr_target = log_target_create_stderr_raw();</span><br><span style="color: hsl(120, 100%, 40%);">+       log_add_target(stderr_target);</span><br><span style="color: hsl(120, 100%, 40%);">+        log_set_all_filter(stderr_target, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span>        /* timer */</span><br><span>  SysTick_Config(SystemCoreClock / 1000);</span><br><span> }</span><br><span>diff --git a/sysmoOCTSIM/main.c b/sysmoOCTSIM/main.c</span><br><span>index eb5faf1..5c06526 100644</span><br><span>--- a/sysmoOCTSIM/main.c</span><br><span>+++ b/sysmoOCTSIM/main.c</span><br><span>@@ -434,7 +434,7 @@</span><br><span> </span><br><span> //#######################</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define NUM_OUT_BUF 7</span><br><span style="color: hsl(120, 100%, 40%);">+#define NUM_OUT_BUF 16</span><br><span> </span><br><span> int main(void)</span><br><span> {</span><br><span>@@ -540,7 +540,7 @@</span><br><span>           command_try_recv();</span><br><span>          poll_card_detect();</span><br><span>          submit_next_irq();</span><br><span style="color: hsl(0, 100%, 40%);">-              for (int i = 0; i < usb_fs_descs.ccid.class.bMaxSlotIndex; i++){</span><br><span style="color: hsl(120, 100%, 40%);">+           for (int i = 0; i <= usb_fs_descs.ccid.class.bMaxSlotIndex; i++){</span><br><span>                         g_ci.slot_ops->handle_fsm_events(&g_ci.slot[i], true);</span><br><span>                }</span><br><span>            feed_ccid();</span><br><span>diff --git a/sysmoOCTSIM/manual_test.c b/sysmoOCTSIM/manual_test.c</span><br><span>deleted file mode 100644</span><br><span>index d6852bc..0000000</span><br><span>--- a/sysmoOCTSIM/manual_test.c</span><br><span>+++ /dev/null</span><br><span>@@ -1,255 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/*</span><br><span style="color: hsl(0, 100%, 40%);">- * Copyright (C) 2019 Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is free software; you can redistribute it and/or</span><br><span style="color: hsl(0, 100%, 40%);">- * modify it under the terms of the GNU General Public License</span><br><span style="color: hsl(0, 100%, 40%);">- * as published by the Free Software Foundation; either version 2</span><br><span style="color: hsl(0, 100%, 40%);">- * of the License, or (at your option) any later version.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(0, 100%, 40%);">- * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(0, 100%, 40%);">- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(0, 100%, 40%);">- * GNU General Public License for more details.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * You should have received a copy of the GNU General Public License</span><br><span style="color: hsl(0, 100%, 40%);">- * along with this program; if not, write to the Free Software</span><br><span style="color: hsl(0, 100%, 40%);">- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.</span><br><span style="color: hsl(0, 100%, 40%);">-*/</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdlib.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdio.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <parts.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include "atmel_start.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "atmel_start_pins.h"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include "i2c_bitbang.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "octsim_i2c.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "ncn8025.h"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include "command.h"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-enum testmode_test {</span><br><span style="color: hsl(0, 100%, 40%);">- TEST_USER_LED,</span><br><span style="color: hsl(0, 100%, 40%);">-  /* test the per-slot LED by blinking it shortly */</span><br><span style="color: hsl(0, 100%, 40%);">-      TEST_LED,</span><br><span style="color: hsl(0, 100%, 40%);">-       /* test the voltages of the SIMVCC */</span><br><span style="color: hsl(0, 100%, 40%);">-   TEST_VOLTAGE,</span><br><span style="color: hsl(0, 100%, 40%);">-   /* test the clock rates of the SIMCLK pin */</span><br><span style="color: hsl(0, 100%, 40%);">-    TEST_CLOCK,</span><br><span style="color: hsl(0, 100%, 40%);">-     /* test the RST line by asserting it low and then back high */</span><br><span style="color: hsl(0, 100%, 40%);">-  TEST_RST,</span><br><span style="color: hsl(0, 100%, 40%);">-       /* test the RST line by asserting it low and then back high */</span><br><span style="color: hsl(0, 100%, 40%);">-  TEST_IO,</span><br><span style="color: hsl(0, 100%, 40%);">-        _NUM_TESTS</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-static const char *test_names[_NUM_TESTS] = {</span><br><span style="color: hsl(0, 100%, 40%);">-       [TEST_USER_LED] = "USER_LED",</span><br><span style="color: hsl(0, 100%, 40%);">- [TEST_LED]      = "LED",</span><br><span style="color: hsl(0, 100%, 40%);">-      [TEST_VOLTAGE]  = "VOLTAGE",</span><br><span style="color: hsl(0, 100%, 40%);">-  [TEST_CLOCK]    = "CLOCK",</span><br><span style="color: hsl(0, 100%, 40%);">-    [TEST_RST]      = "RST",</span><br><span style="color: hsl(0, 100%, 40%);">-      [TEST_IO]       = "IO",</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct testmode_state {</span><br><span style="color: hsl(0, 100%, 40%);">-      uint8_t slot;</span><br><span style="color: hsl(0, 100%, 40%);">-   enum testmode_test test_nr;</span><br><span style="color: hsl(0, 100%, 40%);">-     int test_int;</span><br><span style="color: hsl(0, 100%, 40%);">-   struct ncn8025_settings ncn;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-static struct testmode_state g_tms;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#define BLINK_MS 500</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void set_slot(uint8_t slot)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        printf("changing slot to %u\r\n", slot);</span><br><span style="color: hsl(0, 100%, 40%);">-      g_tms.slot = slot;</span><br><span style="color: hsl(0, 100%, 40%);">-      g_tms.ncn = (struct ncn8025_settings) {</span><br><span style="color: hsl(0, 100%, 40%);">-         .rstin = false,</span><br><span style="color: hsl(0, 100%, 40%);">-         .cmdvcc = false,</span><br><span style="color: hsl(0, 100%, 40%);">-                .led = false,</span><br><span style="color: hsl(0, 100%, 40%);">-           .clkdiv = SIM_CLKDIV_8,</span><br><span style="color: hsl(0, 100%, 40%);">-         .vsel = SIM_VOLT_3V0,</span><br><span style="color: hsl(0, 100%, 40%);">-   };</span><br><span style="color: hsl(0, 100%, 40%);">-      ncn8025_set(g_tms.slot, &g_tms.ncn);</span><br><span style="color: hsl(0, 100%, 40%);">-        ncn8025_get(g_tms.slot, &g_tms.ncn);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void next_test(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   g_tms.test_nr = (g_tms.test_nr + 1) % _NUM_TESTS;</span><br><span style="color: hsl(0, 100%, 40%);">-       g_tms.test_int = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-     printf("changing test to %s\r\n", test_names[g_tms.test_nr]);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void test_user_led(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        printf("blinking User LED\r\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      gpio_set_pin_function(PIN_PC26, GPIO_PIN_FUNCTION_OFF);</span><br><span style="color: hsl(0, 100%, 40%);">- gpio_set_pin_direction(PIN_PC26, GPIO_DIRECTION_OUT);</span><br><span style="color: hsl(0, 100%, 40%);">-   gpio_set_pin_level(PIN_PC26, true);</span><br><span style="color: hsl(0, 100%, 40%);">-     delay_ms(BLINK_MS);</span><br><span style="color: hsl(0, 100%, 40%);">-     gpio_set_pin_level(PIN_PC26, false);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void test_led(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        printf("blinking Slot LED\r\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      g_tms.ncn.led = true;</span><br><span style="color: hsl(0, 100%, 40%);">-   ncn8025_set(g_tms.slot, &g_tms.ncn);</span><br><span style="color: hsl(0, 100%, 40%);">-        delay_ms(BLINK_MS);</span><br><span style="color: hsl(0, 100%, 40%);">-     g_tms.ncn.led = false;</span><br><span style="color: hsl(0, 100%, 40%);">-  ncn8025_set(g_tms.slot, &g_tms.ncn);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static enum ncn8025_sim_voltage voltage[3] = { SIM_VOLT_1V8, SIM_VOLT_3V0, SIM_VOLT_5V0 };</span><br><span style="color: hsl(0, 100%, 40%);">-static const char *voltage_name[3] = { "1.8", "3.0", "5.0" };</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void ncn_change_voltage(enum ncn8025_sim_voltage vsel)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    /* first disable the output; VSEL changes require output to be disabled */</span><br><span style="color: hsl(0, 100%, 40%);">-      g_tms.ncn.cmdvcc = false;</span><br><span style="color: hsl(0, 100%, 40%);">-       ncn8025_set(g_tms.slot, &g_tms.ncn);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* then re-enable it with the new voltage setting */</span><br><span style="color: hsl(0, 100%, 40%);">-    g_tms.ncn.vsel = vsel;</span><br><span style="color: hsl(0, 100%, 40%);">-  g_tms.ncn.cmdvcc = true;</span><br><span style="color: hsl(0, 100%, 40%);">-        ncn8025_set(g_tms.slot, &g_tms.ncn);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void test_voltage(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        printf("Testing Voltage %s\r\n", voltage_name[g_tms.test_int]);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       ncn_change_voltage(voltage[g_tms.test_int]);</span><br><span style="color: hsl(0, 100%, 40%);">-    g_tms.test_int = (g_tms.test_int+1) % 3;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 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(0, 100%, 40%);">-static const uint8_t clk_div_val[4] = { 8, 4, 2, 1 };</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void test_clock(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      printf("Testing Clock Divider %u\r\n", clk_div_val[g_tms.test_int]);</span><br><span style="color: hsl(0, 100%, 40%);">-  g_tms.ncn.cmdvcc = true;</span><br><span style="color: hsl(0, 100%, 40%);">-        g_tms.ncn.clkdiv = clk_div[g_tms.test_int];</span><br><span style="color: hsl(0, 100%, 40%);">-     ncn8025_set(g_tms.slot, &g_tms.ncn);</span><br><span style="color: hsl(0, 100%, 40%);">-        g_tms.test_int = (g_tms.test_int+1) % 4;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void test_rst(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    printf("blinking RST\r\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* well-defined voltage for LED brightness */</span><br><span style="color: hsl(0, 100%, 40%);">-   ncn_change_voltage(SIM_VOLT_3V0);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       g_tms.ncn.cmdvcc = true;</span><br><span style="color: hsl(0, 100%, 40%);">-        g_tms.ncn.rstin = true;</span><br><span style="color: hsl(0, 100%, 40%);">- ncn8025_set(g_tms.slot, &g_tms.ncn);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        delay_ms(BLINK_MS);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     g_tms.ncn.rstin = false;</span><br><span style="color: hsl(0, 100%, 40%);">-        ncn8025_set(g_tms.slot, &g_tms.ncn);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#ifndef SIM7_IO</span><br><span style="color: hsl(0, 100%, 40%);">-#define SIM7_IO PIN_PB21</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-static const enum gpio_port sim_io_gpio[] = { SIM0_IO, SIM1_IO, SIM2_IO, SIM3_IO,</span><br><span style="color: hsl(0, 100%, 40%);">-                                       SIM4_IO, SIM5_IO, SIM6_IO, SIM7_IO };</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void test_io(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   enum gpio_port gpio = sim_io_gpio[g_tms.slot];</span><br><span style="color: hsl(0, 100%, 40%);">-  printf("blinking I/O\r\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* well-defined voltage for LED brightness */</span><br><span style="color: hsl(0, 100%, 40%);">-   ncn_change_voltage(SIM_VOLT_3V0);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       gpio_set_pin_function(gpio, GPIO_PIN_FUNCTION_OFF);</span><br><span style="color: hsl(0, 100%, 40%);">-     gpio_set_pin_direction(gpio, GPIO_DIRECTION_OUT);</span><br><span style="color: hsl(0, 100%, 40%);">-       gpio_set_pin_level(gpio, false);</span><br><span style="color: hsl(0, 100%, 40%);">-        delay_ms(BLINK_MS);</span><br><span style="color: hsl(0, 100%, 40%);">-     gpio_set_pin_level(gpio, true);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* FIXME: restore tack to original function! */</span><br><span style="color: hsl(0, 100%, 40%);">- //gpio_set_pin_function(sim_io_gpio[g_tms.slot], GPIO_PIN_FUNCTION_OFF);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-typedef void (*test_fn)(void);</span><br><span style="color: hsl(0, 100%, 40%);">-static const test_fn test_functions[_NUM_TESTS] = {</span><br><span style="color: hsl(0, 100%, 40%);">-      [TEST_USER_LED] = test_user_led,</span><br><span style="color: hsl(0, 100%, 40%);">-        [TEST_LED] = test_led,</span><br><span style="color: hsl(0, 100%, 40%);">-  [TEST_VOLTAGE] = test_voltage,</span><br><span style="color: hsl(0, 100%, 40%);">-  [TEST_CLOCK] = test_clock,</span><br><span style="color: hsl(0, 100%, 40%);">-      [TEST_RST] = test_rst,</span><br><span style="color: hsl(0, 100%, 40%);">-  [TEST_IO] = test_io,</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void execute_test(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   printf("(%u) %-10s: ", g_tms.slot, test_names[g_tms.test_nr]);</span><br><span style="color: hsl(0, 100%, 40%);">-        test_functions[g_tms.test_nr]();</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int wait_for_key_and_process(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     int c;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  do {</span><br><span style="color: hsl(0, 100%, 40%);">-    } while (!usart_async_rings_is_rx_not_empty(&UART_debug));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  c = getchar();</span><br><span style="color: hsl(0, 100%, 40%);">-  if (c < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-           return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      switch (c) {</span><br><span style="color: hsl(0, 100%, 40%);">-    case '0':</span><br><span style="color: hsl(0, 100%, 40%);">-       case '1':</span><br><span style="color: hsl(0, 100%, 40%);">-       case '2':</span><br><span style="color: hsl(0, 100%, 40%);">-       case '3':</span><br><span style="color: hsl(0, 100%, 40%);">-       case '4':</span><br><span style="color: hsl(0, 100%, 40%);">-       case '5':</span><br><span style="color: hsl(0, 100%, 40%);">-       case '6':</span><br><span style="color: hsl(0, 100%, 40%);">-       case '7':</span><br><span style="color: hsl(0, 100%, 40%);">-               set_slot(c - '0');</span><br><span style="color: hsl(0, 100%, 40%);">-              execute_test();</span><br><span style="color: hsl(0, 100%, 40%);">-         break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case 'n':</span><br><span style="color: hsl(0, 100%, 40%);">-       case 'N':</span><br><span style="color: hsl(0, 100%, 40%);">-               next_test();</span><br><span style="color: hsl(0, 100%, 40%);">-            execute_test();</span><br><span style="color: hsl(0, 100%, 40%);">-         break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case 'Q':</span><br><span style="color: hsl(0, 100%, 40%);">-       case 'q':</span><br><span style="color: hsl(0, 100%, 40%);">-               printf("Leaving Test Mode\r\n");</span><br><span style="color: hsl(0, 100%, 40%);">-              return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-      case ' ':</span><br><span style="color: hsl(0, 100%, 40%);">-               execute_test();</span><br><span style="color: hsl(0, 100%, 40%);">-         break;</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-       return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN(testmode_fn, cmd_testmode,</span><br><span style="color: hsl(0, 100%, 40%);">-      "testmode", "Enter board testing mode (Use `Q` to exit)")</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 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(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      printf("SPACE will start the current test (%s)\r\n", test_names[g_tms.test_nr]);</span><br><span style="color: hsl(0, 100%, 40%);">-      while (1) {</span><br><span style="color: hsl(0, 100%, 40%);">-             if (wait_for_key_and_process() < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                  break;</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void testmode_init(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     command_register(&cmd_testmode);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span>diff --git a/sysmoOCTSIM/stdio_start.c b/sysmoOCTSIM/stdio_start.c</span><br><span>index 8a15c88..63e125d 100644</span><br><span>--- a/sysmoOCTSIM/stdio_start.c</span><br><span>+++ b/sysmoOCTSIM/stdio_start.c</span><br><span>@@ -9,6 +9,7 @@</span><br><span> #include "atmel_start.h"</span><br><span> #include "stdio_start.h"</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef ENABLE_DBG_UART7</span><br><span> static void UART_debug_rx_cb(const struct usart_async_rings_descriptor *const io_descr)</span><br><span> {</span><br><span> }</span><br><span>@@ -19,3 +20,4 @@</span><br><span>   usart_async_rings_enable(&UART_debug);</span><br><span>   stdio_io_init(&UART_debug.io);</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/16254">change 16254</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-ccid-firmware/+/16254"/><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-Change-Id: I1c18459d7e43e6fbd1022fabb52138904f2bf480 </div>
<div style="display:none"> Gerrit-Change-Number: 16254 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Hoernchen <ewild@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>