From 7b1ea003073a4ecab36e8435c4d72e344d4c9d9c Mon Sep 17 00:00:00 2001 From: NIIBE Yutaka Date: Fri, 29 Sep 2017 21:06:15 +0900 Subject: [PATCH] More fix for USB. --- ChangeLog | 11 ++- src/usb-ccid.c | 242 ++++++++++++++++++++++++++++++++++++++++--------- src/usb_ctrl.c | 2 +- 3 files changed, 211 insertions(+), 44 deletions(-) diff --git a/ChangeLog b/ChangeLog index 446be0a..9b0cd5c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,15 @@ 2017-09-29 NIIBE Yutaka - * 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. diff --git a/src/usb-ccid.c b/src/usb-ccid.c index 62c733b..ecd7994 100644 --- a/src/usb-ccid.c +++ b/src/usb-ccid.c @@ -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 * @@ -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); diff --git a/src/usb_ctrl.c b/src/usb_ctrl.c index b4815d3..e9335b7 100644 --- a/src/usb_ctrl.c +++ b/src/usb_ctrl.c @@ -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 */