More fix for USB.
authorNIIBE Yutaka <gniibe@fsij.org>
Fri, 29 Sep 2017 12:06:15 +0000 (21:06 +0900)
committerNIIBE Yutaka <gniibe@fsij.org>
Fri, 29 Sep 2017 12:06:15 +0000 (21:06 +0900)
ChangeLog
src/usb-ccid.c
src/usb_ctrl.c

index 446be0a..9b0cd5c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,15 @@
 2017-09-29  NIIBE Yutaka  <gniibe@fsij.org>
 
-       * src/usb_ctrl.c (gnuk_setup_endpoints_for_interface): Add DEV
+       * src/usb-ccid.c (epo_init, epi_init, ccid_thread): Simplify.
+       (EP1_IN_Callback, ccid_prepare_receive, EP1_OUT_Callback)
+       (usb_rx_ready, ccid_error, ccid_power_on, ccid_send_status)
+       (ccid_send_data_block_internal, ccid_send_data_block_0x9000)
+       (ccid_send_data_block_gr, ccid_send_params)
+       (ccid_notify_slot_change, _write) [GNU_LINUX_EMULATION]: Use
+       different usb driver API.
+
+       * src/usb_ctrl.c (usb_device_reset): Fix control endpoint init.
+       (gnuk_setup_endpoints_for_interface): Add DEV
        argument.
        (usb_device_reset) [GNU_LINUX_EMULATION]: Use usb_lld_setup_endp.
 
index 62c733b..ecd7994 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * usb-ccid.c -- USB CCID protocol handling
  *
- * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016
+ * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017
  *               Free Software Initiative of Japan
  * Author: NIIBE Yutaka <gniibe@fsij.org>
  *
@@ -30,6 +30,7 @@
 #include "config.h"
 
 #ifdef DEBUG
+#include "usb-cdc.h"
 #include "debug.h"
 struct stdout stdout;
 #endif
@@ -75,7 +76,6 @@ struct apdu apdu;
  */
 
 struct ep_in {
-  uint8_t ep_num;
   uint8_t tx_done;
   const uint8_t *buf;
   size_t cnt;
@@ -84,9 +84,8 @@ struct ep_in {
   void (*next_buf) (struct ep_in *epi, size_t len);
 };
 
-static void epi_init (struct ep_in *epi, int ep_num, void *priv)
+static void epi_init (struct ep_in *epi, void *priv)
 {
-  epi->ep_num = ep_num;
   epi->tx_done = 0;
   epi->buf = NULL;
   epi->cnt = 0;
@@ -96,7 +95,6 @@ static void epi_init (struct ep_in *epi, int ep_num, void *priv)
 }
 
 struct ep_out {
-  uint8_t ep_num;
   uint8_t err;
   uint8_t *buf;
   size_t cnt;
@@ -109,9 +107,8 @@ struct ep_out {
 static struct ep_out endpoint_out;
 static struct ep_in endpoint_in;
 
-static void epo_init (struct ep_out *epo, int ep_num, void *priv)
+static void epo_init (struct ep_out *epo, void *priv)
 {
-  epo->ep_num = ep_num;
   epo->err = 0;
   epo->buf = NULL;
   epo->cnt = 0;
@@ -345,6 +342,9 @@ static void get_sw1sw2 (struct ep_in *epi, size_t len)
   epi->next_buf = no_buf;
 }
 
+#ifdef GNU_LINUX_EMULATION
+static uint8_t endp1_tx_buf[64];
+#endif
 
 /*
  * Tx done callback
@@ -361,7 +361,12 @@ EP1_IN_Callback (uint16_t len)
     else
       {
        epi->tx_done = 1;
-       usb_lld_tx_enable (epi->ep_num, 0); /* send ZLP */
+       /* send ZLP */
+#ifdef GNU_LINUX_EMULATION
+       usb_lld_tx_enable_buf (ENDP1, endp1_tx_buf, 0);
+#else
+       usb_lld_tx_enable (ENDP1, 0);
+#endif
       }
   else
     {
@@ -372,7 +377,11 @@ EP1_IN_Callback (uint16_t len)
       while (epi->buf)
        if (epi->buf_len < remain)
          {
-           usb_lld_txcpy (epi->buf, epi->ep_num, offset, epi->buf_len);
+#ifdef GNU_LINUX_EMULATION
+           memcpy (endp1_tx_buf+offset, epi->buf, epi->buf_len);
+#else
+           usb_lld_txcpy (epi->buf, ENDP1, offset, epi->buf_len);
+#endif
            offset += epi->buf_len;
            remain -= epi->buf_len;
            tx_size += epi->buf_len;
@@ -380,7 +389,11 @@ EP1_IN_Callback (uint16_t len)
          }
        else
          {
-           usb_lld_txcpy (epi->buf, epi->ep_num, offset, remain);
+#ifdef GNU_LINUX_EMULATION
+           memcpy (endp1_tx_buf+offset, epi->buf, remain);
+#else
+           usb_lld_txcpy (epi->buf, ENDP1, offset, remain);
+#endif
            epi->buf += remain;
            epi->cnt += remain;
            epi->buf_len -= remain;
@@ -390,7 +403,12 @@ EP1_IN_Callback (uint16_t len)
 
       if (tx_size < USB_LL_BUF_SIZE)
        epi->tx_done = 1;
-      usb_lld_tx_enable (epi->ep_num, tx_size);
+
+#ifdef GNU_LINUX_EMULATION
+      usb_lld_tx_enable_buf (ENDP1, endp1_tx_buf, tx_size);
+#else
+      usb_lld_tx_enable (ENDP1, tx_size);
+#endif
     }
 }
 
@@ -609,6 +627,9 @@ static void ccid_abdata (struct ep_out *epo, size_t len)
     }
 }
 
