1d7d34918SHongren (Zenithal) Zheng /* 2d7d34918SHongren (Zenithal) Zheng * CanoKey QEMU device header. 3d7d34918SHongren (Zenithal) Zheng * 4d7d34918SHongren (Zenithal) Zheng * Copyright (c) 2021-2022 Canokeys.org <contact@canokeys.org> 5d7d34918SHongren (Zenithal) Zheng * Written by Hongren (Zenithal) Zheng <i@zenithal.me> 6d7d34918SHongren (Zenithal) Zheng * 7*0e6b20b9SHongren (Zenithal) Zheng * This code is licensed under the GPL v2 or later. 8d7d34918SHongren (Zenithal) Zheng */ 9d7d34918SHongren (Zenithal) Zheng 10d7d34918SHongren (Zenithal) Zheng #ifndef CANOKEY_H 11d7d34918SHongren (Zenithal) Zheng #define CANOKEY_H 12d7d34918SHongren (Zenithal) Zheng 13d7d34918SHongren (Zenithal) Zheng #include "hw/qdev-core.h" 14d7d34918SHongren (Zenithal) Zheng 15d7d34918SHongren (Zenithal) Zheng #define TYPE_CANOKEY "canokey" 16d7d34918SHongren (Zenithal) Zheng #define CANOKEY(obj) \ 17d7d34918SHongren (Zenithal) Zheng OBJECT_CHECK(CanoKeyState, (obj), TYPE_CANOKEY) 18d7d34918SHongren (Zenithal) Zheng 19d7d34918SHongren (Zenithal) Zheng /* 20d7d34918SHongren (Zenithal) Zheng * State of Canokey (i.e. hw/canokey.c) 21d7d34918SHongren (Zenithal) Zheng */ 22d7d34918SHongren (Zenithal) Zheng 23d7d34918SHongren (Zenithal) Zheng /* CTRL INTR BULK */ 24d7d34918SHongren (Zenithal) Zheng #define CANOKEY_EP_NUM 3 25d7d34918SHongren (Zenithal) Zheng /* BULK/INTR IN can be up to 1352 bytes, e.g. get key info */ 26d7d34918SHongren (Zenithal) Zheng #define CANOKEY_EP_IN_BUFFER_SIZE 2048 27d7d34918SHongren (Zenithal) Zheng 28d7d34918SHongren (Zenithal) Zheng typedef enum { 29d7d34918SHongren (Zenithal) Zheng CANOKEY_EP_IN_WAIT, 30d7d34918SHongren (Zenithal) Zheng CANOKEY_EP_IN_READY, 31d7d34918SHongren (Zenithal) Zheng CANOKEY_EP_IN_STALL 32d7d34918SHongren (Zenithal) Zheng } CanoKeyEPState; 33d7d34918SHongren (Zenithal) Zheng 34d7d34918SHongren (Zenithal) Zheng typedef struct CanoKeyState { 35d7d34918SHongren (Zenithal) Zheng USBDevice dev; 36d7d34918SHongren (Zenithal) Zheng 37d7d34918SHongren (Zenithal) Zheng /* IN packets from canokey device loop */ 38d7d34918SHongren (Zenithal) Zheng uint8_t ep_in[CANOKEY_EP_NUM][CANOKEY_EP_IN_BUFFER_SIZE]; 39d7d34918SHongren (Zenithal) Zheng /* 40d7d34918SHongren (Zenithal) Zheng * See canokey_emu_transmit 41d7d34918SHongren (Zenithal) Zheng * 42d7d34918SHongren (Zenithal) Zheng * For large INTR IN, receive multiple data from canokey device loop 43d7d34918SHongren (Zenithal) Zheng * in this case ep_in_size would increase with every call 44d7d34918SHongren (Zenithal) Zheng */ 45d7d34918SHongren (Zenithal) Zheng uint32_t ep_in_size[CANOKEY_EP_NUM]; 46d7d34918SHongren (Zenithal) Zheng /* 47d7d34918SHongren (Zenithal) Zheng * Used in canokey_handle_data 48d7d34918SHongren (Zenithal) Zheng * for IN larger than p->iov.size, we would do multiple handle_data() 49d7d34918SHongren (Zenithal) Zheng * 50d7d34918SHongren (Zenithal) Zheng * The difference between ep_in_pos and ep_in_size: 51d7d34918SHongren (Zenithal) Zheng * We first increase ep_in_size to fill ep_in buffer in device_loop, 52d7d34918SHongren (Zenithal) Zheng * then use ep_in_pos to submit data from ep_in buffer in handle_data 53d7d34918SHongren (Zenithal) Zheng */ 54d7d34918SHongren (Zenithal) Zheng uint32_t ep_in_pos[CANOKEY_EP_NUM]; 55d7d34918SHongren (Zenithal) Zheng CanoKeyEPState ep_in_state[CANOKEY_EP_NUM]; 56d7d34918SHongren (Zenithal) Zheng 57d7d34918SHongren (Zenithal) Zheng /* OUT pointer to canokey recv buffer */ 58d7d34918SHongren (Zenithal) Zheng uint8_t *ep_out[CANOKEY_EP_NUM]; 59d7d34918SHongren (Zenithal) Zheng uint32_t ep_out_size[CANOKEY_EP_NUM]; 60d7d34918SHongren (Zenithal) Zheng 61d7d34918SHongren (Zenithal) Zheng /* Properties */ 62d7d34918SHongren (Zenithal) Zheng char *file; /* canokey-file */ 63d7d34918SHongren (Zenithal) Zheng } CanoKeyState; 64d7d34918SHongren (Zenithal) Zheng 65d7d34918SHongren (Zenithal) Zheng #endif /* CANOKEY_H */ 66