mirror of
https://github.com/team-infusion-developers/android_kernel_samsung_msm8976.git
synced 2024-11-01 02:21:16 +00:00
a9f74be33f
This module implements a bridge driver which allows user space to communicate with USB smart card devices. This module provides /dev/ccid_bridge device file which allows read/write/ioctl methods. The ioctls facilitate control and interrupt transfers. The bulk transfers are implemented via read and write. The interrupt endpoint is optional and not all devices may support it. Change-Id: I67ac7c7d15fb65c8f6a2cc9f9c81343da074aab7 Signed-off-by: Pavankumar Kondeti <pkondeti@codeaurora.org>
161 lines
6.6 KiB
Text
161 lines
6.6 KiB
Text
Introduction
|
|
============
|
|
|
|
This feature requires supporting Mass Storage and Integrated Circuit Card
|
|
interfaces exposed by the UICC (Universal Integrated Circuit Card) device.
|
|
The MSM acts as a USB host and UICC acts as a peripheral. The UICC device
|
|
that is used here is also referred to as Mega-SIM. This feature will be
|
|
supported on MSM8x26.
|
|
|
|
Hardware description
|
|
====================
|
|
|
|
The USB3503 HSIC (High Speed Inter Chip) hub's down stream port is modified
|
|
to support Inter-Chip USB for connecting the UICC device. The USB3503 is
|
|
connected to MSM via HSIC interface. The UICC device operates in Full Speed
|
|
mode.
|
|
|
|
The UICC device will support CCID (Integrated Circuit Card interface Device)
|
|
specification. This interface supports 1 Bulk In, 1 Bulk Out and 1 Interrupt
|
|
endpoint. The Interrupt endpoint is used by the device to send asynchronous
|
|
notifications like card insertion/removal and hardware error events.
|
|
The Bulk endpoints are used for the data communication.
|
|
|
|
The UICC device will support the Mass Storage Bulk Only 1.0 specification.
|
|
It supports SCSI Transparent subclass '06', corresponding to support of the
|
|
SCSI Primary Command set. It implements SCSI Peripheral Device Type '00'
|
|
(TYPE_DISK) corresponding to a direct access SCSI block device.
|
|
|
|
Software description
|
|
====================
|
|
|
|
The MSM HSIC controller driver(drivers/usb/host/ehci-msm-hsic.c) takes care
|
|
of HSIC PHY and link management. The USB3503 HSIC hub is managed by the SMSC
|
|
hub driver(drivers/misc/smsc_hubc.c). Both these drivers are well tested on
|
|
APQ8074 dragon board and are re-used to support this feature.
|
|
|
|
The mass storage interface is managed by the standard Linux USB storage driver.
|
|
This driver interfaces with SCSI and block layers to export the disk to
|
|
user space.
|
|
|
|
A new USB driver is implemented to manage the CCID interface. This driver is
|
|
referred to as USB CCID driver in this document. This driver is implemented
|
|
as a pass-through module and provides the character device interface to
|
|
user space. The CCID specification is implemented in the user space.
|
|
|
|
The CCID command and responses are exchanged over the Bulk endpoints. The
|
|
user space application uses write() and read() calls to send commands and
|
|
receive responses.
|
|
|
|
The CCID class specific requests are sent over the control endpoint. As
|
|
control requests have a specific format, ioctls are implemented.
|
|
|
|
The UICC device sends asynchronous notifications over the interrupt endpoint.
|
|
The card insertion/removal and hardware error events are sent to user space
|
|
via an ioctl().
|
|
|
|
Design Goals:
|
|
============
|
|
|
|
1. Re-use the existing services available in user space. This is achieved
|
|
by implementing the kernel USB CCID driver as a pass-through module.
|
|
|
|
2. Support runtime card insertion/removal.
|
|
|
|
3. Support runtime power management.
|
|
|
|
4. Support Multiple card configuration. More than 1 IC can be connected to
|
|
the USB UICC device.
|
|
|
|
Power Management
|
|
================
|
|
|
|
The USB core uses the runtime PM framework to auto suspend the USB devices that
|
|
are not in use. The Auto-suspend is forbidden for all devices except hub class
|
|
devices. The USB CCID driver enables auto-suspend for the UICC device.
|
|
|
|
An USB device can be suspended only when all of its interfaces are suspended.
|
|
The USB storage interface device acts as a parent device to the underlying
|
|
SCSI host, target and block devices. Runtime PM must be enabled for the
|
|
SCSI device to allow USB storage interface suspend. The SCSI device runtime
|
|
suspend and auto-suspend timeout will be configured from user space via sysfs
|
|
files.
|
|
|
|
The HSIC platform device and USB3503 HUB device will be runtime suspended
|
|
only after the USB UICC device is suspended.
|
|
|
|
SMP/multi-core
|
|
==============
|
|
|
|
The USB CCID driver does not allow multiple clients to open the device file
|
|
concurrently. -EBUSY will be returned if open() is attempted when the
|
|
file is already opened.
|
|
|
|
The write() and read() methods are implemented synchronously. If another
|
|
write() is called when a previous write() is in progress, -EBUSY is
|
|
returned. The same is applicable to read().
|
|
|
|
Mutexes will be used to prevent concurrent open(), read() and write() access.
|
|
|
|
Interface
|
|
=========
|
|
|
|
A character device file (/dev/ccid_bridge) will be exposed by the USB CCID
|
|
driver. open(), read(), write(), ioctl() and close() methods are implemented.
|
|
This device node is accessible only to the root by default. User space init
|
|
or udev scripts should change the permissions of this device file if it needs
|
|
to be accessed by non-root applications.
|
|
|
|
open(): The open() is blocked until the UICC device is detected and the CCID
|
|
interface probe is completed. Returns the appropriate error code in case of
|
|
failure.
|
|
|
|
read(): An URB is submitted on the Bulk In endpoint. The read() is blocked
|
|
until the URB is completed and the data is copied to the user space buffer
|
|
upon success. An appropriate error code is returned in case of failure.
|
|
-ENODEV must be treated as a serious error and no further I/O will be
|
|
attempted.
|
|
|
|
write(): An URB is submitted on the Bulk Out endpoint. The write() is blocked
|
|
until the URB is completed. An appropriate error code is returned in case of
|
|
failure. -ENODEV must be treated as a serious error and no further I/O will be
|
|
attempted.
|
|
|
|
ioctl(): The ioctl() method is required for facilitating Control transfers and
|
|
Interrupt transfers.
|
|
|
|
USB_CCID_GET_CLASS_DESC: This read-only ioctl returns the smart card class
|
|
descriptor as described in the 5.1 section of USB smart card class spec.
|
|
|
|
USB_CCID_ABORT: This write-only ioctl sends A ABORT class specific request on
|
|
control endpoint. The class request details are mentioned in section 5.3.1.
|
|
|
|
USB_CCID_GET_CLOCK_FREQUENCIES: This read and write ioctl returns the clock
|
|
frequencies supported by the CCID device. A GET_CLOCK_FREQUENCIES class request
|
|
is sent on the control endpoint. The class request details are mentioned in
|
|
section 5.3.2.
|
|
|
|
USB_CCID_GET_DATA_RATES: This read and write ioctl returns the data rates
|
|
supported by the CCID device. A GET_DATA_RATES class request is sent on the
|
|
control endpoint. The class request details are mentioned in section 5.3.3.
|
|
|
|
USB_CCID_GET_EVENT: This read-only ioctl returns the asynchronous event sent
|
|
by the UICC device. The ioctl() is blocked until such event is received from
|
|
the UICC device. This ioctl() returns -ENOENT error code when the device
|
|
does not have an interrupt endpoint and does not support remote wakeup
|
|
capability.
|
|
|
|
close(): Cancels any ongoing I/O before it returns.
|
|
|
|
Config options
|
|
==============
|
|
|
|
Turn on USB_EHCI_MSM_HSIC, USB_HSIC_SMSC_HUB and USB_CCID_BRIDGE configs to
|
|
enable this feature.
|
|
|
|
References
|
|
==========
|
|
|
|
Specification for Integrated Circuit(s) Cards Interface Devices
|
|
|
|
Smart Cards; UICC-Terminal interface; Physical and logical characteristics
|