<p>Hoernchen has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/16252">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">remove old uart commands<br><br>Change-Id: I91fff5d8c296661bcef8576244079f3a5fc8800b<br>---<br>M sysmoOCTSIM/main.c<br>1 file changed, 5 insertions(+), 708 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/52/16252/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/sysmoOCTSIM/main.c b/sysmoOCTSIM/main.c</span><br><span>index af1b192..eb5faf1 100644</span><br><span>--- a/sysmoOCTSIM/main.c</span><br><span>+++ b/sysmoOCTSIM/main.c</span><br><span>@@ -45,47 +45,6 @@</span><br><span> extern struct ccid_slot_ops iso_fsm_slot_ops;</span><br><span> static struct ccid_instance g_ci;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-//// TODO put declaration in more global file</span><br><span style="color: hsl(0, 100%, 40%);">-//// TODO for now SIM7 is not present because used for debug</span><br><span style="color: hsl(0, 100%, 40%);">-//static struct usart_async_descriptor* SIM_peripheral_descriptors[] = {&SIM0, &SIM1, &SIM2, &SIM3, &SIM4, &SIM5, &SIM6, NULL};</span><br><span style="color: hsl(0, 100%, 40%);">-//</span><br><span style="color: hsl(0, 100%, 40%);">-///** number of bytes transmitted on the SIM peripheral */</span><br><span style="color: hsl(0, 100%, 40%);">-//static volatile bool SIM_tx_count[8];</span><br><span style="color: hsl(0, 100%, 40%);">-//</span><br><span style="color: hsl(0, 100%, 40%);">-//static void SIM_rx_cb(const struct usart_async_descriptor *const io_descr)</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%);">-///** called when the transmission is complete</span><br><span style="color: hsl(0, 100%, 40%);">-// *  e.g. this is when the byte has been sent and there is no data to transmit anymore</span><br><span style="color: hsl(0, 100%, 40%);">-// */</span><br><span style="color: hsl(0, 100%, 40%);">-//static void SIM_tx_cb(const struct usart_async_descriptor *const io_descr)</span><br><span style="color: hsl(0, 100%, 40%);">-//{</span><br><span style="color: hsl(0, 100%, 40%);">-//     // find slotnr for corresponding USART</span><br><span style="color: hsl(0, 100%, 40%);">-//        uint8_t slotnr;</span><br><span style="color: hsl(0, 100%, 40%);">-//       for (slotnr = 0; slotnr < ARRAY_SIZE(SIM_peripheral_descriptors) && SIM_peripheral_descriptors[slotnr] != io_descr; slotnr++);</span><br><span style="color: hsl(0, 100%, 40%);">-//</span><br><span style="color: hsl(0, 100%, 40%);">-//   // set flag</span><br><span style="color: hsl(0, 100%, 40%);">-//   if (slotnr < ARRAY_SIZE(SIM_peripheral_descriptors)) {</span><br><span style="color: hsl(0, 100%, 40%);">-//             SIM_tx_count[slotnr] = true;</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%);">-///** possible clock sources for the SERCOM peripheral</span><br><span style="color: hsl(0, 100%, 40%);">-// *  warning: the definition must match the GCLK configuration</span><br><span style="color: hsl(0, 100%, 40%);">-// */</span><br><span style="color: hsl(0, 100%, 40%);">-//static const uint8_t sercom_glck_sources[] = {GCLK_PCHCTRL_GEN_GCLK2_Val, GCLK_PCHCTRL_GEN_GCLK4_Val, GCLK_PCHCTRL_GEN_GCLK6_Val};</span><br><span style="color: hsl(0, 100%, 40%);">-//</span><br><span style="color: hsl(0, 100%, 40%);">-///** possible clock frequencies in MHz for the SERCOM peripheral</span><br><span style="color: hsl(0, 100%, 40%);">-// *  warning: the definition must match the GCLK configuration</span><br><span style="color: hsl(0, 100%, 40%);">-// */</span><br><span style="color: hsl(0, 100%, 40%);">-//static const double sercom_glck_freqs[] = {100E6 / CONF_GCLK_GEN_2_DIV, 100E6 / CONF_GCLK_GEN_4_DIV, 120E6 / CONF_GCLK_GEN_6_DIV};</span><br><span style="color: hsl(0, 100%, 40%);">-//</span><br><span style="color: hsl(0, 100%, 40%);">-///** the GCLK ID for the SERCOM SIM peripherals</span><br><span style="color: hsl(0, 100%, 40%);">-// *  @note: used as index for PCHCTRL</span><br><span style="color: hsl(0, 100%, 40%);">-// */</span><br><span style="color: hsl(0, 100%, 40%);">-//static const uint8_t SIM_peripheral_GCLK_ID[] = {SERCOM0_GCLK_ID_CORE, SERCOM1_GCLK_ID_CORE, SERCOM2_GCLK_ID_CORE, SERCOM3_GCLK_ID_CORE, SERCOM4_GCLK_ID_CORE, SERCOM5_GCLK_ID_CORE, SERCOM6_GCLK_ID_CORE, SERCOM7_GCLK_ID_CORE};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static void ccid_app_init(void);</span><br><span> </span><br><span> static void board_init()</span><br><span>@@ -106,16 +65,6 @@</span><br><span>       * (there are 8 inputs + traces to drive!) */</span><br><span>        hri_port_set_PINCFG_DRVSTR_bit(PORT, 0, 11);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-//      // enable SIM interfaces</span><br><span style="color: hsl(0, 100%, 40%);">-//      for (uint8_t i = 0; i < ARRAY_SIZE(SIM_peripheral_descriptors); i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-//             if (NULL == SIM_peripheral_descriptors[i]) {</span><br><span style="color: hsl(0, 100%, 40%);">-//                  continue;</span><br><span style="color: hsl(0, 100%, 40%);">-//             }</span><br><span style="color: hsl(0, 100%, 40%);">-//             usart_async_register_callback(SIM_peripheral_descriptors[i], USART_ASYNC_RXC_CB, SIM_rx_cb); // required for RX to work, even if the callback does nothing</span><br><span style="color: hsl(0, 100%, 40%);">-//            usart_async_register_callback(SIM_peripheral_descriptors[i], USART_ASYNC_TXC_CB, SIM_tx_cb); // to count the number of bytes transmitted since we are using it asynchronously</span><br><span style="color: hsl(0, 100%, 40%);">-//         usart_async_enable(SIM_peripheral_descriptors[i]);</span><br><span style="color: hsl(0, 100%, 40%);">-//    }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>    ccid_app_init();</span><br><span> }</span><br><span> </span><br><span>@@ -373,629 +322,6 @@</span><br><span>  * Command Line interface</span><br><span>  ***********************************************************************/</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int validate_slotnr(int argc, char **argv, int idx)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      int slotnr;</span><br><span style="color: hsl(0, 100%, 40%);">-     if (argc < idx+1) {</span><br><span style="color: hsl(0, 100%, 40%);">-          printf("You have to specify the slot number (0..7)\r\n");</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%);">-       slotnr = atoi(argv[idx]);</span><br><span style="color: hsl(0, 100%, 40%);">-       if (slotnr < 0 || slotnr > 7) {</span><br><span style="color: hsl(0, 100%, 40%);">-           printf("You have to specify the slot number (0..7)\r\n");</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%);">-       return slotnr;</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%);">-///** change baud rate of card slot</span><br><span style="color: hsl(0, 100%, 40%);">-// *  @param[in] slotnr slot number for which the baud rate should be set</span><br><span style="color: hsl(0, 100%, 40%);">-// *  @param[in] baudrate baud rate in bps to set</span><br><span style="color: hsl(0, 100%, 40%);">-// *  @return if the baud rate has been set, else a parameter is out of range</span><br><span style="color: hsl(0, 100%, 40%);">-// */</span><br><span style="color: hsl(0, 100%, 40%);">-//static bool slot_set_baudrate(uint8_t slotnr, uint32_t baudrate)</span><br><span style="color: hsl(0, 100%, 40%);">-//{</span><br><span style="color: hsl(0, 100%, 40%);">-// ASSERT(slotnr < ARRAY_SIZE(SIM_peripheral_descriptors));</span><br><span style="color: hsl(0, 100%, 40%);">-//</span><br><span style="color: hsl(0, 100%, 40%);">-// // calculate the error corresponding to the clock sources</span><br><span style="color: hsl(0, 100%, 40%);">-//     uint16_t bauds[ARRAY_SIZE(sercom_glck_freqs)];</span><br><span style="color: hsl(0, 100%, 40%);">-//        double errors[ARRAY_SIZE(sercom_glck_freqs)];</span><br><span style="color: hsl(0, 100%, 40%);">-// for (uint8_t i = 0; i < ARRAY_SIZE(sercom_glck_freqs); i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-//              double freq = sercom_glck_freqs[i]; // remember possible SERCOM frequency</span><br><span style="color: hsl(0, 100%, 40%);">-//             uint32_t min = freq / (2 * (255 + 1)); // calculate the minimum baud rate for this frequency</span><br><span style="color: hsl(0, 100%, 40%);">-//          uint32_t max = freq / (2 * (0 + 1)); // calculate the maximum baud rate for this frequency</span><br><span style="color: hsl(0, 100%, 40%);">-//            if (baudrate < min || baudrate > max) { // baud rate it out of supported range</span><br><span style="color: hsl(0, 100%, 40%);">-//                  errors[i] = NAN;</span><br><span style="color: hsl(0, 100%, 40%);">-//              } else {</span><br><span style="color: hsl(0, 100%, 40%);">-//                      uint16_t baud = round(freq / (2 * baudrate) - 1);</span><br><span style="color: hsl(0, 100%, 40%);">-//                     bauds[i] = baud;</span><br><span style="color: hsl(0, 100%, 40%);">-//                      double actual = freq / (2 * (baud + 1));</span><br><span style="color: hsl(0, 100%, 40%);">-//                      errors[i] = fabs(1.0 - (actual / baudrate));</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%);">-//   // find the smallest error</span><br><span style="color: hsl(0, 100%, 40%);">-//    uint8_t best = ARRAY_SIZE(sercom_glck_freqs);</span><br><span style="color: hsl(0, 100%, 40%);">-// for (uint8_t i = 0; i < ARRAY_SIZE(sercom_glck_freqs); i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-//              if (isnan(errors[i])) {</span><br><span style="color: hsl(0, 100%, 40%);">-//                       continue;</span><br><span style="color: hsl(0, 100%, 40%);">-//             }</span><br><span style="color: hsl(0, 100%, 40%);">-//             if (best >= ARRAY_SIZE(sercom_glck_freqs)) {</span><br><span style="color: hsl(0, 100%, 40%);">-//                       best = i;</span><br><span style="color: hsl(0, 100%, 40%);">-//             } else if (errors[i] < errors[best]) {</span><br><span style="color: hsl(0, 100%, 40%);">-//                     best = i;</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%);">-//     if (best >= ARRAY_SIZE(sercom_glck_freqs)) { // found no clock supporting this baud rate</span><br><span style="color: hsl(0, 100%, 40%);">-//           return 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%);">-//   // set clock and baud rate</span><br><span style="color: hsl(0, 100%, 40%);">-//    struct usart_async_descriptor* slot = SIM_peripheral_descriptors[slotnr]; // get slot</span><br><span style="color: hsl(0, 100%, 40%);">-// if (NULL == slot) {</span><br><span style="color: hsl(0, 100%, 40%);">-//           return false;</span><br><span style="color: hsl(0, 100%, 40%);">-// }</span><br><span style="color: hsl(0, 100%, 40%);">-//     printf("(%u) switching SERCOM clock to GCLK%u (freq = %lu kHz) and baud rate to %lu bps (baud = %u)\r\n", slotnr, (best + 1) * 2, (uint32_t)(round(sercom_glck_freqs[best] / 1000)), baudrate, bauds[best]);</span><br><span style="color: hsl(0, 100%, 40%);">-//        while (!usart_async_is_tx_empty(slot)); // wait for transmission to complete (WARNING no timeout)</span><br><span style="color: hsl(0, 100%, 40%);">-//     usart_async_disable(slot); // disable SERCOM peripheral</span><br><span style="color: hsl(0, 100%, 40%);">-//       hri_gclk_clear_PCHCTRL_reg(GCLK, SIM_peripheral_GCLK_ID[slotnr], (1 << GCLK_PCHCTRL_CHEN_Pos)); // disable clock for this peripheral</span><br><span style="color: hsl(0, 100%, 40%);">-//    while (hri_gclk_get_PCHCTRL_reg(GCLK, SIM_peripheral_GCLK_ID[slotnr], (1 << GCLK_PCHCTRL_CHEN_Pos))); // wait until clock is really disabled</span><br><span style="color: hsl(0, 100%, 40%);">-//    // it does not seem we need to completely disable the peripheral using hri_mclk_clear_APBDMASK_SERCOMn_bit</span><br><span style="color: hsl(0, 100%, 40%);">-//    hri_gclk_write_PCHCTRL_reg(GCLK, SIM_peripheral_GCLK_ID[slotnr], sercom_glck_sources[best] | (1 << GCLK_PCHCTRL_CHEN_Pos)); // set peripheral core clock and re-enable it</span><br><span style="color: hsl(0, 100%, 40%);">-//       usart_async_set_baud_rate(slot, bauds[best]); // set the new baud rate</span><br><span style="color: hsl(0, 100%, 40%);">-//        usart_async_enable(slot); // re-enable SERCOM peripheral</span><br><span style="color: hsl(0, 100%, 40%);">-//</span><br><span style="color: hsl(0, 100%, 40%);">-//    return true;</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%);">-///** change ISO baud rate of card slot</span><br><span style="color: hsl(0, 100%, 40%);">-// *  @param[in] slotnr slot number for which the baud rate should be set</span><br><span style="color: hsl(0, 100%, 40%);">-// *  @param[in] clkdiv can clock divider</span><br><span style="color: hsl(0, 100%, 40%);">-// *  @param[in] f clock rate conversion integer F</span><br><span style="color: hsl(0, 100%, 40%);">-// *  @param[in] d baud rate adjustment factor D</span><br><span style="color: hsl(0, 100%, 40%);">-// *  @return if the baud rate has been set, else a parameter is out of range</span><br><span style="color: hsl(0, 100%, 40%);">-// */</span><br><span style="color: hsl(0, 100%, 40%);">-//static bool slot_set_isorate(uint8_t slotnr, enum ncn8025_sim_clkdiv clkdiv, uint16_t f, uint8_t d)</span><br><span style="color: hsl(0, 100%, 40%);">-//{</span><br><span style="color: hsl(0, 100%, 40%);">-//        // input checks</span><br><span style="color: hsl(0, 100%, 40%);">-//       ASSERT(slotnr < ARRAY_SIZE(SIM_peripheral_descriptors));</span><br><span style="color: hsl(0, 100%, 40%);">-//   if (clkdiv != SIM_CLKDIV_1 && clkdiv != SIM_CLKDIV_2 && clkdiv != SIM_CLKDIV_4 && clkdiv != SIM_CLKDIV_8) {</span><br><span style="color: hsl(0, 100%, 40%);">-//           return false;</span><br><span style="color: hsl(0, 100%, 40%);">-// }</span><br><span style="color: hsl(0, 100%, 40%);">-//     if (!iso7816_3_valid_f(f)) {</span><br><span style="color: hsl(0, 100%, 40%);">-//          return false;</span><br><span style="color: hsl(0, 100%, 40%);">-// }</span><br><span style="color: hsl(0, 100%, 40%);">-//     if (!iso7816_3_valid_d(d)) {</span><br><span style="color: hsl(0, 100%, 40%);">-//          return 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%);">-//   // set clockdiv</span><br><span style="color: hsl(0, 100%, 40%);">-//       struct ncn8025_settings settings;</span><br><span style="color: hsl(0, 100%, 40%);">-//     ncn8025_get(slotnr, &settings);</span><br><span style="color: hsl(0, 100%, 40%);">-//   if (settings.clkdiv != clkdiv) {</span><br><span style="color: hsl(0, 100%, 40%);">-//              settings.clkdiv = clkdiv;</span><br><span style="color: hsl(0, 100%, 40%);">-//             ncn8025_set(slotnr, &settings);</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%);">-//   // calculate desired frequency</span><br><span style="color: hsl(0, 100%, 40%);">-//        uint32_t freq = 20000000UL; // maximum frequency</span><br><span style="color: hsl(0, 100%, 40%);">-//      switch (clkdiv) {</span><br><span style="color: hsl(0, 100%, 40%);">-//     case SIM_CLKDIV_1:</span><br><span style="color: hsl(0, 100%, 40%);">-//            freq /= 1;</span><br><span style="color: hsl(0, 100%, 40%);">-//            break;</span><br><span style="color: hsl(0, 100%, 40%);">-//        case SIM_CLKDIV_2:</span><br><span style="color: hsl(0, 100%, 40%);">-//            freq /= 2;</span><br><span style="color: hsl(0, 100%, 40%);">-//            break;</span><br><span style="color: hsl(0, 100%, 40%);">-//        case SIM_CLKDIV_4:</span><br><span style="color: hsl(0, 100%, 40%);">-//            freq /= 4;</span><br><span style="color: hsl(0, 100%, 40%);">-//            break;</span><br><span style="color: hsl(0, 100%, 40%);">-//        case SIM_CLKDIV_8:</span><br><span style="color: hsl(0, 100%, 40%);">-//            freq /= 8;</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%);">-//   // set baud rate</span><br><span style="color: hsl(0, 100%, 40%);">-//      uint32_t baudrate = (freq * d) / f; // calculate actual baud rate</span><br><span style="color: hsl(0, 100%, 40%);">-//     return slot_set_baudrate(slotnr, baudrate); // set baud rate</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%);">-///** write data to card</span><br><span style="color: hsl(0, 100%, 40%);">-// *  @param[in] slotnr slot number on which to send data</span><br><span style="color: hsl(0, 100%, 40%);">-// *  @param[in] data data to be transmitted</span><br><span style="color: hsl(0, 100%, 40%);">-// *  @param[in] length length of data to be transmitted</span><br><span style="color: hsl(0, 100%, 40%);">-// *  @return error code</span><br><span style="color: hsl(0, 100%, 40%);">-// */</span><br><span style="color: hsl(0, 100%, 40%);">-//static int slot_card_write(uint8_t slotnr, const uint8_t* data, uint16_t length)</span><br><span style="color: hsl(0, 100%, 40%);">-//{</span><br><span style="color: hsl(0, 100%, 40%);">-//      // input checks</span><br><span style="color: hsl(0, 100%, 40%);">-//       ASSERT(slotnr < ARRAY_SIZE(SIM_peripheral_descriptors));</span><br><span style="color: hsl(0, 100%, 40%);">-//   if (0 == length || NULL == data) {</span><br><span style="color: hsl(0, 100%, 40%);">-//            return ERR_INVALID_ARG;</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 usart_async_descriptor* sim = SIM_peripheral_descriptors[slotnr];</span><br><span style="color: hsl(0, 100%, 40%);">-//      ((Sercom *)sim->device.hw)->USART.CTRLB.bit.RXEN = 0; // disable receive (to avoid the echo back)</span><br><span style="color: hsl(0, 100%, 40%);">-//       SIM_tx_count[slotnr] = false; // reset TX complete</span><br><span style="color: hsl(0, 100%, 40%);">-//    for (uint16_t i = 0; i < length; i++) { // transmit data</span><br><span style="color: hsl(0, 100%, 40%);">-//           while(!usart_async_is_tx_empty(sim)); // wait for previous byte to be transmitted (WARNING blocking)</span><br><span style="color: hsl(0, 100%, 40%);">-//          if (1 != io_write(&sim->io, &data[i], 1)) { // put but in transmit buffer</span><br><span style="color: hsl(0, 100%, 40%);">-//                  return ERR_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%);">-//     while (!SIM_tx_count[slotnr]); // wait until transmission is complete (WARNING blocking)</span><br><span style="color: hsl(0, 100%, 40%);">-//      ((Sercom *)sim->device.hw)->USART.CTRLB.bit.RXEN = 1; // enable receive again</span><br><span style="color: hsl(0, 100%, 40%);">-//</span><br><span style="color: hsl(0, 100%, 40%);">-// return ERR_NONE;</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%);">-///** read data from card</span><br><span style="color: hsl(0, 100%, 40%);">-// *  @param[in] slotnr slot number on which to send data</span><br><span style="color: hsl(0, 100%, 40%);">-// *  @param[out] data buffer for read data to be stored</span><br><span style="color: hsl(0, 100%, 40%);">-// *  @param[in] length length of data to be read</span><br><span style="color: hsl(0, 100%, 40%);">-// *  @param[in] wt Waiting Time in ETU</span><br><span style="color: hsl(0, 100%, 40%);">-// *  @return error code</span><br><span style="color: hsl(0, 100%, 40%);">-// *  TODO fix WT/ETU duration</span><br><span style="color: hsl(0, 100%, 40%);">-// */</span><br><span style="color: hsl(0, 100%, 40%);">-//static int slot_card_read(uint8_t slotnr, uint8_t* data, uint16_t length, uint32_t wt)</span><br><span style="color: hsl(0, 100%, 40%);">-//{</span><br><span style="color: hsl(0, 100%, 40%);">-// // input checks</span><br><span style="color: hsl(0, 100%, 40%);">-//       ASSERT(slotnr < ARRAY_SIZE(SIM_peripheral_descriptors));</span><br><span style="color: hsl(0, 100%, 40%);">-//   if (0 == length || NULL == data) {</span><br><span style="color: hsl(0, 100%, 40%);">-//            return ERR_INVALID_ARG;</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 usart_async_descriptor* sim = SIM_peripheral_descriptors[slotnr];</span><br><span style="color: hsl(0, 100%, 40%);">-//</span><br><span style="color: hsl(0, 100%, 40%);">-//    ((Sercom *)sim->device.hw)->USART.CTRLB.bit.RXEN = 1; // ensure RX is enabled</span><br><span style="color: hsl(0, 100%, 40%);">-//   uint32_t timeout = wt; // reset waiting time</span><br><span style="color: hsl(0, 100%, 40%);">-//  for (uint16_t i = 0; i < length; i++) { // read all data</span><br><span style="color: hsl(0, 100%, 40%);">-//           while (timeout && !usart_async_is_rx_not_empty(sim)) { // verify if data is present</span><br><span style="color: hsl(0, 100%, 40%);">-//                   delay_us(149); // wait for 1 ETU (372 / 1 / 2.5 MHz = 148.8 us)</span><br><span style="color: hsl(0, 100%, 40%);">-//                       timeout--;</span><br><span style="color: hsl(0, 100%, 40%);">-//            }</span><br><span style="color: hsl(0, 100%, 40%);">-//             if (0 == timeout) { // timeout reached</span><br><span style="color: hsl(0, 100%, 40%);">-//                        return ERR_TIMEOUT;</span><br><span style="color: hsl(0, 100%, 40%);">-//           }</span><br><span style="color: hsl(0, 100%, 40%);">-//             timeout = wt; // reset waiting time</span><br><span style="color: hsl(0, 100%, 40%);">-//           if (1 != io_read(&sim->io, &data[i], 1)) { // read one byte</span><br><span style="color: hsl(0, 100%, 40%);">-//                        return ERR_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%);">-//</span><br><span style="color: hsl(0, 100%, 40%);">-//   return ERR_NONE;</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%);">-///** transfer TPDU</span><br><span style="color: hsl(0, 100%, 40%);">-// *  @param[in] slotnr slot number on which to transfer the TPDU</span><br><span style="color: hsl(0, 100%, 40%);">-// *  @param[in] header TPDU header to send</span><br><span style="color: hsl(0, 100%, 40%);">-// *  @param[io] data TPDU data to transfer</span><br><span style="color: hsl(0, 100%, 40%);">-// *  @param[in] data_length length of TPDU data to transfer</span><br><span style="color: hsl(0, 100%, 40%);">-// *  @param[in] write if the data should be written (true) or read (false)</span><br><span style="color: hsl(0, 100%, 40%);">-// * TODO fix WT</span><br><span style="color: hsl(0, 100%, 40%);">-// * TODO the data length can be deduce from the header</span><br><span style="color: hsl(0, 100%, 40%);">-// */</span><br><span style="color: hsl(0, 100%, 40%);">-//static int slot_tpdu_xfer(uint8_t slotnr, const uint8_t* header, uint8_t* data, uint16_t data_length, bool write)</span><br><span style="color: hsl(0, 100%, 40%);">-//{</span><br><span style="color: hsl(0, 100%, 40%);">-//      // input checks</span><br><span style="color: hsl(0, 100%, 40%);">-//       ASSERT(slotnr < ARRAY_SIZE(SIM_peripheral_descriptors));</span><br><span style="color: hsl(0, 100%, 40%);">-//   if (NULL == header || (data_length > 0 && NULL == data)) {</span><br><span style="color: hsl(0, 100%, 40%);">-//         return ERR_INVALID_ARG;</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%);">-//   int rc;</span><br><span style="color: hsl(0, 100%, 40%);">-//       struct usart_async_descriptor* sim = SIM_peripheral_descriptors[slotnr]; // get USART peripheral</span><br><span style="color: hsl(0, 100%, 40%);">-//      usart_async_flush_rx_buffer(sim); // flush RX buffer to start from scratch</span><br><span style="color: hsl(0, 100%, 40%);">-//</span><br><span style="color: hsl(0, 100%, 40%);">-//  // send command header</span><br><span style="color: hsl(0, 100%, 40%);">-//        printf("(%d) TPDU: ", slotnr);</span><br><span style="color: hsl(0, 100%, 40%);">-//      for (uint8_t i = 0; i < 5; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-//          printf("%02x ", header[i]);</span><br><span style="color: hsl(0, 100%, 40%);">-// }</span><br><span style="color: hsl(0, 100%, 40%);">-//     rc = slot_card_write(slotnr, header, 5); // transmit header</span><br><span style="color: hsl(0, 100%, 40%);">-//   if (ERR_NONE != rc) {</span><br><span style="color: hsl(0, 100%, 40%);">-//         printf("error in command header transmit (errno = %d)\r\n", rc);</span><br><span style="color: hsl(0, 100%, 40%);">-//            return rc;</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%);">-//   // read procedure byte, and handle data</span><br><span style="color: hsl(0, 100%, 40%);">-//       uint8_t pb = 0x60; // wait more procedure byte</span><br><span style="color: hsl(0, 100%, 40%);">-//        uint16_t data_i = 0; // progress in the data transfer</span><br><span style="color: hsl(0, 100%, 40%);">-// while (0x60 == pb) { // wait for SW</span><br><span style="color: hsl(0, 100%, 40%);">-//           rc = slot_card_read(slotnr, &pb, 1, ISO7816_3_DEFAULT_WT);</span><br><span style="color: hsl(0, 100%, 40%);">-//                if (ERR_NONE != rc) {</span><br><span style="color: hsl(0, 100%, 40%);">-//                 printf("error while receiving PB/SW1 (errno = %d)\r\n", rc);</span><br><span style="color: hsl(0, 100%, 40%);">-//                        return rc;</span><br><span style="color: hsl(0, 100%, 40%);">-//            }</span><br><span style="color: hsl(0, 100%, 40%);">-//             printf("%02x ", pb);</span><br><span style="color: hsl(0, 100%, 40%);">-//                if (0x60 == pb) { // NULL byte</span><br><span style="color: hsl(0, 100%, 40%);">-//                        // just wait more time</span><br><span style="color: hsl(0, 100%, 40%);">-//                } else if ((0x60 == (pb & 0xf0)) || (0x90 == (pb & 0xf0))) { // SW1 byte</span><br><span style="color: hsl(0, 100%, 40%);">-//                      // left the rest of the code handle it</span><br><span style="color: hsl(0, 100%, 40%);">-//                } else if (header[1] == pb) { // ACK byte</span><br><span style="color: hsl(0, 100%, 40%);">-//                     // transfer rest of the data</span><br><span style="color: hsl(0, 100%, 40%);">-//                  if (data_i >= data_length) {</span><br><span style="color: hsl(0, 100%, 40%);">-//                               printf("error no more data to transfer\r\n");</span><br><span style="color: hsl(0, 100%, 40%);">-//                               return ERR_INVALID_DATA;</span><br><span style="color: hsl(0, 100%, 40%);">-//                      }</span><br><span style="color: hsl(0, 100%, 40%);">-//                     if (write) { // transmit remaining command data</span><br><span style="color: hsl(0, 100%, 40%);">-//                               rc = slot_card_write(slotnr, &data[data_i], data_length - data_i); // transmit command data</span><br><span style="color: hsl(0, 100%, 40%);">-//                               if (ERR_NONE != rc) {</span><br><span style="color: hsl(0, 100%, 40%);">-//                                 printf("error in command data transmit (errno = %d)\r\n", rc);</span><br><span style="color: hsl(0, 100%, 40%);">-//                                      return rc;</span><br><span style="color: hsl(0, 100%, 40%);">-//                            }</span><br><span style="color: hsl(0, 100%, 40%);">-//                     } else { // receive remaining command data</span><br><span style="color: hsl(0, 100%, 40%);">-//                            rc = slot_card_read(slotnr, &data[data_i], data_length - data_i, ISO7816_3_DEFAULT_WT);</span><br><span style="color: hsl(0, 100%, 40%);">-//                           if (ERR_NONE != rc) {</span><br><span style="color: hsl(0, 100%, 40%);">-//                                 printf("error in command data receive (errno = %d)\r\n", rc);</span><br><span style="color: hsl(0, 100%, 40%);">-//                                       return rc;</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%);">-//                     for (uint16_t i = data_i; i < data_length; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-//                          printf("%02x ", data[i]);</span><br><span style="color: hsl(0, 100%, 40%);">-//                   }</span><br><span style="color: hsl(0, 100%, 40%);">-//                     data_i = data_length; // remember we transferred the data</span><br><span style="color: hsl(0, 100%, 40%);">-//                     pb = 0x60; // wait for SW1</span><br><span style="color: hsl(0, 100%, 40%);">-//            } else if (header[1] == (pb ^ 0xff)) { // ACK byte</span><br><span style="color: hsl(0, 100%, 40%);">-//                    // transfer only one byte</span><br><span style="color: hsl(0, 100%, 40%);">-//                     if (data_i >= data_length) {</span><br><span style="color: hsl(0, 100%, 40%);">-//                               printf("error no more data to transfer\r\n");</span><br><span style="color: hsl(0, 100%, 40%);">-//                               return ERR_INVALID_DATA;</span><br><span style="color: hsl(0, 100%, 40%);">-//                      }</span><br><span style="color: hsl(0, 100%, 40%);">-//                     if (write) { // transmit command data byte</span><br><span style="color: hsl(0, 100%, 40%);">-//                            rc = slot_card_write(slotnr, &data[data_i], 1); // transmit command data</span><br><span style="color: hsl(0, 100%, 40%);">-//                          if (ERR_NONE != rc) {</span><br><span style="color: hsl(0, 100%, 40%);">-//                                 printf("error in command data transmit (errno = %d)\r\n", rc);</span><br><span style="color: hsl(0, 100%, 40%);">-//                                      return rc;</span><br><span style="color: hsl(0, 100%, 40%);">-//                            }</span><br><span style="color: hsl(0, 100%, 40%);">-//                     } else { // receive command data byte</span><br><span style="color: hsl(0, 100%, 40%);">-//                         rc = slot_card_read(slotnr, &data[data_i], 1, ISO7816_3_DEFAULT_WT);</span><br><span style="color: hsl(0, 100%, 40%);">-//                              if (ERR_NONE != rc) {</span><br><span style="color: hsl(0, 100%, 40%);">-//                                 printf("error in command data receive (errno = %d)\r\n", rc);</span><br><span style="color: hsl(0, 100%, 40%);">-//                                       return rc;</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%);">-//                     printf("%02x ", data[data_i]);</span><br><span style="color: hsl(0, 100%, 40%);">-//                      data_i += 1; // remember we transferred one data byte</span><br><span style="color: hsl(0, 100%, 40%);">-//                 pb = 0x60; // wait for SW1</span><br><span style="color: hsl(0, 100%, 40%);">-//            } else { // invalid byte</span><br><span style="color: hsl(0, 100%, 40%);">-//                      return ERR_INVALID_DATA;</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%);">-//   // read SW2</span><br><span style="color: hsl(0, 100%, 40%);">-//   uint8_t sw2;</span><br><span style="color: hsl(0, 100%, 40%);">-//  rc = slot_card_read(slotnr, &sw2, 1, ISO7816_3_DEFAULT_WT);</span><br><span style="color: hsl(0, 100%, 40%);">-//       if (ERR_NONE != rc) {</span><br><span style="color: hsl(0, 100%, 40%);">-//         printf("error in receiving SW2 (errno = %d)\r\n", rc);</span><br><span style="color: hsl(0, 100%, 40%);">-//              return rc;</span><br><span style="color: hsl(0, 100%, 40%);">-//    }</span><br><span style="color: hsl(0, 100%, 40%);">-//     printf("%02x", sw2);</span><br><span style="color: hsl(0, 100%, 40%);">-//</span><br><span style="color: hsl(0, 100%, 40%);">-//      printf("\r\n");</span><br><span style="color: hsl(0, 100%, 40%);">-//     return ERR_NONE;</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(sim_status, cmd_sim_status, "sim-status", "Get state of specified NCN8025")</span><br><span style="color: hsl(0, 100%, 40%);">-//{</span><br><span style="color: hsl(0, 100%, 40%);">-//       struct ncn8025_settings settings;</span><br><span style="color: hsl(0, 100%, 40%);">-//     int slotnr = validate_slotnr(argc, argv, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-//  if (slotnr < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-//            return;</span><br><span style="color: hsl(0, 100%, 40%);">-//       ncn8025_get(slotnr, &settings);</span><br><span style="color: hsl(0, 100%, 40%);">-//   printf("SIM%d: ", slotnr);</span><br><span style="color: hsl(0, 100%, 40%);">-//  ncn8025_dump(&settings);</span><br><span style="color: hsl(0, 100%, 40%);">-//  printf("\r\n");</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(sim_power, cmd_sim_power, "sim-power", "Enable/disable SIM card power")</span><br><span style="color: hsl(0, 100%, 40%);">-//{</span><br><span style="color: hsl(0, 100%, 40%);">-//  struct ncn8025_settings settings;</span><br><span style="color: hsl(0, 100%, 40%);">-//     int slotnr = validate_slotnr(argc, argv, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-//  int enable;</span><br><span style="color: hsl(0, 100%, 40%);">-//</span><br><span style="color: hsl(0, 100%, 40%);">-// if (slotnr < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-//            return;</span><br><span style="color: hsl(0, 100%, 40%);">-//</span><br><span style="color: hsl(0, 100%, 40%);">-//     if (argc < 3) {</span><br><span style="color: hsl(0, 100%, 40%);">-//            printf("You have to specify 0=disable or 1=enable\r\n");</span><br><span style="color: hsl(0, 100%, 40%);">-//            return;</span><br><span style="color: hsl(0, 100%, 40%);">-//       }</span><br><span style="color: hsl(0, 100%, 40%);">-//     enable = atoi(argv[2]);</span><br><span style="color: hsl(0, 100%, 40%);">-//       ncn8025_get(slotnr, &settings);</span><br><span style="color: hsl(0, 100%, 40%);">-//   if (enable)</span><br><span style="color: hsl(0, 100%, 40%);">-//           settings.cmdvcc = true;</span><br><span style="color: hsl(0, 100%, 40%);">-//       else</span><br><span style="color: hsl(0, 100%, 40%);">-//          settings.cmdvcc = false;</span><br><span style="color: hsl(0, 100%, 40%);">-//      ncn8025_set(slotnr, &settings);</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(sim_reset, cmd_sim_reset, "sim-reset", "Enable/disable SIM reset")</span><br><span style="color: hsl(0, 100%, 40%);">-//{</span><br><span style="color: hsl(0, 100%, 40%);">-//     struct ncn8025_settings settings;</span><br><span style="color: hsl(0, 100%, 40%);">-//     int slotnr = validate_slotnr(argc, argv, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-//  int enable;</span><br><span style="color: hsl(0, 100%, 40%);">-//</span><br><span style="color: hsl(0, 100%, 40%);">-// if (slotnr < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-//            return;</span><br><span style="color: hsl(0, 100%, 40%);">-//</span><br><span style="color: hsl(0, 100%, 40%);">-//     if (argc < 3) {</span><br><span style="color: hsl(0, 100%, 40%);">-//            printf("You have to specify 0=disable or 1=enable\r\n");</span><br><span style="color: hsl(0, 100%, 40%);">-//            return;</span><br><span style="color: hsl(0, 100%, 40%);">-//       }</span><br><span style="color: hsl(0, 100%, 40%);">-//     enable = atoi(argv[2]);</span><br><span style="color: hsl(0, 100%, 40%);">-//       ncn8025_get(slotnr, &settings);</span><br><span style="color: hsl(0, 100%, 40%);">-//   if (enable)</span><br><span style="color: hsl(0, 100%, 40%);">-//           settings.rstin = true;</span><br><span style="color: hsl(0, 100%, 40%);">-//        else</span><br><span style="color: hsl(0, 100%, 40%);">-//          settings.rstin = false;</span><br><span style="color: hsl(0, 100%, 40%);">-//       ncn8025_set(slotnr, &settings);</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(sim_clkdiv, cmd_sim_clkdiv, "sim-clkdiv", "Set SIM clock divider (1,2,4,8)")</span><br><span style="color: hsl(0, 100%, 40%);">-//{</span><br><span style="color: hsl(0, 100%, 40%);">-//   struct ncn8025_settings settings;</span><br><span style="color: hsl(0, 100%, 40%);">-//     int slotnr = validate_slotnr(argc, argv, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-//  int clkdiv;</span><br><span style="color: hsl(0, 100%, 40%);">-//</span><br><span style="color: hsl(0, 100%, 40%);">-// if (slotnr < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-//            return;</span><br><span style="color: hsl(0, 100%, 40%);">-//</span><br><span style="color: hsl(0, 100%, 40%);">-//     if (argc < 3) {</span><br><span style="color: hsl(0, 100%, 40%);">-//            printf("You have to specify a valid divider (1,2,4,8)\r\n");</span><br><span style="color: hsl(0, 100%, 40%);">-//                return;</span><br><span style="color: hsl(0, 100%, 40%);">-//       }</span><br><span style="color: hsl(0, 100%, 40%);">-//     clkdiv = atoi(argv[2]);</span><br><span style="color: hsl(0, 100%, 40%);">-//       if (clkdiv != 1 && clkdiv != 2 && clkdiv != 4 && clkdiv != 8) {</span><br><span style="color: hsl(0, 100%, 40%);">-//               printf("You have to specify a valid divider (1,2,4,8)\r\n");</span><br><span style="color: hsl(0, 100%, 40%);">-//                return;</span><br><span style="color: hsl(0, 100%, 40%);">-//       }</span><br><span style="color: hsl(0, 100%, 40%);">-//     ncn8025_get(slotnr, &settings);</span><br><span style="color: hsl(0, 100%, 40%);">-//   switch (clkdiv) {</span><br><span style="color: hsl(0, 100%, 40%);">-//     case 1:</span><br><span style="color: hsl(0, 100%, 40%);">-//               settings.clkdiv = SIM_CLKDIV_1;</span><br><span style="color: hsl(0, 100%, 40%);">-//               break;</span><br><span style="color: hsl(0, 100%, 40%);">-//        case 2:</span><br><span style="color: hsl(0, 100%, 40%);">-//               settings.clkdiv = SIM_CLKDIV_2;</span><br><span style="color: hsl(0, 100%, 40%);">-//               break;</span><br><span style="color: hsl(0, 100%, 40%);">-//        case 4:</span><br><span style="color: hsl(0, 100%, 40%);">-//               settings.clkdiv = SIM_CLKDIV_4;</span><br><span style="color: hsl(0, 100%, 40%);">-//               break;</span><br><span style="color: hsl(0, 100%, 40%);">-//        case 8:</span><br><span style="color: hsl(0, 100%, 40%);">-//               settings.clkdiv = SIM_CLKDIV_8;</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%);">-//     ncn8025_set(slotnr, &settings);</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(sim_voltage, cmd_sim_voltage, "sim-voltage", "Set SIM voltage (5/3/1.8)")</span><br><span style="color: hsl(0, 100%, 40%);">-//{</span><br><span style="color: hsl(0, 100%, 40%);">-//      struct ncn8025_settings settings;</span><br><span style="color: hsl(0, 100%, 40%);">-//     int slotnr = validate_slotnr(argc, argv, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-//</span><br><span style="color: hsl(0, 100%, 40%);">-//        if (slotnr < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-//            return;</span><br><span style="color: hsl(0, 100%, 40%);">-//</span><br><span style="color: hsl(0, 100%, 40%);">-//     if (argc < 3) {</span><br><span style="color: hsl(0, 100%, 40%);">-//            printf("You have to specify a valid voltage (5/3/1.8)\r\n");</span><br><span style="color: hsl(0, 100%, 40%);">-//                return;</span><br><span style="color: hsl(0, 100%, 40%);">-//       }</span><br><span style="color: hsl(0, 100%, 40%);">-//     ncn8025_get(slotnr, &settings);</span><br><span style="color: hsl(0, 100%, 40%);">-//   if (!strcmp(argv[2], "5"))</span><br><span style="color: hsl(0, 100%, 40%);">-//          settings.vsel = SIM_VOLT_5V0;</span><br><span style="color: hsl(0, 100%, 40%);">-// else if (!strcmp(argv[2], "3"))</span><br><span style="color: hsl(0, 100%, 40%);">-//             settings.vsel = SIM_VOLT_3V0;</span><br><span style="color: hsl(0, 100%, 40%);">-// else if (!strcmp(argv[2], "1.8"))</span><br><span style="color: hsl(0, 100%, 40%);">-//           settings.vsel = SIM_VOLT_1V8;</span><br><span style="color: hsl(0, 100%, 40%);">-// else {</span><br><span style="color: hsl(0, 100%, 40%);">-//                printf("You have to specify a valid voltage (5/3/1.8)\r\n");</span><br><span style="color: hsl(0, 100%, 40%);">-//                return;</span><br><span style="color: hsl(0, 100%, 40%);">-//       }</span><br><span style="color: hsl(0, 100%, 40%);">-//     ncn8025_set(slotnr, &settings);</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(sim_led, cmd_sim_led, "sim-led", "Set SIM LED (1=on, 0=off)")</span><br><span style="color: hsl(0, 100%, 40%);">-//{</span><br><span style="color: hsl(0, 100%, 40%);">-//  struct ncn8025_settings settings;</span><br><span style="color: hsl(0, 100%, 40%);">-//     int slotnr = validate_slotnr(argc, argv, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-//</span><br><span style="color: hsl(0, 100%, 40%);">-//        if (slotnr < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-//            return;</span><br><span style="color: hsl(0, 100%, 40%);">-//</span><br><span style="color: hsl(0, 100%, 40%);">-//     if (argc < 3) {</span><br><span style="color: hsl(0, 100%, 40%);">-//            printf("You have to specify 0=disable or 1=enable\r\n");</span><br><span style="color: hsl(0, 100%, 40%);">-//            return;</span><br><span style="color: hsl(0, 100%, 40%);">-//       }</span><br><span style="color: hsl(0, 100%, 40%);">-//     ncn8025_get(slotnr, &settings);</span><br><span style="color: hsl(0, 100%, 40%);">-//   if (atoi(argv[2]))</span><br><span style="color: hsl(0, 100%, 40%);">-//            settings.led = true;</span><br><span style="color: hsl(0, 100%, 40%);">-//  else</span><br><span style="color: hsl(0, 100%, 40%);">-//          settings.led = false;</span><br><span style="color: hsl(0, 100%, 40%);">-// ncn8025_set(slotnr, &settings);</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(sim_atr, cmd_sim_atr, "sim-atr", "Read ATR from SIM card")</span><br><span style="color: hsl(0, 100%, 40%);">-//{</span><br><span style="color: hsl(0, 100%, 40%);">-//     struct ncn8025_settings settings;</span><br><span style="color: hsl(0, 100%, 40%);">-//     int slotnr = validate_slotnr(argc, argv, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-//</span><br><span style="color: hsl(0, 100%, 40%);">-//        if (slotnr < 0 || slotnr >= ARRAY_SIZE(SIM_peripheral_descriptors) || NULL == SIM_peripheral_descriptors[slotnr]) {</span><br><span style="color: hsl(0, 100%, 40%);">-//             return;</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%);">-//   // check if card is present (and read current settings)</span><br><span style="color: hsl(0, 100%, 40%);">-//       ncn8025_get(slotnr, &settings);</span><br><span style="color: hsl(0, 100%, 40%);">-//   if (!settings.simpres) {</span><br><span style="color: hsl(0, 100%, 40%);">-//              printf("(%d) error: no card present\r\n", slotnr);</span><br><span style="color: hsl(0, 100%, 40%);">-//          return;</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%);">-//   // switch card off (assert reset and disable power)</span><br><span style="color: hsl(0, 100%, 40%);">-//   // note: ISO/IEC 7816-3:2006 section 6.4 provides the deactivation sequence, but not the minimum corresponding times</span><br><span style="color: hsl(0, 100%, 40%);">-//  settings.rstin = true;</span><br><span style="color: hsl(0, 100%, 40%);">-//        settings.cmdvcc = false;</span><br><span style="color: hsl(0, 100%, 40%);">-//      settings.led = true;</span><br><span style="color: hsl(0, 100%, 40%);">-//  ncn8025_set(slotnr, &settings);</span><br><span style="color: hsl(0, 100%, 40%);">-//</span><br><span style="color: hsl(0, 100%, 40%);">-// // TODO wait some time for card to be completely deactivated</span><br><span style="color: hsl(0, 100%, 40%);">-//  usart_async_flush_rx_buffer(SIM_peripheral_descriptors[slotnr]); // flush RX buffer to start from scratch</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%);">-// // set clock to lowest frequency (20 MHz / 8 = 2.5 MHz)</span><br><span style="color: hsl(0, 100%, 40%);">-//       // note: according to ISO/IEC 7816-3:2006 section 5.2.3 the minimum value is 1 MHz, and maximum is 5 MHz during activation</span><br><span style="color: hsl(0, 100%, 40%);">-//    settings.clkdiv = SIM_CLKDIV_8;</span><br><span style="color: hsl(0, 100%, 40%);">-//       // set USART baud rate to match the interface (f = 2.5 MHz) and card default settings (Fd = 372, Dd = 1)</span><br><span style="color: hsl(0, 100%, 40%);">-//      slot_set_isorate(slotnr, settings.clkdiv, ISO7816_3_DEFAULT_FD, ISO7816_3_DEFAULT_DD);</span><br><span style="color: hsl(0, 100%, 40%);">-//        // set card voltage to 3.0 V (the most supported)</span><br><span style="color: hsl(0, 100%, 40%);">-//     // note: according to ISO/IEC 7816-3:2006 no voltage should damage the card, and you should cycle from low to high</span><br><span style="color: hsl(0, 100%, 40%);">-//    settings.vsel = SIM_VOLT_3V0;</span><br><span style="color: hsl(0, 100%, 40%);">-// // provide power (the NCN8025 should perform the activation according to spec)</span><br><span style="color: hsl(0, 100%, 40%);">-//        // note: activation sequence is documented in ISO/IEC 7816-3:2006 section 6.2</span><br><span style="color: hsl(0, 100%, 40%);">-// settings.cmdvcc = true;</span><br><span style="color: hsl(0, 100%, 40%);">-//       ncn8025_set(slotnr, &settings);</span><br><span style="color: hsl(0, 100%, 40%);">-//</span><br><span style="color: hsl(0, 100%, 40%);">-// // wait for Tb=400 cycles before re-asserting reset</span><br><span style="color: hsl(0, 100%, 40%);">-//   delay_us(400 * 10000 / 2500); // 400 cycles * 1000 for us, 2.5 MHz / 1000 for us</span><br><span style="color: hsl(0, 100%, 40%);">-//</span><br><span style="color: hsl(0, 100%, 40%);">-//    // de-assert reset to switch card back on</span><br><span style="color: hsl(0, 100%, 40%);">-//     settings.rstin = false;</span><br><span style="color: hsl(0, 100%, 40%);">-//       ncn8025_set(slotnr, &settings);</span><br><span style="color: hsl(0, 100%, 40%);">-//</span><br><span style="color: hsl(0, 100%, 40%);">-// // wait for Tc=40000 cycles for transmission to start</span><br><span style="color: hsl(0, 100%, 40%);">-// uint32_t cycles = 40000;</span><br><span style="color: hsl(0, 100%, 40%);">-//      while (cycles && !usart_async_is_rx_not_empty(SIM_peripheral_descriptors[slotnr])) {</span><br><span style="color: hsl(0, 100%, 40%);">-//          delay_us(10);</span><br><span style="color: hsl(0, 100%, 40%);">-//         cycles -= 25; // 10 us = 25 cycles at 2.5 MHz</span><br><span style="color: hsl(0, 100%, 40%);">-// }</span><br><span style="color: hsl(0, 100%, 40%);">-//     if (!usart_async_is_rx_not_empty(SIM_peripheral_descriptors[slotnr])) {</span><br><span style="color: hsl(0, 100%, 40%);">-//               delay_us(12 * 372 / 1 / 2); // wait more than one byte (approximate freq down to 2 MHz)</span><br><span style="color: hsl(0, 100%, 40%);">-//       }</span><br><span style="color: hsl(0, 100%, 40%);">-//     // verify if one byte has been received</span><br><span style="color: hsl(0, 100%, 40%);">-//       if (!usart_async_is_rx_not_empty(SIM_peripheral_descriptors[slotnr])) {</span><br><span style="color: hsl(0, 100%, 40%);">-//               printf("(%d) error: card not responsive\r\n", slotnr);</span><br><span style="color: hsl(0, 100%, 40%);">-//              return;</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%);">-//   // read ATR (just do it until there is no traffic anymore)</span><br><span style="color: hsl(0, 100%, 40%);">-//    // TODO the ATR should be parsed to read the right number of bytes, instead we just wait until to end of WT</span><br><span style="color: hsl(0, 100%, 40%);">-//   printf("(%d) ATR: ", slotnr);</span><br><span style="color: hsl(0, 100%, 40%);">-//       uint8_t atr_byte;</span><br><span style="color: hsl(0, 100%, 40%);">-//     while (usart_async_is_rx_not_empty(SIM_peripheral_descriptors[slotnr])) {</span><br><span style="color: hsl(0, 100%, 40%);">-//             if (1 == io_read(&SIM_peripheral_descriptors[slotnr]->io, &atr_byte, 1)) {</span><br><span style="color: hsl(0, 100%, 40%);">-//                 printf("%02x ", atr_byte);</span><br><span style="color: hsl(0, 100%, 40%);">-//          }</span><br><span style="color: hsl(0, 100%, 40%);">-//             uint16_t wt = ISO7816_3_DEFAULT_WT; // waiting time in ETU</span><br><span style="color: hsl(0, 100%, 40%);">-//            while (wt && !usart_async_is_rx_not_empty(SIM_peripheral_descriptors[slotnr])) {</span><br><span style="color: hsl(0, 100%, 40%);">-//                      delay_us(149); // wait for 1 ETU (372 / 1 / 2.5 MHz = 148.8 us)</span><br><span style="color: hsl(0, 100%, 40%);">-//                       wt--;</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%);">-//     printf("\r\n");</span><br><span style="color: hsl(0, 100%, 40%);">-//</span><br><span style="color: hsl(0, 100%, 40%);">-//   /* disable LED */</span><br><span style="color: hsl(0, 100%, 40%);">-//     settings.led = false;</span><br><span style="color: hsl(0, 100%, 40%);">-// ncn8025_set(slotnr, &settings);</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(sim_iccid, cmd_sim_iccid, "sim-iccid", "Read ICCID from SIM card")</span><br><span style="color: hsl(0, 100%, 40%);">-//{</span><br><span style="color: hsl(0, 100%, 40%);">-//     struct ncn8025_settings settings;</span><br><span style="color: hsl(0, 100%, 40%);">-//     int slotnr = validate_slotnr(argc, argv, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-//</span><br><span style="color: hsl(0, 100%, 40%);">-//        if (slotnr < 0 || slotnr >= ARRAY_SIZE(SIM_peripheral_descriptors) || NULL == SIM_peripheral_descriptors[slotnr]) {</span><br><span style="color: hsl(0, 100%, 40%);">-//             return;</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%);">-//   // read current settings and check if card is present and powered</span><br><span style="color: hsl(0, 100%, 40%);">-//     ncn8025_get(slotnr, &settings);</span><br><span style="color: hsl(0, 100%, 40%);">-//   if (!settings.simpres) {</span><br><span style="color: hsl(0, 100%, 40%);">-//              printf("(%d) error: no card present\r\n", slotnr);</span><br><span style="color: hsl(0, 100%, 40%);">-//          return;</span><br><span style="color: hsl(0, 100%, 40%);">-//       }</span><br><span style="color: hsl(0, 100%, 40%);">-//     if (!settings.cmdvcc) {</span><br><span style="color: hsl(0, 100%, 40%);">-//               printf("(%d) error: card not powered\r\n", slotnr);</span><br><span style="color: hsl(0, 100%, 40%);">-//         return;</span><br><span style="color: hsl(0, 100%, 40%);">-//       }</span><br><span style="color: hsl(0, 100%, 40%);">-//     if (settings.rstin) {</span><br><span style="color: hsl(0, 100%, 40%);">-//         printf("(%d) error: card under reset\r\n", slotnr);</span><br><span style="color: hsl(0, 100%, 40%);">-//         return;</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%);">-//   // enable LED</span><br><span style="color: hsl(0, 100%, 40%);">-// if (!settings.led) {</span><br><span style="color: hsl(0, 100%, 40%);">-//          settings.led = true;</span><br><span style="color: hsl(0, 100%, 40%);">-//          ncn8025_set(slotnr, &settings);</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%);">-//   // select MF</span><br><span style="color: hsl(0, 100%, 40%);">-//  printf("(%d) SELECT MF\r\n", slotnr);</span><br><span style="color: hsl(0, 100%, 40%);">-//       const uint8_t select_header[] = {0xa0, 0xa4, 0x00, 0x00, 0x02}; // see TS 102.221 sec. 11.1.1</span><br><span style="color: hsl(0, 100%, 40%);">-// const uint8_t select_data_mf[] = {0x3f, 0x00}; // see TS 102.221 sec. 13.1</span><br><span style="color: hsl(0, 100%, 40%);">-//    int rc = slot_tpdu_xfer(slotnr, select_header, (uint8_t*)select_data_mf, ARRAY_SIZE(select_data_mf), true); // transfer TPDU</span><br><span style="color: hsl(0, 100%, 40%);">-//  if (ERR_NONE != rc) {</span><br><span style="color: hsl(0, 100%, 40%);">-//         printf("error while SELECT MF (errno = %d)\r\n", rc);</span><br><span style="color: hsl(0, 100%, 40%);">-//       }</span><br><span style="color: hsl(0, 100%, 40%);">-//     // ignore response data</span><br><span style="color: hsl(0, 100%, 40%);">-//</span><br><span style="color: hsl(0, 100%, 40%);">-//     // select EF_ICCID</span><br><span style="color: hsl(0, 100%, 40%);">-//    printf("(%d) SELECT EF_ICCID\r\n", slotnr);</span><br><span style="color: hsl(0, 100%, 40%);">-// const uint8_t select_data_ef_iccid[] = {0x2f, 0xe2}; // see TS 102.221 sec. 13.2</span><br><span style="color: hsl(0, 100%, 40%);">-//      rc = slot_tpdu_xfer(slotnr, select_header, (uint8_t*)select_data_ef_iccid, ARRAY_SIZE(select_data_ef_iccid), true); // transfer TPDU</span><br><span style="color: hsl(0, 100%, 40%);">-//  if (ERR_NONE != rc) {</span><br><span style="color: hsl(0, 100%, 40%);">-//         printf("error while SELECT EF_ICCID (errno = %d)\r\n", rc);</span><br><span style="color: hsl(0, 100%, 40%);">-// }</span><br><span style="color: hsl(0, 100%, 40%);">-//     // ignore response data</span><br><span style="color: hsl(0, 100%, 40%);">-//</span><br><span style="color: hsl(0, 100%, 40%);">-//     // read EF_ICCID</span><br><span style="color: hsl(0, 100%, 40%);">-//      printf("(%d) READ EF_ICCID\r\n", slotnr);</span><br><span style="color: hsl(0, 100%, 40%);">-//   uint8_t iccid[10];</span><br><span style="color: hsl(0, 100%, 40%);">-//    uint8_t read_binary[] = {0xa0, 0xb0, 0x00, 0x00, ARRAY_SIZE(iccid)}; // see TS 102.221 sec. 11.1.3</span><br><span style="color: hsl(0, 100%, 40%);">-//    rc = slot_tpdu_xfer(slotnr, read_binary, iccid, ARRAY_SIZE(iccid), false); // transfer TPDU</span><br><span style="color: hsl(0, 100%, 40%);">-//   if (ERR_NONE != rc) {</span><br><span style="color: hsl(0, 100%, 40%);">-//         printf("error while READ ICCID (errno = %d)\r\n", rc);</span><br><span style="color: hsl(0, 100%, 40%);">-//      }</span><br><span style="color: hsl(0, 100%, 40%);">-//     // ignore response data</span><br><span style="color: hsl(0, 100%, 40%);">-//</span><br><span style="color: hsl(0, 100%, 40%);">-//     printf("(%d) ICCID: ", slotnr);</span><br><span style="color: hsl(0, 100%, 40%);">-//     for (uint8_t i = 0; i < ARRAY_SIZE(iccid); i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-//          uint8_t nibble = iccid[i] & 0xf;</span><br><span style="color: hsl(0, 100%, 40%);">-//          if (0xf == nibble) {</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%);">-//             printf("%x", nibble);</span><br><span style="color: hsl(0, 100%, 40%);">-//               nibble = iccid[i] >> 4;</span><br><span style="color: hsl(0, 100%, 40%);">-//         if (0xf == nibble) {</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%);">-//             printf("%x", nibble);</span><br><span style="color: hsl(0, 100%, 40%);">-//       }</span><br><span style="color: hsl(0, 100%, 40%);">-//     printf("\r\n");</span><br><span style="color: hsl(0, 100%, 40%);">-//</span><br><span style="color: hsl(0, 100%, 40%);">-//   // disable LED</span><br><span style="color: hsl(0, 100%, 40%);">-//        settings.led = false;</span><br><span style="color: hsl(0, 100%, 40%);">-// ncn8025_set(slotnr, &settings);</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(get_time, cmd_get_time, "get-time", "Read Time from RTC")</span><br><span style="color: hsl(0, 100%, 40%);">-//{</span><br><span style="color: hsl(0, 100%, 40%);">-//      struct calendar_date_time dt;</span><br><span style="color: hsl(0, 100%, 40%);">-// calendar_get_date_time(&CALENDAR_0, &dt);</span><br><span style="color: hsl(0, 100%, 40%);">-//     printf("%04u-%02u-%02u %02u:%02u:%02u\r\n", dt.date.year, dt.date.month, dt.date.day,</span><br><span style="color: hsl(0, 100%, 40%);">-//               dt.time.hour, dt.time.min, dt.time.sec);</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 <osmocom/core/timer.h></span><br><span style="color: hsl(0, 100%, 40%);">-//static struct osmo_timer_list t;</span><br><span style="color: hsl(0, 100%, 40%);">-//static void tmr_cb(void *data)</span><br><span style="color: hsl(0, 100%, 40%);">-//{</span><br><span style="color: hsl(0, 100%, 40%);">-//       printf("timer fired!\r\n");</span><br><span style="color: hsl(0, 100%, 40%);">-//}</span><br><span style="color: hsl(0, 100%, 40%);">-//DEFUN(test_timer, cmd_test_timer, "test-timer", "Test osmo_timer")</span><br><span style="color: hsl(0, 100%, 40%);">-//{</span><br><span style="color: hsl(0, 100%, 40%);">-//   printf("Setting up timer for 3s...\n\r");</span><br><span style="color: hsl(0, 100%, 40%);">-//   osmo_timer_setup(&t, &tmr_cb, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-//  osmo_timer_schedule(&t, 3, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-//}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> </span><br><span> extern void testmode_init(void);</span><br><span> extern void libosmo_emb_init(void);</span><br><span>@@ -1003,25 +329,9 @@</span><br><span> </span><br><span> #include "talloc.h"</span><br><span> #include "logging.h"</span><br><span style="color: hsl(0, 100%, 40%);">-//#include <osmocom/core/msgb.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> void *g_tall_ctx;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-//DEFUN(_talloc_report, cmd_talloc_report, "talloc-report", "Generate a talloc report")</span><br><span style="color: hsl(0, 100%, 40%);">-//{</span><br><span style="color: hsl(0, 100%, 40%);">-//    talloc_report_full(g_tall_ctx, stdout);</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(talloc_test, cmd_talloc_test, "talloc-test", "Test the talloc allocator")</span><br><span style="color: hsl(0, 100%, 40%);">-//{</span><br><span style="color: hsl(0, 100%, 40%);">-//  for (int i = 0; i < 10; i++)</span><br><span style="color: hsl(0, 100%, 40%);">-//               talloc_named_const(g_tall_ctx, 10, "sibling");</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(v_talloc_free, cmd_talloc_free, "talloc-free", "Release all memory")</span><br><span style="color: hsl(0, 100%, 40%);">-//{</span><br><span style="color: hsl(0, 100%, 40%);">-//      talloc_free(g_tall_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">-//      g_tall_ctx = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-//}</span><br><span> </span><br><span> /* Section 9.6 of SAMD5x/E5x Family Data Sheet */</span><br><span> static int get_chip_unique_serial(uint8_t *out, size_t len)</span><br><span>@@ -1170,21 +480,8 @@</span><br><span>        usb_start();</span><br><span> </span><br><span>     board_init();</span><br><span style="color: hsl(0, 100%, 40%);">-// command_init("sysmoOCTSIM> ");</span><br><span style="color: hsl(0, 100%, 40%);">-//   command_register(&cmd_sim_status);</span><br><span style="color: hsl(0, 100%, 40%);">-//        command_register(&cmd_sim_power);</span><br><span style="color: hsl(0, 100%, 40%);">-// command_register(&cmd_sim_reset);</span><br><span style="color: hsl(0, 100%, 40%);">-// command_register(&cmd_sim_clkdiv);</span><br><span style="color: hsl(0, 100%, 40%);">-//        command_register(&cmd_sim_voltage);</span><br><span style="color: hsl(0, 100%, 40%);">-//       command_register(&cmd_sim_led);</span><br><span style="color: hsl(0, 100%, 40%);">-//   command_register(&cmd_sim_atr);</span><br><span style="color: hsl(0, 100%, 40%);">-//   command_register(&cmd_sim_iccid);</span><br><span style="color: hsl(0, 100%, 40%);">-// testmode_init();</span><br><span style="color: hsl(0, 100%, 40%);">-//      command_register(&cmd_talloc_test);</span><br><span style="color: hsl(0, 100%, 40%);">-//       command_register(&cmd_talloc_report);</span><br><span style="color: hsl(0, 100%, 40%);">-//     command_register(&cmd_talloc_free);</span><br><span style="color: hsl(0, 100%, 40%);">-//       command_register(&cmd_get_time);</span><br><span style="color: hsl(0, 100%, 40%);">-//  command_register(&cmd_test_timer);</span><br><span style="color: hsl(120, 100%, 40%);">+        command_init("sysmoOCTSIM> ");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> </span><br><span> </span><br><span> for(int i = 0; i <= 136; i++)</span><br><span>@@ -1237,11 +534,11 @@</span><br><span>   gpio_set_pin_direction(PIN_PB13, GPIO_DIRECTION_OUT);</span><br><span>        gpio_set_pin_level(PIN_PB13, false);</span><br><span> #endif</span><br><span style="color: hsl(0, 100%, 40%);">-  poll_card_detect();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> //     command_print_prompt();</span><br><span>      while (true) { // main loop</span><br><span>          command_try_recv();</span><br><span style="color: hsl(0, 100%, 40%);">-//           poll_card_detect();</span><br><span style="color: hsl(120, 100%, 40%);">+           poll_card_detect();</span><br><span>          submit_next_irq();</span><br><span>           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></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/16252">change 16252</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/+/16252"/><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: I91fff5d8c296661bcef8576244079f3a5fc8800b </div>
<div style="display:none"> Gerrit-Change-Number: 16252 </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>