Compare commits
4 Commits
pull-input
...
pull-usb-2
Author | SHA1 | Date | |
---|---|---|---|
|
92fdfa4bef | ||
|
86d7e214c2 | ||
|
cfda2cef3d | ||
6110ce59af |
@@ -239,7 +239,7 @@ static void hid_keyboard_event(DeviceState *dev, QemuConsole *src,
|
|||||||
|
|
||||||
static void hid_keyboard_process_keycode(HIDState *hs)
|
static void hid_keyboard_process_keycode(HIDState *hs)
|
||||||
{
|
{
|
||||||
uint8_t hid_code, index, key;
|
uint8_t hid_code, key;
|
||||||
int i, keycode, slot;
|
int i, keycode, slot;
|
||||||
|
|
||||||
if (hs->n == 0) {
|
if (hs->n == 0) {
|
||||||
@@ -249,8 +249,7 @@ static void hid_keyboard_process_keycode(HIDState *hs)
|
|||||||
keycode = hs->kbd.keycodes[slot];
|
keycode = hs->kbd.keycodes[slot];
|
||||||
|
|
||||||
key = keycode & 0x7f;
|
key = keycode & 0x7f;
|
||||||
index = key | ((hs->kbd.modifiers & (1 << 8)) >> 1);
|
hid_code = hid_usage_keys[key | ((hs->kbd.modifiers >> 1) & (1 << 7))];
|
||||||
hid_code = hid_usage_keys[index];
|
|
||||||
hs->kbd.modifiers &= ~(1 << 8);
|
hs->kbd.modifiers &= ~(1 << 8);
|
||||||
|
|
||||||
switch (hid_code) {
|
switch (hid_code) {
|
||||||
@@ -258,41 +257,18 @@ static void hid_keyboard_process_keycode(HIDState *hs)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
case 0xe0:
|
case 0xe0:
|
||||||
assert(key == 0x1d);
|
|
||||||
if (hs->kbd.modifiers & (1 << 9)) {
|
if (hs->kbd.modifiers & (1 << 9)) {
|
||||||
/* The hid_codes for the 0xe1/0x1d scancode sequence are 0xe9/0xe0.
|
hs->kbd.modifiers ^= 3 << 8;
|
||||||
* Here we're processing the second hid_code. By dropping bit 9
|
|
||||||
* and setting bit 8, the scancode after 0x1d will access the
|
|
||||||
* second half of the table.
|
|
||||||
*/
|
|
||||||
hs->kbd.modifiers ^= (1 << 8) | (1 << 9);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* fall through to process Ctrl_L */
|
|
||||||
case 0xe1 ... 0xe7:
|
case 0xe1 ... 0xe7:
|
||||||
/* Ctrl_L/Ctrl_R, Shift_L/Shift_R, Alt_L/Alt_R, Win_L/Win_R.
|
|
||||||
* Handle releases here, or fall through to process presses.
|
|
||||||
*/
|
|
||||||
if (keycode & (1 << 7)) {
|
if (keycode & (1 << 7)) {
|
||||||
hs->kbd.modifiers &= ~(1 << (hid_code & 0x0f));
|
hs->kbd.modifiers &= ~(1 << (hid_code & 0x0f));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* fall through */
|
case 0xe8 ... 0xef:
|
||||||
case 0xe8 ... 0xe9:
|
|
||||||
/* USB modifiers are just 1 byte long. Bits 8 and 9 of
|
|
||||||
* hs->kbd.modifiers implement a state machine that detects the
|
|
||||||
* 0xe0 and 0xe1/0x1d sequences. These bits do not follow the
|
|
||||||
* usual rules where bit 7 marks released keys; they are cleared
|
|
||||||
* elsewhere in the function as the state machine dictates.
|
|
||||||
*/
|
|
||||||
hs->kbd.modifiers |= 1 << (hid_code & 0x0f);
|
hs->kbd.modifiers |= 1 << (hid_code & 0x0f);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case 0xea ... 0xef:
|
|
||||||
abort();
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (keycode & (1 << 7)) {
|
if (keycode & (1 << 7)) {
|
||||||
|
@@ -308,7 +308,6 @@ static void virtio_input_hid_handle_status(VirtIOInput *vinput,
|
|||||||
static Property virtio_input_hid_properties[] = {
|
static Property virtio_input_hid_properties[] = {
|
||||||
DEFINE_PROP_STRING("display", VirtIOInputHID, display),
|
DEFINE_PROP_STRING("display", VirtIOInputHID, display),
|
||||||
DEFINE_PROP_UINT32("head", VirtIOInputHID, head, 0),
|
DEFINE_PROP_UINT32("head", VirtIOInputHID, head, 0),
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static void virtio_input_hid_class_init(ObjectClass *klass, void *data)
|
static void virtio_input_hid_class_init(ObjectClass *klass, void *data)
|
||||||
|
@@ -11,7 +11,6 @@
|
|||||||
#include "hw/virtio/virtio.h"
|
#include "hw/virtio/virtio.h"
|
||||||
#include "hw/virtio/virtio-input.h"
|
#include "hw/virtio/virtio-input.h"
|
||||||
|
|
||||||
#include <sys/ioctl.h>
|
|
||||||
#include "standard-headers/linux/input.h"
|
#include "standard-headers/linux/input.h"
|
||||||
|
|
||||||
/* ----------------------------------------------------------------- */
|
/* ----------------------------------------------------------------- */
|
||||||
|
@@ -283,6 +283,7 @@ typedef struct CCIDBus {
|
|||||||
typedef struct USBCCIDState {
|
typedef struct USBCCIDState {
|
||||||
USBDevice dev;
|
USBDevice dev;
|
||||||
USBEndpoint *intr;
|
USBEndpoint *intr;
|
||||||
|
USBEndpoint *bulk;
|
||||||
CCIDBus bus;
|
CCIDBus bus;
|
||||||
CCIDCardState *card;
|
CCIDCardState *card;
|
||||||
BulkIn bulk_in_pending[BULK_IN_PENDING_NUM]; /* circular */
|
BulkIn bulk_in_pending[BULK_IN_PENDING_NUM]; /* circular */
|
||||||
@@ -769,6 +770,7 @@ static void ccid_write_slot_status(USBCCIDState *s, CCID_Header *recv)
|
|||||||
h->b.bError = s->bError;
|
h->b.bError = s->bError;
|
||||||
h->bClockStatus = CLOCK_STATUS_RUNNING;
|
h->bClockStatus = CLOCK_STATUS_RUNNING;
|
||||||
ccid_reset_error_status(s);
|
ccid_reset_error_status(s);
|
||||||
|
usb_wakeup(s->bulk, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ccid_write_parameters(USBCCIDState *s, CCID_Header *recv)
|
static void ccid_write_parameters(USBCCIDState *s, CCID_Header *recv)
|
||||||
@@ -789,6 +791,7 @@ static void ccid_write_parameters(USBCCIDState *s, CCID_Header *recv)
|
|||||||
h->bProtocolNum = s->bProtocolNum;
|
h->bProtocolNum = s->bProtocolNum;
|
||||||
h->abProtocolDataStructure = s->abProtocolDataStructure;
|
h->abProtocolDataStructure = s->abProtocolDataStructure;
|
||||||
ccid_reset_error_status(s);
|
ccid_reset_error_status(s);
|
||||||
|
usb_wakeup(s->bulk, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ccid_write_data_block(USBCCIDState *s, uint8_t slot, uint8_t seq,
|
static void ccid_write_data_block(USBCCIDState *s, uint8_t slot, uint8_t seq,
|
||||||
@@ -810,6 +813,7 @@ static void ccid_write_data_block(USBCCIDState *s, uint8_t slot, uint8_t seq,
|
|||||||
}
|
}
|
||||||
memcpy(p->abData, data, len);
|
memcpy(p->abData, data, len);
|
||||||
ccid_reset_error_status(s);
|
ccid_reset_error_status(s);
|
||||||
|
usb_wakeup(s->bulk, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ccid_report_error_failed(USBCCIDState *s, uint8_t error)
|
static void ccid_report_error_failed(USBCCIDState *s, uint8_t error)
|
||||||
@@ -1184,7 +1188,7 @@ void ccid_card_send_apdu_to_guest(CCIDCardState *card,
|
|||||||
uint8_t *apdu, uint32_t len)
|
uint8_t *apdu, uint32_t len)
|
||||||
{
|
{
|
||||||
DeviceState *qdev = DEVICE(card);
|
DeviceState *qdev = DEVICE(card);
|
||||||
USBDevice *dev = USB_DEVICE(qdev);
|
USBDevice *dev = USB_DEVICE(qdev->parent_bus->parent);
|
||||||
USBCCIDState *s = USB_CCID_DEV(dev);
|
USBCCIDState *s = USB_CCID_DEV(dev);
|
||||||
Answer *answer;
|
Answer *answer;
|
||||||
|
|
||||||
@@ -1207,7 +1211,7 @@ void ccid_card_send_apdu_to_guest(CCIDCardState *card,
|
|||||||
void ccid_card_card_removed(CCIDCardState *card)
|
void ccid_card_card_removed(CCIDCardState *card)
|
||||||
{
|
{
|
||||||
DeviceState *qdev = DEVICE(card);
|
DeviceState *qdev = DEVICE(card);
|
||||||
USBDevice *dev = USB_DEVICE(qdev);
|
USBDevice *dev = USB_DEVICE(qdev->parent_bus->parent);
|
||||||
USBCCIDState *s = USB_CCID_DEV(dev);
|
USBCCIDState *s = USB_CCID_DEV(dev);
|
||||||
|
|
||||||
ccid_on_slot_change(s, false);
|
ccid_on_slot_change(s, false);
|
||||||
@@ -1218,7 +1222,7 @@ void ccid_card_card_removed(CCIDCardState *card)
|
|||||||
int ccid_card_ccid_attach(CCIDCardState *card)
|
int ccid_card_ccid_attach(CCIDCardState *card)
|
||||||
{
|
{
|
||||||
DeviceState *qdev = DEVICE(card);
|
DeviceState *qdev = DEVICE(card);
|
||||||
USBDevice *dev = USB_DEVICE(qdev);
|
USBDevice *dev = USB_DEVICE(qdev->parent_bus->parent);
|
||||||
USBCCIDState *s = USB_CCID_DEV(dev);
|
USBCCIDState *s = USB_CCID_DEV(dev);
|
||||||
|
|
||||||
DPRINTF(s, 1, "CCID Attach\n");
|
DPRINTF(s, 1, "CCID Attach\n");
|
||||||
@@ -1231,7 +1235,7 @@ int ccid_card_ccid_attach(CCIDCardState *card)
|
|||||||
void ccid_card_ccid_detach(CCIDCardState *card)
|
void ccid_card_ccid_detach(CCIDCardState *card)
|
||||||
{
|
{
|
||||||
DeviceState *qdev = DEVICE(card);
|
DeviceState *qdev = DEVICE(card);
|
||||||
USBDevice *dev = USB_DEVICE(qdev);
|
USBDevice *dev = USB_DEVICE(qdev->parent_bus->parent);
|
||||||
USBCCIDState *s = USB_CCID_DEV(dev);
|
USBCCIDState *s = USB_CCID_DEV(dev);
|
||||||
|
|
||||||
DPRINTF(s, 1, "CCID Detach\n");
|
DPRINTF(s, 1, "CCID Detach\n");
|
||||||
@@ -1244,7 +1248,7 @@ void ccid_card_ccid_detach(CCIDCardState *card)
|
|||||||
void ccid_card_card_error(CCIDCardState *card, uint64_t error)
|
void ccid_card_card_error(CCIDCardState *card, uint64_t error)
|
||||||
{
|
{
|
||||||
DeviceState *qdev = DEVICE(card);
|
DeviceState *qdev = DEVICE(card);
|
||||||
USBDevice *dev = USB_DEVICE(qdev);
|
USBDevice *dev = USB_DEVICE(qdev->parent_bus->parent);
|
||||||
USBCCIDState *s = USB_CCID_DEV(dev);
|
USBCCIDState *s = USB_CCID_DEV(dev);
|
||||||
|
|
||||||
s->bmCommandStatus = COMMAND_STATUS_FAILED;
|
s->bmCommandStatus = COMMAND_STATUS_FAILED;
|
||||||
@@ -1263,7 +1267,7 @@ void ccid_card_card_error(CCIDCardState *card, uint64_t error)
|
|||||||
void ccid_card_card_inserted(CCIDCardState *card)
|
void ccid_card_card_inserted(CCIDCardState *card)
|
||||||
{
|
{
|
||||||
DeviceState *qdev = DEVICE(card);
|
DeviceState *qdev = DEVICE(card);
|
||||||
USBDevice *dev = USB_DEVICE(qdev);
|
USBDevice *dev = USB_DEVICE(qdev->parent_bus->parent);
|
||||||
USBCCIDState *s = USB_CCID_DEV(dev);
|
USBCCIDState *s = USB_CCID_DEV(dev);
|
||||||
|
|
||||||
s->bmCommandStatus = COMMAND_STATUS_NO_ERROR;
|
s->bmCommandStatus = COMMAND_STATUS_NO_ERROR;
|
||||||
@@ -1275,7 +1279,7 @@ static int ccid_card_exit(DeviceState *qdev)
|
|||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
CCIDCardState *card = CCID_CARD(qdev);
|
CCIDCardState *card = CCID_CARD(qdev);
|
||||||
USBDevice *dev = USB_DEVICE(qdev);
|
USBDevice *dev = USB_DEVICE(qdev->parent_bus->parent);
|
||||||
USBCCIDState *s = USB_CCID_DEV(dev);
|
USBCCIDState *s = USB_CCID_DEV(dev);
|
||||||
|
|
||||||
if (ccid_card_inserted(s)) {
|
if (ccid_card_inserted(s)) {
|
||||||
@@ -1289,7 +1293,7 @@ static int ccid_card_exit(DeviceState *qdev)
|
|||||||
static int ccid_card_init(DeviceState *qdev)
|
static int ccid_card_init(DeviceState *qdev)
|
||||||
{
|
{
|
||||||
CCIDCardState *card = CCID_CARD(qdev);
|
CCIDCardState *card = CCID_CARD(qdev);
|
||||||
USBDevice *dev = USB_DEVICE(qdev);
|
USBDevice *dev = USB_DEVICE(qdev->parent_bus->parent);
|
||||||
USBCCIDState *s = USB_CCID_DEV(dev);
|
USBCCIDState *s = USB_CCID_DEV(dev);
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
@@ -1319,6 +1323,7 @@ static void ccid_realize(USBDevice *dev, Error **errp)
|
|||||||
NULL);
|
NULL);
|
||||||
qbus_set_hotplug_handler(BUS(&s->bus), DEVICE(dev), &error_abort);
|
qbus_set_hotplug_handler(BUS(&s->bus), DEVICE(dev), &error_abort);
|
||||||
s->intr = usb_ep_get(dev, USB_TOKEN_IN, CCID_INT_IN_EP);
|
s->intr = usb_ep_get(dev, USB_TOKEN_IN, CCID_INT_IN_EP);
|
||||||
|
s->bulk = usb_ep_get(dev, USB_TOKEN_IN, CCID_BULK_IN_EP);
|
||||||
s->card = NULL;
|
s->card = NULL;
|
||||||
s->migration_state = MIGRATION_NONE;
|
s->migration_state = MIGRATION_NONE;
|
||||||
s->migration_target_ip = 0;
|
s->migration_target_ip = 0;
|
||||||
|
@@ -2222,8 +2222,6 @@ static void xhci_kick_ep(XHCIState *xhci, unsigned int slotid,
|
|||||||
if (xfer->running_retry) {
|
if (xfer->running_retry) {
|
||||||
DPRINTF("xhci: xfer nacked, stopping schedule\n");
|
DPRINTF("xhci: xfer nacked, stopping schedule\n");
|
||||||
epctx->retry = xfer;
|
epctx->retry = xfer;
|
||||||
timer_mod(epctx->kick_timer, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) +
|
|
||||||
epctx->interval * 125000);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -889,6 +889,9 @@ static int usb_host_open(USBHostDevice *s, libusb_device *dev)
|
|||||||
fail:
|
fail:
|
||||||
trace_usb_host_open_failure(bus_num, addr);
|
trace_usb_host_open_failure(bus_num, addr);
|
||||||
if (s->dh != NULL) {
|
if (s->dh != NULL) {
|
||||||
|
usb_host_release_interfaces(s);
|
||||||
|
libusb_reset_device(s->dh);
|
||||||
|
usb_host_attach_kernel(s);
|
||||||
libusb_close(s->dh);
|
libusb_close(s->dh);
|
||||||
s->dh = NULL;
|
s->dh = NULL;
|
||||||
s->dev = NULL;
|
s->dev = NULL;
|
||||||
|
@@ -10,6 +10,7 @@
|
|||||||
|
|
||||||
|
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include "standard-headers/linux/types.h"
|
#include "standard-headers/linux/types.h"
|
||||||
|
|
||||||
|
@@ -56,7 +56,6 @@ cp_virtio() {
|
|||||||
-e 's/__bitwise__//' \
|
-e 's/__bitwise__//' \
|
||||||
-e 's/__attribute__((packed))/QEMU_PACKED/' \
|
-e 's/__attribute__((packed))/QEMU_PACKED/' \
|
||||||
-e 's/__inline__/inline/' \
|
-e 's/__inline__/inline/' \
|
||||||
-e '/sys\/ioctl.h/d' \
|
|
||||||
"$f" > "$to/$header";
|
"$f" > "$to/$header";
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
|
Reference in New Issue
Block a user