More fix for USB.

This commit is contained in:
NIIBE Yutaka 2017-09-29 21:06:15 +09:00
parent 277be86958
commit 7b1ea00307
3 changed files with 211 additions and 44 deletions

View File

@ -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.

View 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);

View 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 */