aboutsummaryrefslogtreecommitdiffstats
path: root/ccid/ccid_main_functionfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'ccid/ccid_main_functionfs.c')
-rw-r--r--ccid/ccid_main_functionfs.c54
1 files changed, 45 insertions, 9 deletions
diff --git a/ccid/ccid_main_functionfs.c b/ccid/ccid_main_functionfs.c
index 62bc402..81cf225 100644
--- a/ccid/ccid_main_functionfs.c
+++ b/ccid/ccid_main_functionfs.c
@@ -24,6 +24,14 @@
* Actual USB CCID Descriptors
***********************************************************************/
+static uint32_t clock_freqs[] = {
+ 2500000
+};
+
+static uint32_t data_rates[] = {
+ 9600
+};
+
static const struct {
struct usb_functionfs_descs_head_v2 header;
__le32 fs_count;
@@ -56,12 +64,12 @@ static const struct {
.bMaxSlotIndex = 7,
.bVoltageSupport = 0x07, /* 5/3/1.8V */
.dwProtocols = cpu_to_le32(1), /* T=0 only */
- .dwDefaultClock = cpu_to_le32(5000),
- .dwMaximumClock = cpu_to_le32(20000),
- .bNumClockSupported = 0,
+ .dwDefaultClock = cpu_to_le32(2500000),
+ .dwMaximumClock = cpu_to_le32(20000000),
+ .bNumClockSupported = ARRAY_SIZE(clock_freqs),
.dwDataRate = cpu_to_le32(9600),
.dwMaxDataRate = cpu_to_le32(921600),
- .bNumDataRatesSupported = 0,
+ .bNumDataRatesSupported = ARRAY_SIZE(data_rates),
.dwMaxIFSD = cpu_to_le32(0),
.dwSynchProtocols = cpu_to_le32(0),
.dwMechanical = cpu_to_le32(0),
@@ -167,6 +175,8 @@ struct ufunc_handle {
struct ccid_instance *ccid_handle;
};
+static struct ccid_instance g_ci;
+
static int ep_int_cb(struct osmo_fd *ofd, unsigned int what)
{
LOGP(DUSB, LOGL_DEBUG, "%s\n", __func__);
@@ -212,12 +222,38 @@ const struct value_string ffs_evt_type_names[] = {
{ 0, NULL }
};
-static void handle_setup(const struct usb_ctrlrequest *setup)
+static void handle_setup(int fd, const struct usb_ctrlrequest *setup)
{
+ const uint8_t *data_in = NULL;
+ int rc;
+
LOGP(DUSB, LOGL_NOTICE, "EP0 SETUP bRequestType=0x%02x, bRequest=0x%02x wValue=0x%04x, "
"wIndex=0x%04x, wLength=%u\n", setup->bRequestType, setup->bRequest,
le16_to_cpu(setup->wValue), le16_to_cpu(setup->wIndex), le16_to_cpu(setup->wLength));
+
/* FIXME: Handle control transfer */
+ rc = ccid_handle_ctrl(&g_ci, (const uint8_t *) setup, &data_in);
+ switch (rc) {
+ case CCID_CTRL_RET_INVALID:
+ if (setup->bRequestType & USB_DIR_IN)
+ read(fd, NULL, 0); /* cause stall */
+ else
+ write(fd, NULL, 0); /* cause stall */
+ break;
+ case CCID_CTRL_RET_UNKNOWN:
+ /* FIXME: is this correct behavior? */
+ if (setup->bRequestType & USB_DIR_IN)
+ write(fd, NULL, 0); /* send ZLP */
+ else
+ read(fd, NULL, 0);
+ break;
+ case CCID_CTRL_RET_OK:
+ if (setup->bRequestType & USB_DIR_IN)
+ write(fd, data_in, le16_to_cpu(setup->wLength));
+ else
+ read(fd, NULL, 0); /* FIXME: control OUT? */
+ break;
+ }
}
static void aio_refill_out(struct ufunc_handle *uh);
@@ -238,7 +274,7 @@ static int ep_0_cb(struct osmo_fd *ofd, unsigned int what)
aio_refill_out(uh);
break;
case FUNCTIONFS_SETUP:
- handle_setup(&evt.u.setup);
+ handle_setup(ofd->fd, &evt.u.setup);
break;
}
@@ -501,7 +537,6 @@ static void signal_handler(int signal)
int main(int argc, char **argv)
{
struct ufunc_handle ufh = (struct ufunc_handle) { 0, };
- struct ccid_instance ci = (struct ccid_instance) { 0, };
int rc;
tall_main_ctx = talloc_named_const(NULL, 0, "ccid_main_functionfs");
@@ -510,8 +545,9 @@ int main(int argc, char **argv)
signal(SIGUSR1, &signal_handler);
- ccid_instance_init(&ci, &c_ops, &slotsim_slot_ops, "", &ufh);
- ufh.ccid_handle = &ci;
+ ccid_instance_init(&g_ci, &c_ops, &slotsim_slot_ops, &descriptors.fs_descs.ccid,
+ data_rates, clock_freqs, "", &ufh);
+ ufh.ccid_handle = &g_ci;
if (argc < 2) {
fprintf(stderr, "You have to specify the mount-path of the functionfs\n");