xemu/hw/xbox/xid.h

137 lines
3.5 KiB
C

#ifndef __XID_H__
#define __XID_H__
/*
* QEMU USB XID Devices
*
* Copyright (c) 2013 espes
* Copyright (c) 2017 Jannik Vogel
* Copyright (c) 2018-2021 Matt Borgerson
* Copyright (c) 2023 Fred Hallock
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
#include "qemu/osdep.h"
#include "hw/hw.h"
#include "hw/qdev-properties.h"
#include "hw/usb.h"
#include "hw/usb/desc.h"
#include "migration/vmstate.h"
#include "sysemu/sysemu.h"
#include "ui/console.h"
#include "ui/xemu-input.h"
// #define DEBUG_XID
#ifdef DEBUG_XID
#define DPRINTF printf
#else
#define DPRINTF(...)
#endif
#define USB_CLASS_XID 0x58
#define USB_DT_XID 0x42
#define HID_GET_REPORT 0x01
#define HID_SET_REPORT 0x09
#define XID_GET_CAPABILITIES 0x01
#define XID_DEVICETYPE_GAMEPAD 0x01
#define XID_DEVICESUBTYPE_GAMEPAD 0x01
#define XID_DEVICESUBTYPE_GAMEPAD_S 0x02
#define TYPE_USB_XID_GAMEPAD "usb-xbox-gamepad"
#define TYPE_USB_XID_GAMEPAD_S "usb-xbox-gamepad-s"
#define GAMEPAD_A 0
#define GAMEPAD_B 1
#define GAMEPAD_X 2
#define GAMEPAD_Y 3
#define GAMEPAD_BLACK 4
#define GAMEPAD_WHITE 5
#define GAMEPAD_LEFT_TRIGGER 6
#define GAMEPAD_RIGHT_TRIGGER 7
#define GAMEPAD_DPAD_UP 8
#define GAMEPAD_DPAD_DOWN 9
#define GAMEPAD_DPAD_LEFT 10
#define GAMEPAD_DPAD_RIGHT 11
#define GAMEPAD_START 12
#define GAMEPAD_BACK 13
#define GAMEPAD_LEFT_THUMB 14
#define GAMEPAD_RIGHT_THUMB 15
#define BUTTON_MASK(button) (1 << ((button) - GAMEPAD_DPAD_UP))
enum {
STR_MANUFACTURER = 1,
STR_PRODUCT,
STR_SERIALNUMBER,
};
extern const USBDescStrings desc_strings;
typedef struct XIDDesc {
uint8_t bLength;
uint8_t bDescriptorType;
uint16_t bcdXid;
uint8_t bType;
uint8_t bSubType;
uint8_t bMaxInputReportSize;
uint8_t bMaxOutputReportSize;
uint16_t wAlternateProductIds[4];
} QEMU_PACKED XIDDesc;
typedef struct XIDGamepadReport {
uint8_t bReportId;
uint8_t bLength;
uint16_t wButtons;
uint8_t bAnalogButtons[8];
int16_t sThumbLX;
int16_t sThumbLY;
int16_t sThumbRX;
int16_t sThumbRY;
} QEMU_PACKED XIDGamepadReport;
typedef struct XIDGamepadOutputReport {
uint8_t report_id; // FIXME: is this correct?
uint8_t length;
uint16_t left_actuator_strength;
uint16_t right_actuator_strength;
} QEMU_PACKED XIDGamepadOutputReport;
typedef struct USBXIDGamepadState {
USBDevice dev;
USBEndpoint *intr;
const XIDDesc *xid_desc;
XIDGamepadReport in_state;
XIDGamepadReport in_state_capabilities;
XIDGamepadOutputReport out_state;
XIDGamepadOutputReport out_state_capabilities;
uint8_t device_index;
} USBXIDGamepadState;
void update_input(USBXIDGamepadState *s);
void update_output(USBXIDGamepadState *s);
void usb_xid_handle_reset(USBDevice *dev);
void usb_xid_handle_control(USBDevice *dev, USBPacket *p, int request,
int value, int index, int length, uint8_t *data);
void usb_xbox_gamepad_unrealize(USBDevice *dev);
#if 0
void usb_xid_handle_destroy(USBDevice *dev);
#endif
#endif