+#ifdef GNU_LINUX_EMULATION
+static uint8_t endp1_rx_buf[64];
+#endif
 
 static void
 ccid_prepare_receive (struct ccid *c)
@@ -619,7 +640,11 @@ ccid_prepare_receive (struct ccid *c)
   c->epo->cnt = 0;
   c->epo->next_buf = ccid_abdata;
   c->epo->end_rx = end_ccid_rx;
-  usb_lld_rx_enable (c->epo->ep_num);
+#ifdef GNU_LINUX_EMULATION
+  usb_lld_rx_enable_buf (ENDP1, endp1_rx_buf, 64);
+#else
+  usb_lld_rx_enable (ENDP1);
+#endif
   DEBUG_INFO ("Rx ready\r\n");
 }
 
@@ -640,7 +665,11 @@ EP1_OUT_Callback (uint16_t len)
       break;
     else if (len <= epo->buf_len)
       {
-       usb_lld_rxcpy (epo->buf, epo->ep_num, offset, len);
+#ifdef GNU_LINUX_EMULATION
+       memcpy (epo->buf, endp1_rx_buf + offset, len);
+#else
+       usb_lld_rxcpy (epo->buf, ENDP1, offset, len);
+#endif
        epo->buf += len;
        epo->cnt += len;
        epo->buf_len -= len;
@@ -648,7 +677,11 @@ EP1_OUT_Callback (uint16_t len)
       }
     else /* len > buf_len */
       {
-       usb_lld_rxcpy (epo->buf, epo->ep_num, offset, epo->buf_len);
+#ifdef GNU_LINUX_EMULATION
+       memcpy (epo->buf, endp1_rx_buf + offset, epo->buf_len);
+#else
+       usb_lld_rxcpy (epo->buf, ENDP1, offset, epo->buf_len);
+#endif
        len -= epo->buf_len;
        offset += epo->buf_len;
        epo->next_buf (epo, len); /* Update epo->buf, cnt, buf_len */
@@ -661,7 +694,11 @@ EP1_OUT_Callback (uint16_t len)
   cont = epo->end_rx (epo, orig_len);
 
   if (cont)
-    usb_lld_rx_enable (epo->ep_num);
+#ifdef GNU_LINUX_EMULATION
+    usb_lld_rx_enable_buf (ENDP1, endp1_rx_buf, 64);
+#else
+    usb_lld_rx_enable (ENDP1);
+#endif
   else
     notify_icc (epo);
 }
