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" 14db1015e9SEduardo Habkost #include "qom/object.h" 1547b43a1fSPaolo Bonzini 1647b43a1fSPaolo Bonzini typedef struct CCIDCardInfo CCIDCardInfo; 1747b43a1fSPaolo Bonzini 1847b43a1fSPaolo Bonzini #define TYPE_CCID_CARD "ccid-card" 19*a489d195SEduardo Habkost OBJECT_DECLARE_TYPE(CCIDCardState, CCIDCardClass, CCID_CARD) 2047b43a1fSPaolo Bonzini 2147b43a1fSPaolo Bonzini /* 2247b43a1fSPaolo Bonzini * callbacks to be used by the CCID device (hw/usb-ccid.c) to call 2347b43a1fSPaolo Bonzini * into the smartcard device (hw/ccid-card-*.c) 2447b43a1fSPaolo Bonzini */ 25db1015e9SEduardo Habkost struct CCIDCardClass { 2680ae8654SPhilippe Mathieu-Daudé /*< private >*/ 2747b43a1fSPaolo Bonzini DeviceClass parent_class; 2880ae8654SPhilippe Mathieu-Daudé /*< public >*/ 2947b43a1fSPaolo Bonzini const uint8_t *(*get_atr)(CCIDCardState *card, uint32_t *len); 3047b43a1fSPaolo Bonzini void (*apdu_from_guest)(CCIDCardState *card, 3147b43a1fSPaolo Bonzini const uint8_t *apdu, 3247b43a1fSPaolo Bonzini uint32_t len); 33cc847bfdSMao Zhongyi void (*realize)(CCIDCardState *card, Error **errp); 34b69c3c21SMarkus Armbruster void (*unrealize)(CCIDCardState *card); 35db1015e9SEduardo Habkost }; 3647b43a1fSPaolo Bonzini 3747b43a1fSPaolo Bonzini /* 3847b43a1fSPaolo Bonzini * state of the CCID Card device (i.e. hw/ccid-card-*.c) 3947b43a1fSPaolo Bonzini */ 4047b43a1fSPaolo Bonzini struct CCIDCardState { 4147b43a1fSPaolo Bonzini DeviceState qdev; 4247b43a1fSPaolo Bonzini uint32_t slot; /* For future use with multiple slot reader. */ 4347b43a1fSPaolo Bonzini }; 4447b43a1fSPaolo Bonzini 4547b43a1fSPaolo Bonzini /* 4647b43a1fSPaolo Bonzini * API for smartcard calling the CCID device (used by hw/ccid-card-*.c) 4747b43a1fSPaolo Bonzini */ 4847b43a1fSPaolo Bonzini void ccid_card_send_apdu_to_guest(CCIDCardState *card, 4947b43a1fSPaolo Bonzini uint8_t *apdu, 5047b43a1fSPaolo Bonzini uint32_t len); 5147b43a1fSPaolo Bonzini void ccid_card_card_removed(CCIDCardState *card); 5247b43a1fSPaolo Bonzini void ccid_card_card_inserted(CCIDCardState *card); 5347b43a1fSPaolo Bonzini void ccid_card_card_error(CCIDCardState *card, uint64_t error); 5447b43a1fSPaolo Bonzini 5547b43a1fSPaolo Bonzini /* 5647b43a1fSPaolo Bonzini * support guest visible insertion/removal of ccid devices based on actual 5747b43a1fSPaolo Bonzini * devices connected/removed. Called by card implementation (passthru, local) 5847b43a1fSPaolo Bonzini */ 5947b43a1fSPaolo Bonzini int ccid_card_ccid_attach(CCIDCardState *card); 6047b43a1fSPaolo Bonzini void ccid_card_ccid_detach(CCIDCardState *card); 6147b43a1fSPaolo Bonzini 6247b43a1fSPaolo Bonzini #endif /* CCID_H */ 63