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" 14*db1015e9SEduardo Habkost #include "qom/object.h" 1547b43a1fSPaolo Bonzini 1647b43a1fSPaolo Bonzini typedef struct CCIDCardState CCIDCardState; 1747b43a1fSPaolo Bonzini typedef struct CCIDCardInfo CCIDCardInfo; 1847b43a1fSPaolo Bonzini 1947b43a1fSPaolo Bonzini #define TYPE_CCID_CARD "ccid-card" 20*db1015e9SEduardo Habkost typedef struct CCIDCardClass CCIDCardClass; 2147b43a1fSPaolo Bonzini #define CCID_CARD(obj) \ 2247b43a1fSPaolo Bonzini OBJECT_CHECK(CCIDCardState, (obj), TYPE_CCID_CARD) 2347b43a1fSPaolo Bonzini #define CCID_CARD_CLASS(klass) \ 2447b43a1fSPaolo Bonzini OBJECT_CLASS_CHECK(CCIDCardClass, (klass), TYPE_CCID_CARD) 2547b43a1fSPaolo Bonzini #define CCID_CARD_GET_CLASS(obj) \ 2647b43a1fSPaolo Bonzini OBJECT_GET_CLASS(CCIDCardClass, (obj), TYPE_CCID_CARD) 2747b43a1fSPaolo Bonzini 2847b43a1fSPaolo Bonzini /* 2947b43a1fSPaolo Bonzini * callbacks to be used by the CCID device (hw/usb-ccid.c) to call 3047b43a1fSPaolo Bonzini * into the smartcard device (hw/ccid-card-*.c) 3147b43a1fSPaolo Bonzini */ 32*db1015e9SEduardo Habkost struct CCIDCardClass { 3380ae8654SPhilippe Mathieu-Daudé /*< private >*/ 3447b43a1fSPaolo Bonzini DeviceClass parent_class; 3580ae8654SPhilippe Mathieu-Daudé /*< public >*/ 3647b43a1fSPaolo Bonzini const uint8_t *(*get_atr)(CCIDCardState *card, uint32_t *len); 3747b43a1fSPaolo Bonzini void (*apdu_from_guest)(CCIDCardState *card, 3847b43a1fSPaolo Bonzini const uint8_t *apdu, 3947b43a1fSPaolo Bonzini uint32_t len); 40cc847bfdSMao Zhongyi void (*realize)(CCIDCardState *card, Error **errp); 41b69c3c21SMarkus Armbruster void (*unrealize)(CCIDCardState *card); 42*db1015e9SEduardo Habkost }; 4347b43a1fSPaolo Bonzini 4447b43a1fSPaolo Bonzini /* 4547b43a1fSPaolo Bonzini * state of the CCID Card device (i.e. hw/ccid-card-*.c) 4647b43a1fSPaolo Bonzini */ 4747b43a1fSPaolo Bonzini struct CCIDCardState { 4847b43a1fSPaolo Bonzini DeviceState qdev; 4947b43a1fSPaolo Bonzini uint32_t slot; /* For future use with multiple slot reader. */ 5047b43a1fSPaolo Bonzini }; 5147b43a1fSPaolo Bonzini 5247b43a1fSPaolo Bonzini /* 5347b43a1fSPaolo Bonzini * API for smartcard calling the CCID device (used by hw/ccid-card-*.c) 5447b43a1fSPaolo Bonzini */ 5547b43a1fSPaolo Bonzini void ccid_card_send_apdu_to_guest(CCIDCardState *card, 5647b43a1fSPaolo Bonzini uint8_t *apdu, 5747b43a1fSPaolo Bonzini uint32_t len); 5847b43a1fSPaolo Bonzini void ccid_card_card_removed(CCIDCardState *card); 5947b43a1fSPaolo Bonzini void ccid_card_card_inserted(CCIDCardState *card); 6047b43a1fSPaolo Bonzini void ccid_card_card_error(CCIDCardState *card, uint64_t error); 6147b43a1fSPaolo Bonzini 6247b43a1fSPaolo Bonzini /* 6347b43a1fSPaolo Bonzini * support guest visible insertion/removal of ccid devices based on actual 6447b43a1fSPaolo Bonzini * devices connected/removed. Called by card implementation (passthru, local) 6547b43a1fSPaolo Bonzini */ 6647b43a1fSPaolo Bonzini int ccid_card_ccid_attach(CCIDCardState *card); 6747b43a1fSPaolo Bonzini void ccid_card_ccid_detach(CCIDCardState *card); 6847b43a1fSPaolo Bonzini 6947b43a1fSPaolo Bonzini #endif /* CCID_H */ 70