@@ -669,6 +706,10 @@ EP1_OUT_Callback (uint16_t len)
 
 extern void EP6_IN_Callback (uint16_t len);
 
+#if defined(DEBUG) && defined(GNU_LINUX_EMULATION)
+static uint8_t endp5_buf[VIRTUAL_COM_PORT_DATA_SIZE];
+#endif
+
 static void
 usb_rx_ready (uint8_t ep_num, uint16_t len)
 {
@@ -678,7 +719,11 @@ usb_rx_ready (uint8_t ep_num, uint16_t len)
   else if (ep_num == ENDP5)
     {
       chopstx_mutex_lock (&stdout.m_dev);
+#ifdef GNU_LINUX_EMULATION
+      usb_lld_rx_enable (ep_num, endp5_buf, VIRTUAL_COM_PORT_DATA_SIZE);
+#else
       usb_lld_rx_enable (ep_num);
+#endif
       chopstx_mutex_unlock (&stdout.m_dev);
     }
 #endif
@@ -756,7 +801,12 @@ static void ccid_error (struct ccid *c, int offset)
   /* This is a single packet Bulk-IN transaction */
   c->epi->buf = NULL;
   c->epi->tx_done = 1;
-  usb_lld_write (c->epi->ep_num, ccid_reply, CCID_MSG_HEADER_SIZE);
+#ifdef GNU_LINUX_EMULATION
+  memcpy (endp1_tx_buf, ccid_reply, CCID_MSG_HEADER_SIZE);
+  usb_lld_tx_enable_buf (ENDP1, endp1_tx_buf, CCID_MSG_HEADER_SIZE);
+#else
+  usb_lld_write (ENDP1, ccid_reply, CCID_MSG_HEADER_SIZE);
+#endif
 }
 
 extern void *openpgp_card_thread (void *arg);
@@ -795,9 +845,14 @@ ccid_power_on (struct ccid *c)
   p[CCID_MSG_ERROR_OFFSET] = 0x00;
   p[CCID_MSG_CHAIN_OFFSET] = 0x00;
 
