mirror of https://gitee.com/openkylin/qemu.git
dev-smartcard-reader: define structs for CCID_Parameter internals
Signed-off-by: Alon Levy <alevy@redhat.com> Reviewed-by: Marc-André Lureau <mlureau@redhat.com>
This commit is contained in:
parent
b16352acf3
commit
4942d6c394
|
@ -189,10 +189,34 @@ typedef struct QEMU_PACKED CCID_SlotStatus {
|
||||||
uint8_t bClockStatus;
|
uint8_t bClockStatus;
|
||||||
} CCID_SlotStatus;
|
} CCID_SlotStatus;
|
||||||
|
|
||||||
|
typedef struct QEMU_PACKED CCID_T0ProtocolDataStructure {
|
||||||
|
uint8_t bmFindexDindex;
|
||||||
|
uint8_t bmTCCKST0;
|
||||||
|
uint8_t bGuardTimeT0;
|
||||||
|
uint8_t bWaitingIntegerT0;
|
||||||
|
uint8_t bClockStop;
|
||||||
|
} CCID_T0ProtocolDataStructure;
|
||||||
|
|
||||||
|
typedef struct QEMU_PACKED CCID_T1ProtocolDataStructure {
|
||||||
|
uint8_t bmFindexDindex;
|
||||||
|
uint8_t bmTCCKST1;
|
||||||
|
uint8_t bGuardTimeT1;
|
||||||
|
uint8_t bWaitingIntegerT1;
|
||||||
|
uint8_t bClockStop;
|
||||||
|
uint8_t bIFSC;
|
||||||
|
uint8_t bNadValue;
|
||||||
|
} CCID_T1ProtocolDataStructure;
|
||||||
|
|
||||||
|
typedef union CCID_ProtocolDataStructure {
|
||||||
|
CCID_T0ProtocolDataStructure t0;
|
||||||
|
CCID_T1ProtocolDataStructure t1;
|
||||||
|
uint8_t data[7]; /* must be = max(sizeof(t0), sizeof(t1)) */
|
||||||
|
} CCID_ProtocolDataStructure;
|
||||||
|
|
||||||
typedef struct QEMU_PACKED CCID_Parameter {
|
typedef struct QEMU_PACKED CCID_Parameter {
|
||||||
CCID_BULK_IN b;
|
CCID_BULK_IN b;
|
||||||
uint8_t bProtocolNum;
|
uint8_t bProtocolNum;
|
||||||
uint8_t abProtocolDataStructure[0];
|
CCID_ProtocolDataStructure abProtocolDataStructure;
|
||||||
} CCID_Parameter;
|
} CCID_Parameter;
|
||||||
|
|
||||||
typedef struct QEMU_PACKED CCID_DataBlock {
|
typedef struct QEMU_PACKED CCID_DataBlock {
|
||||||
|
@ -224,7 +248,7 @@ typedef struct QEMU_PACKED CCID_SetParameters {
|
||||||
CCID_Header hdr;
|
CCID_Header hdr;
|
||||||
uint8_t bProtocolNum;
|
uint8_t bProtocolNum;
|
||||||
uint16_t abRFU;
|
uint16_t abRFU;
|
||||||
uint8_t abProtocolDataStructure[0];
|
CCID_ProtocolDataStructure abProtocolDataStructure;
|
||||||
} CCID_SetParameters;
|
} CCID_SetParameters;
|
||||||
|
|
||||||
typedef struct CCID_Notify_Slot_Change {
|
typedef struct CCID_Notify_Slot_Change {
|
||||||
|
@ -254,8 +278,6 @@ typedef struct CCIDBus {
|
||||||
BusState qbus;
|
BusState qbus;
|
||||||
} CCIDBus;
|
} CCIDBus;
|
||||||
|
|
||||||
#define MAX_PROTOCOL_SIZE 7
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* powered - defaults to true, changed by PowerOn/PowerOff messages
|
* powered - defaults to true, changed by PowerOn/PowerOff messages
|
||||||
*/
|
*/
|
||||||
|
@ -279,7 +301,7 @@ typedef struct USBCCIDState {
|
||||||
uint8_t bError;
|
uint8_t bError;
|
||||||
uint8_t bmCommandStatus;
|
uint8_t bmCommandStatus;
|
||||||
uint8_t bProtocolNum;
|
uint8_t bProtocolNum;
|
||||||
uint8_t abProtocolDataStructure[MAX_PROTOCOL_SIZE];
|
CCID_ProtocolDataStructure abProtocolDataStructure;
|
||||||
uint32_t ulProtocolDataStructureSize;
|
uint32_t ulProtocolDataStructureSize;
|
||||||
uint32_t state_vmstate;
|
uint32_t state_vmstate;
|
||||||
uint32_t migration_target_ip;
|
uint32_t migration_target_ip;
|
||||||
|
@ -765,7 +787,7 @@ static void ccid_write_parameters(USBCCIDState *s, CCID_Header *recv)
|
||||||
h->b.bStatus = ccid_calc_status(s);
|
h->b.bStatus = ccid_calc_status(s);
|
||||||
h->b.bError = s->bError;
|
h->b.bError = s->bError;
|
||||||
h->bProtocolNum = s->bProtocolNum;
|
h->bProtocolNum = s->bProtocolNum;
|
||||||
memcpy(h->abProtocolDataStructure, s->abProtocolDataStructure, len);
|
h->abProtocolDataStructure = s->abProtocolDataStructure;
|
||||||
ccid_reset_error_status(s);
|
ccid_reset_error_status(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -825,38 +847,36 @@ static void ccid_write_data_block_atr(USBCCIDState *s, CCID_Header *recv)
|
||||||
static void ccid_set_parameters(USBCCIDState *s, CCID_Header *recv)
|
static void ccid_set_parameters(USBCCIDState *s, CCID_Header *recv)
|
||||||
{
|
{
|
||||||
CCID_SetParameters *ph = (CCID_SetParameters *) recv;
|
CCID_SetParameters *ph = (CCID_SetParameters *) recv;
|
||||||
uint32_t len = 0;
|
uint32_t protocol_num = ph->bProtocolNum & 3;
|
||||||
if ((ph->bProtocolNum & 3) == 0) {
|
|
||||||
len = 5;
|
if (protocol_num != 0 && protocol_num != 1) {
|
||||||
}
|
ccid_report_error_failed(s, ERROR_CMD_NOT_SUPPORTED);
|
||||||
if ((ph->bProtocolNum & 3) == 1) {
|
|
||||||
len = 7;
|
|
||||||
}
|
|
||||||
if (len == 0) {
|
|
||||||
s->bmCommandStatus = COMMAND_STATUS_FAILED;
|
|
||||||
s->bError = 7; /* Protocol invalid or not supported */
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
s->bProtocolNum = ph->bProtocolNum;
|
s->bProtocolNum = protocol_num;
|
||||||
memcpy(s->abProtocolDataStructure, ph->abProtocolDataStructure, len);
|
s->abProtocolDataStructure = ph->abProtocolDataStructure;
|
||||||
s->ulProtocolDataStructureSize = len;
|
|
||||||
DPRINTF(s, 1, "%s: using len %d\n", __func__, len);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* must be 5 bytes for T=0, 7 bytes for T=1
|
* must be 5 bytes for T=0, 7 bytes for T=1
|
||||||
* See page 52
|
* See page 52
|
||||||
*/
|
*/
|
||||||
static const uint8_t abDefaultProtocolDataStructure[7] = {
|
static const CCID_ProtocolDataStructure defaultProtocolDataStructure = {
|
||||||
0x77, 0x00, 0x00, 0x00, 0x00, 0xfe /*IFSC*/, 0x00 /*NAD*/ };
|
.t1 = {
|
||||||
|
.bmFindexDindex = 0x77,
|
||||||
|
.bmTCCKST1 = 0x00,
|
||||||
|
.bGuardTimeT1 = 0x00,
|
||||||
|
.bWaitingIntegerT1 = 0x00,
|
||||||
|
.bClockStop = 0x00,
|
||||||
|
.bIFSC = 0xfe,
|
||||||
|
.bNadValue = 0x00,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
static void ccid_reset_parameters(USBCCIDState *s)
|
static void ccid_reset_parameters(USBCCIDState *s)
|
||||||
{
|
{
|
||||||
uint32_t len = sizeof(abDefaultProtocolDataStructure);
|
|
||||||
|
|
||||||
s->bProtocolNum = 1; /* T=1 */
|
s->bProtocolNum = 1; /* T=1 */
|
||||||
s->ulProtocolDataStructureSize = len;
|
s->abProtocolDataStructure = defaultProtocolDataStructure;
|
||||||
memcpy(s->abProtocolDataStructure, abDefaultProtocolDataStructure, len);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* NOTE: only a single slot is supported (SLOT_0) */
|
/* NOTE: only a single slot is supported (SLOT_0) */
|
||||||
|
@ -1345,7 +1365,7 @@ static VMStateDescription ccid_vmstate = {
|
||||||
VMSTATE_UINT8(bError, USBCCIDState),
|
VMSTATE_UINT8(bError, USBCCIDState),
|
||||||
VMSTATE_UINT8(bmCommandStatus, USBCCIDState),
|
VMSTATE_UINT8(bmCommandStatus, USBCCIDState),
|
||||||
VMSTATE_UINT8(bProtocolNum, USBCCIDState),
|
VMSTATE_UINT8(bProtocolNum, USBCCIDState),
|
||||||
VMSTATE_BUFFER(abProtocolDataStructure, USBCCIDState),
|
VMSTATE_BUFFER(abProtocolDataStructure.data, USBCCIDState),
|
||||||
VMSTATE_UINT32(ulProtocolDataStructureSize, USBCCIDState),
|
VMSTATE_UINT32(ulProtocolDataStructureSize, USBCCIDState),
|
||||||
VMSTATE_STRUCT_ARRAY(bulk_in_pending, USBCCIDState,
|
VMSTATE_STRUCT_ARRAY(bulk_in_pending, USBCCIDState,
|
||||||
BULK_IN_PENDING_NUM, 1, bulk_in_vmstate, BulkIn),
|
BULK_IN_PENDING_NUM, 1, bulk_in_vmstate, BulkIn),
|
||||||
|
|
Loading…
Reference in New Issue