162 lines
6.6 KiB
Plaintext
162 lines
6.6 KiB
Plaintext
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
|