-  usb_lld_txcpy (p, c->epi->ep_num, 0, CCID_MSG_HEADER_SIZE);
-  usb_lld_txcpy (ATR_head, c->epi->ep_num, CCID_MSG_HEADER_SIZE,
+#ifdef GNU_LINUX_EMULATION
+  memcpy (endp1_tx_buf, p, CCID_MSG_HEADER_SIZE);
+  memcpy (endp1_tx_buf+CCID_MSG_HEADER_SIZE, ATR_head, sizeof (ATR_head));
+#else
+  usb_lld_txcpy (p, ENDP1, 0, CCID_MSG_HEADER_SIZE);
+  usb_lld_txcpy (ATR_head, ENDP1, CCID_MSG_HEADER_SIZE,
                 sizeof (ATR_head));
+#endif
   for (i = 1; i < (int)sizeof (ATR_head); i++)
     xor_check ^= ATR_head[i];
   memcpy (p, historical_bytes + 1, hist_len);
@@ -808,13 +863,21 @@ ccid_power_on (struct ccid *c)
   for (i = 0; i < hist_len; i++)
     xor_check ^= p[i];
   p[i] = xor_check;
-  usb_lld_txcpy (p, c->epi->ep_num, CCID_MSG_HEADER_SIZE + sizeof (ATR_head),
+#ifdef GNU_LINUX_EMULATION
+  memcpy (endp1_tx_buf+CCID_MSG_HEADER_SIZE+sizeof (ATR_head), p, hist_len+1);
+#else
+  usb_lld_txcpy (p, ENDP1, CCID_MSG_HEADER_SIZE + sizeof (ATR_head),
                 hist_len+1);
+#endif
 
   /* This is a single packet Bulk-IN transaction */
   c->epi->buf = NULL;
   c->epi->tx_done = 1;
-  usb_lld_tx_enable (c->epi->ep_num, CCID_MSG_HEADER_SIZE + size_atr);
+#ifdef GNU_LINUX_EMULATION
+  usb_lld_tx_enable_buf (ENDP1, endp1_tx_buf, CCID_MSG_HEADER_SIZE + size_atr);
+#else
+  usb_lld_tx_enable (ENDP1, CCID_MSG_HEADER_SIZE + size_atr);
+#endif
   DEBUG_INFO ("ON\r\n");
 
   return CCID_STATE_WAIT;
@@ -845,7 +908,13 @@ ccid_send_status (struct ccid *c)
   /* This is a single packet Bulk-IN transaction */
   c->epi->buf = NULL;
   c->epi->tx_done = 1;
-  usb_lld_write (c->epi->ep_num, ccid_reply, CCID_MSG_HEADER_SIZE);
+
+#ifdef GNU_LINUX_EMULATION
+  memcpy (endp1_tx_buf, ccid_reply, CCID_MSG_HEADER_SIZE);
+  usb_lld_tx_enable_buf (ENDP1, endp1_tx_buf, CCID_MSG_HEADER_SIZE);
+#else
+  usb_lld_write (ENDP1, ccid_reply, CCID_MSG_HEADER_SIZE);
+#endif
 
   led_blink (LED_SHOW_STATUS);
 #ifdef DEBUG_MORE
@@ -892,19 +961,34 @@ ccid_send_data_block_internal (struct ccid *c, uint8_t status, uint8_t error)
   p[CCID_MSG_ERROR_OFFSET] = error;
   p[CCID_MSG_CHAIN_OFFSET] = 0;
 
-  usb_lld_txcpy (p, c->epi->ep_num, 0, CCID_MSG_HEADER_SIZE);
+#ifdef GNU_LINUX_EMULATION
+  memcpy (endp1_tx_buf, p, CCID_MSG_HEADER_SIZE);
+#else
+  usb_lld_txcpy (p, ENDP1, 0, CCID_MSG_HEADER_SIZE);
+#endif
   if (len == 0)
     {
-      usb_lld_tx_enable (c->epi->ep_num, CCID_MSG_HEADER_SIZE);
+#ifdef GNU_LINUX_EMULATION
+      usb_lld_tx_enable_buf (ENDP1, endp1_tx_buf, CCID_MSG_HEADER_SIZE);
+#else
+      usb_lld_tx_enable (ENDP1, CCID_MSG_HEADER_SIZE);
+#endif
       return;
     }
 
   if (CCID_MSG_HEADER_SIZE + len <= USB_LL_BUF_SIZE)
     {
-      usb_lld_txcpy (c->a->res_apdu_data, c->epi->ep_num,
+#ifdef GNU_LINUX_EMULATION
+      memcpy (endp1_tx_buf+CCID_MSG_HEADER_SIZE,
+             c->a->res_apdu_data, c->a->res_apdu_data_len);
+      memcpy (endp1_tx_buf+CCID_MSG_HEADER_SIZE+c->a->res_apdu_data_len,
+             c->sw1sw2, 2);
+#else
+      usb_lld_txcpy (c->a->res_apdu_data, ENDP1,
                     CCID_MSG_HEADER_SIZE, c->a->res_apdu_data_len);
-      usb_lld_txcpy (c->sw1sw2, c->epi->ep_num,
+      usb_lld_txcpy (c->sw1sw2, ENDP1,
                     CCID_MSG_HEADER_SIZE + c->a->res_apdu_data_len, 2);
+#endif
       c->epi->buf = NULL;
       if (CCID_MSG_HEADER_SIZE + len < USB_LL_BUF_SIZE)
        c->epi->tx_done = 1;
@@ -912,10 +996,17 @@ ccid_send_data_block_internal (struct ccid *c, uint8_t status, uint8_t error)
     }
   else if (CCID_MSG_HEADER_SIZE + len - 1 == USB_LL_BUF_SIZE)
     {
-      usb_lld_txcpy (c->a->res_apdu_data, c->epi->ep_num,
+#ifdef GNU_LINUX_EMULATION
+      memcpy (endp1_tx_buf+CCID_MSG_HEADER_SIZE,
+             c->a->res_apdu_data, c->a->res_apdu_data_len);
+      memcpy (endp1_tx_buf+CCID_MSG_HEADER_SIZE+c->a->res_apdu_data_len,
+             c->sw1sw2, 1);
+#else
+      usb_lld_txcpy (c->a->res_apdu_data, ENDP1,
                     CCID_MSG_HEADER_SIZE, c->a->res_apdu_data_len);
-      usb_lld_txcpy (c->sw1sw2, c->epi->ep_num,
+      usb_lld_txcpy (c->sw1sw2, ENDP1,
                     CCID_MSG_HEADER_SIZE + c->a->res_apdu_data_len, 1);
+#endif
       c->epi->buf = &c->sw1sw2[1];
       c->epi->cnt = 1;
       c->epi->buf_len = 1;
@@ -923,8 +1014,13 @@ ccid_send_data_block_internal (struct ccid *c, uint8_t status, uint8_t error)
     }
   else if (CCID_MSG_HEADER_SIZE + len - 2 == USB_LL_BUF_SIZE)
     {
-      usb_lld_txcpy (c->a->res_apdu_data, c->epi->ep_num,
+#ifdef GNU_LINUX_EMULATION
+      memcpy (endp1_tx_buf+CCID_MSG_HEADER_SIZE,
+             c->a->res_apdu_data, c->a->res_apdu_data_len);
+#else
+      usb_lld_txcpy (c->a->res_apdu_data, ENDP1,
                     CCID_MSG_HEADER_SIZE, c->a->res_apdu_data_len);
+#endif
       c->epi->buf = &c->sw1sw2[0];
       c->epi->cnt = 0;
       c->epi->buf_len = 2;
@@ -932,8 +1028,13 @@ ccid_send_data_block_internal (struct ccid *c, uint8_t status, uint8_t error)
     }
   else
     {
-      usb_lld_txcpy (c->a->res_apdu_data, c->epi->ep_num, CCID_MSG_HEADER_SIZE,
+#ifdef GNU_LINUX_EMULATION
+      memcpy (endp1_tx_buf+CCID_MSG_HEADER_SIZE,
+             c->a->res_apdu_data, USB_LL_BUF_SIZE - CCID_MSG_HEADER_SIZE);
+#else
+      usb_lld_txcpy (c->a->res_apdu_data, ENDP1, CCID_MSG_HEADER_SIZE,
                     USB_LL_BUF_SIZE - CCID_MSG_HEADER_SIZE);
+#endif
       c->epi->buf = c->a->res_apdu_data + USB_LL_BUF_SIZE - CCID_MSG_HEADER_SIZE;
       c->epi->cnt = USB_LL_BUF_SIZE - CCID_MSG_HEADER_SIZE;
       c->epi->buf_len = c->a->res_apdu_data_len
@@ -941,7 +1042,11 @@ ccid_send_data_block_internal (struct ccid *c, uint8_t status, uint8_t error)
       c->epi->next_buf = get_sw1sw2;
     }
 
-  usb_lld_tx_enable (c->epi->ep_num, tx_size);
+#ifdef GNU_LINUX_EMULATION
+  usb_lld_tx_enable_buf (ENDP1, endp1_tx_buf, tx_size);
+#else
+  usb_lld_tx_enable (ENDP1, tx_size);
+#endif
 #ifdef DEBUG_MORE
   DEBUG_INFO ("DATA\r\n");
 #endif
@@ -978,11 +1083,19 @@ ccid_send_data_block_0x9000 (struct ccid *c)
   p[CCID_MSG_CHAIN_OFFSET+1] = 0x90;
   p[CCID_MSG_CHAIN_OFFSET+2] = 0x00;
 
-  usb_lld_txcpy (p, c->epi->ep_num, 0, CCID_MSG_HEADER_SIZE + len);
+#ifdef GNU_LINUX_EMULATION
+  memcpy (endp1_tx_buf, p, CCID_MSG_HEADER_SIZE + len);
+#else
+  usb_lld_txcpy (p, ENDP1, 0, CCID_MSG_HEADER_SIZE + len);
+#endif
   c->epi->buf = NULL;
   c->epi->tx_done = 1;
 
-  usb_lld_tx_enable (c->epi->ep_num, CCID_MSG_HEADER_SIZE + len);
+#ifdef GNU_LINUX_EMULATION
+  usb_lld_tx_enable_buf (ENDP1, endp1_tx_buf, CCID_MSG_HEADER_SIZE + len);
+#else
+  usb_lld_tx_enable (ENDP1, CCID_MSG_HEADER_SIZE + len);
+#endif
 #ifdef DEBUG_MORE
   DEBUG_INFO ("DATA\r\n");
 #endif
@@ -1009,7 +1122,11 @@ ccid_send_data_block_gr (struct ccid *c, size_t chunk_len)
   p[CCID_MSG_ERROR_OFFSET] = 0;
   p[CCID_MSG_CHAIN_OFFSET] = 0;
 
-  usb_lld_txcpy (p, c->epi->ep_num, 0, CCID_MSG_HEADER_SIZE);
+#ifdef GNU_LINUX_EMULATION
+  memcpy (endp1_tx_buf, p, CCID_MSG_HEADER_SIZE);
+#else
+  usb_lld_txcpy (p, ENDP1, 0, CCID_MSG_HEADER_SIZE);
+#endif
 
   set_sw1sw2 (c, chunk_len);
 
@@ -1024,10 +1141,19 @@ ccid_send_data_block_gr (struct ccid *c, size_t chunk_len)
       else
        size_for_sw = 0;
 
-      usb_lld_txcpy (c->p, c->epi->ep_num, CCID_MSG_HEADER_SIZE, chunk_len);
+#ifdef GNU_LINUX_EMULATION
+      memcpy (endp1_tx_buf+CCID_MSG_HEADER_SIZE, c->p, chunk_len);
+#else
+      usb_lld_txcpy (c->p, ENDP1, CCID_MSG_HEADER_SIZE, chunk_len);
+#endif
       if (size_for_sw)
-       usb_lld_txcpy (c->sw1sw2, c->epi->ep_num,
+#ifdef GNU_LINUX_EMULATION
+       memcpy (endp1_tx_buf+CCID_MSG_HEADER_SIZE+chunk_len,
+               c->sw1sw2, size_for_sw);
+#else
+       usb_lld_txcpy (c->sw1sw2, ENDP1,
                       CCID_MSG_HEADER_SIZE + chunk_len, size_for_sw);
+#endif
       tx_size = CCID_MSG_HEADER_SIZE + chunk_len + size_for_sw;
       if (size_for_sw == 2)
        {
@@ -1046,8 +1172,13 @@ ccid_send_data_block_gr (struct ccid *c, size_t chunk_len)
     }
   else
     {
-      usb_lld_txcpy (c->p, c->epi->ep_num, CCID_MSG_HEADER_SIZE,
+#ifdef GNU_LINUX_EMULATION
+      memcpy (endp1_tx_buf+CCID_MSG_HEADER_SIZE,
+             c->p, USB_LL_BUF_SIZE - CCID_MSG_HEADER_SIZE);
+#else
+      usb_lld_txcpy (c->p, ENDP1, CCID_MSG_HEADER_SIZE,
                     USB_LL_BUF_SIZE - CCID_MSG_HEADER_SIZE);
+#endif
       c->epi->buf = c->p + USB_LL_BUF_SIZE - CCID_MSG_HEADER_SIZE;
       c->epi->cnt = 0;
       c->epi->buf_len = chunk_len - (USB_LL_BUF_SIZE - CCID_MSG_HEADER_SIZE);
@@ -1056,7 +1187,11 @@ ccid_send_data_block_gr (struct ccid *c, size_t chunk_len)
 
   c->p += chunk_len;
   c->len -= chunk_len;
-  usb_lld_tx_enable (c->epi->ep_num, tx_size);
+#ifdef GNU_LINUX_EMULATION
+  usb_lld_tx_enable_buf (ENDP1, endp1_tx_buf, tx_size);
+#else
+  usb_lld_tx_enable (ENDP1, tx_size);
+#endif
 #ifdef DEBUG_MORE
   DEBUG_INFO ("DATA\r\n");
 #endif
@@ -1088,13 +1223,23 @@ ccid_send_params (struct ccid *c)
   p[CCID_MSG_ERROR_OFFSET] = 0;
   p[CCID_MSG_CHAIN_OFFSET] = 0x01;  /* ProtocolNum: T=1 */
 
-  usb_lld_txcpy (p, c->epi->ep_num, 0, CCID_MSG_HEADER_SIZE);
-  usb_lld_txcpy (params, c->epi->ep_num, CCID_MSG_HEADER_SIZE, sizeof params);
+#ifdef GNU_LINUX_EMULATION
+  memcpy (endp1_tx_buf, p, CCID_MSG_HEADER_SIZE);
+  memcpy (endp1_tx_buf+CCID_MSG_HEADER_SIZE, params, sizeof params);
+#else
+  usb_lld_txcpy (p, ENDP1, 0, CCID_MSG_HEADER_SIZE);
+  usb_lld_txcpy (params, ENDP1, CCID_MSG_HEADER_SIZE, sizeof params);
+#endif
 
   /* This is a single packet Bulk-IN transaction */
   c->epi->buf = NULL;
   c->epi->tx_done = 1;
-  usb_lld_tx_enable (c->epi->ep_num, CCID_MSG_HEADER_SIZE + sizeof params);
+#ifdef GNU_LINUX_EMULATION
+  usb_lld_tx_enable_buf (ENDP1, endp1_tx_buf,
+                        CCID_MSG_HEADER_SIZE + sizeof params);
+#else
+  usb_lld_tx_enable (ENDP1, CCID_MSG_HEADER_SIZE + sizeof params);
+#endif
 #ifdef DEBUG_MORE
   DEBUG_INFO ("PARAMS\r\n");
 #endif
@@ -1361,6 +1506,9 @@ ccid_usb_reset (int full)
                    full ? EV_USB_DEVICE_RESET : EV_USB_SET_INTERFACE);
 }
 
+#ifdef GNU_LINUX_EMULATION
+static uint8_t endp2_tx_buf[2];
+#endif
 
 #define NOTIFY_SLOT_CHANGE 0x50
 static void
@@ -1376,7 +1524,12 @@ ccid_notify_slot_change (struct ccid *c)
 
   notification[0] = NOTIFY_SLOT_CHANGE;
   notification[1] = msg;
+#ifdef GNU_LINUX_EMULATION
+  memcpy (endp2_tx_buf, notification, sizeof notification);
+  usb_lld_tx_enable_buf (ENDP2, endp2_tx_buf, sizeof notification);
+#else
   usb_lld_write (ENDP2, notification, sizeof notification);
+#endif
   led_blink (LED_TWOSHOTS);
 }
 
@@ -1512,8 +1665,8 @@ ccid_thread (void *arg)
     struct ep_out *epo = &endpoint_out;
     struct apdu *a = &apdu;
 
-    epi_init (epi, ENDP1, c);
-    epo_init (epo, ENDP1, c);
+    epi_init (epi, c);
+    epo_init (epo, c);
     apdu_init (a);
     ccid_init (c, epi, epo, a);
   }
@@ -1668,6 +1821,7 @@ stdout_init (void)
   stdout.connected = 0;
 }
 
+
 void
 _write (const char *s, int len)
 {
@@ -1689,7 +1843,11 @@ _write (const char *s, int len)
        (len < VIRTUAL_COM_PORT_DATA_SIZE) ? len : VIRTUAL_COM_PORT_DATA_SIZE;
 
       chopstx_mutex_lock (&stdout.m_dev);
+#ifdef GNU_LINUX_EMULATION
+      usb_lld_tx_enable_buf (ENDP3, s, packet_len);
+#else
       usb_lld_write (ENDP3, s, packet_len);
+#endif
       chopstx_cond_wait (&stdout.cond_dev, &stdout.m_dev);
       chopstx_mutex_unlock (&stdout.m_dev);
 
index b4815d3..e9335b7 100644 (file)
@@ -211,7 +211,7 @@ usb_device_reset (struct usb_dev *dev)
   usb_lld_setup_endp (dev, ENDP0, 1, 1);
 #else
   usb_lld_setup_endpoint (ENDP0, EP_CONTROL, 0, ENDP0_RXADDR, ENDP0_TXADDR,
-                         GNUK_MAX_PACKET_SIZE);
+                         64);
 #endif
 
   /* Stop the interface */