qemu/hw/usb/canokey.h
Hongren (Zenithal) Zheng d7d3491855 hw/usb: Add CanoKey Implementation
This commit added a new emulated device called CanoKey to QEMU.

CanoKey implements platform independent features in canokey-core
https://github.com/canokeys/canokey-core, and leaves the USB implementation
to the platform.

In this commit the USB part was implemented in QEMU using QEMU's USB APIs,
therefore the emulated CanoKey can communicate with the guest OS using USB.

Signed-off-by: Hongren (Zenithal) Zheng <i@zenithal.me>
Message-Id: <YoY6Mgph6f6Hc/zI@Sun>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
2022-06-14 10:34:36 +02:00

70 lines
1.9 KiB
C

/*
* CanoKey QEMU device header.
*
* Copyright (c) 2021-2022 Canokeys.org <contact@canokeys.org>
* Written by Hongren (Zenithal) Zheng <i@zenithal.me>
*
* This code is licensed under the Apache-2.0.
*/
#ifndef CANOKEY_H
#define CANOKEY_H
#include "hw/qdev-core.h"
#define TYPE_CANOKEY "canokey"
#define CANOKEY(obj) \
OBJECT_CHECK(CanoKeyState, (obj), TYPE_CANOKEY)
/*
* State of Canokey (i.e. hw/canokey.c)
*/
/* CTRL INTR BULK */
#define CANOKEY_EP_NUM 3
/* BULK/INTR IN can be up to 1352 bytes, e.g. get key info */
#define CANOKEY_EP_IN_BUFFER_SIZE 2048
/* BULK OUT can be up to 270 bytes, e.g. PIV import cert */
#define CANOKEY_EP_OUT_BUFFER_SIZE 512
typedef enum {
CANOKEY_EP_IN_WAIT,
CANOKEY_EP_IN_READY,
CANOKEY_EP_IN_STALL
} CanoKeyEPState;
typedef struct CanoKeyState {
USBDevice dev;
/* IN packets from canokey device loop */
uint8_t ep_in[CANOKEY_EP_NUM][CANOKEY_EP_IN_BUFFER_SIZE];
/*
* See canokey_emu_transmit
*
* For large INTR IN, receive multiple data from canokey device loop
* in this case ep_in_size would increase with every call
*/
uint32_t ep_in_size[CANOKEY_EP_NUM];
/*
* Used in canokey_handle_data
* for IN larger than p->iov.size, we would do multiple handle_data()
*
* The difference between ep_in_pos and ep_in_size:
* We first increase ep_in_size to fill ep_in buffer in device_loop,
* then use ep_in_pos to submit data from ep_in buffer in handle_data
*/
uint32_t ep_in_pos[CANOKEY_EP_NUM];
CanoKeyEPState ep_in_state[CANOKEY_EP_NUM];
/* OUT pointer to canokey recv buffer */
uint8_t *ep_out[CANOKEY_EP_NUM];
uint32_t ep_out_size[CANOKEY_EP_NUM];
/* For large BULK OUT, multiple write to ep_out is needed */
uint8_t ep_out_buffer[CANOKEY_EP_NUM][CANOKEY_EP_OUT_BUFFER_SIZE];
/* Properties */
char *file; /* canokey-file */
} CanoKeyState;
#endif /* CANOKEY_H */