147b43a1fSPaolo Bonzini /* 247b43a1fSPaolo Bonzini * CCID Passthru Card Device emulation 347b43a1fSPaolo Bonzini * 447b43a1fSPaolo Bonzini * Copyright (c) 2011 Red Hat. 547b43a1fSPaolo Bonzini * Written by Alon Levy. 647b43a1fSPaolo Bonzini * 747b43a1fSPaolo Bonzini * This code is licensed under the GNU LGPL, version 2 or later. 847b43a1fSPaolo Bonzini */ 947b43a1fSPaolo Bonzini 1047b43a1fSPaolo Bonzini #ifndef CCID_H 1147b43a1fSPaolo Bonzini #define CCID_H 1247b43a1fSPaolo Bonzini 13a27bd6c7SMarkus Armbruster #include "hw/qdev-core.h" 1447b43a1fSPaolo Bonzini 1547b43a1fSPaolo Bonzini typedef struct CCIDCardState CCIDCardState; 1647b43a1fSPaolo Bonzini typedef struct CCIDCardInfo CCIDCardInfo; 1747b43a1fSPaolo Bonzini 1847b43a1fSPaolo Bonzini #define TYPE_CCID_CARD "ccid-card" 1947b43a1fSPaolo Bonzini #define CCID_CARD(obj) \ 2047b43a1fSPaolo Bonzini OBJECT_CHECK(CCIDCardState, (obj), TYPE_CCID_CARD) 2147b43a1fSPaolo Bonzini #define CCID_CARD_CLASS(klass) \ 2247b43a1fSPaolo Bonzini OBJECT_CLASS_CHECK(CCIDCardClass, (klass), TYPE_CCID_CARD) 2347b43a1fSPaolo Bonzini #define CCID_CARD_GET_CLASS(obj) \ 2447b43a1fSPaolo Bonzini OBJECT_GET_CLASS(CCIDCardClass, (obj), TYPE_CCID_CARD) 2547b43a1fSPaolo Bonzini 2647b43a1fSPaolo Bonzini /* 2747b43a1fSPaolo Bonzini * callbacks to be used by the CCID device (hw/usb-ccid.c) to call 2847b43a1fSPaolo Bonzini * into the smartcard device (hw/ccid-card-*.c) 2947b43a1fSPaolo Bonzini */ 3047b43a1fSPaolo Bonzini typedef struct CCIDCardClass { 3180ae8654SPhilippe Mathieu-Daudé /*< private >*/ 3247b43a1fSPaolo Bonzini DeviceClass parent_class; 3380ae8654SPhilippe Mathieu-Daudé /*< public >*/ 3447b43a1fSPaolo Bonzini const uint8_t *(*get_atr)(CCIDCardState *card, uint32_t *len); 3547b43a1fSPaolo Bonzini void (*apdu_from_guest)(CCIDCardState *card, 3647b43a1fSPaolo Bonzini const uint8_t *apdu, 3747b43a1fSPaolo Bonzini uint32_t len); 38cc847bfdSMao Zhongyi void (*realize)(CCIDCardState *card, Error **errp); 39*b69c3c21SMarkus Armbruster void (*unrealize)(CCIDCardState *card); 4047b43a1fSPaolo Bonzini } CCIDCardClass; 4147b43a1fSPaolo Bonzini 4247b43a1fSPaolo Bonzini /* 4347b43a1fSPaolo Bonzini * state of the CCID Card device (i.e. hw/ccid-card-*.c) 4447b43a1fSPaolo Bonzini */ 4547b43a1fSPaolo Bonzini struct CCIDCardState { 4647b43a1fSPaolo Bonzini DeviceState qdev; 4747b43a1fSPaolo Bonzini uint32_t slot; /* For future use with multiple slot reader. */ 4847b43a1fSPaolo Bonzini }; 4947b43a1fSPaolo Bonzini 5047b43a1fSPaolo Bonzini /* 5147b43a1fSPaolo Bonzini * API for smartcard calling the CCID device (used by hw/ccid-card-*.c) 5247b43a1fSPaolo Bonzini */ 5347b43a1fSPaolo Bonzini void ccid_card_send_apdu_to_guest(CCIDCardState *card, 5447b43a1fSPaolo Bonzini uint8_t *apdu, 5547b43a1fSPaolo Bonzini uint32_t len); 5647b43a1fSPaolo Bonzini void ccid_card_card_removed(CCIDCardState *card); 5747b43a1fSPaolo Bonzini void ccid_card_card_inserted(CCIDCardState *card); 5847b43a1fSPaolo Bonzini void ccid_card_card_error(CCIDCardState *card, uint64_t error); 5947b43a1fSPaolo Bonzini 6047b43a1fSPaolo Bonzini /* 6147b43a1fSPaolo Bonzini * support guest visible insertion/removal of ccid devices based on actual 6247b43a1fSPaolo Bonzini * devices connected/removed. Called by card implementation (passthru, local) 6347b43a1fSPaolo Bonzini */ 6447b43a1fSPaolo Bonzini int ccid_card_ccid_attach(CCIDCardState *card); 6547b43a1fSPaolo Bonzini void ccid_card_ccid_detach(CCIDCardState *card); 6647b43a1fSPaolo Bonzini 6747b43a1fSPaolo Bonzini #endif /* CCID_H */ 68