mirror of
https://github.com/holub/mame
synced 2025-04-26 18:23:08 +03:00
xbox.cpp: move usb part into new file xbox_usb.cpp and .h (nw)
This commit is contained in:
parent
f3ae800e3d
commit
6f29697a38
@ -3227,6 +3227,7 @@ files {
|
|||||||
MAME_DIR .. "src/mame/machine/gdrom.cpp",
|
MAME_DIR .. "src/mame/machine/gdrom.cpp",
|
||||||
MAME_DIR .. "src/mame/machine/gdrom.h",
|
MAME_DIR .. "src/mame/machine/gdrom.h",
|
||||||
MAME_DIR .. "src/mame/machine/xbox.cpp",
|
MAME_DIR .. "src/mame/machine/xbox.cpp",
|
||||||
|
MAME_DIR .. "src/mame/machine/xbox_usb.cpp",
|
||||||
}
|
}
|
||||||
|
|
||||||
createMAMEProjects(_target, _subtarget, "seibu")
|
createMAMEProjects(_target, _subtarget, "seibu")
|
||||||
|
@ -1070,6 +1070,7 @@ files {
|
|||||||
MAME_DIR .. "src/mame/video/cps1.cpp",
|
MAME_DIR .. "src/mame/video/cps1.cpp",
|
||||||
MAME_DIR .. "src/mame/video/chihiro.cpp",
|
MAME_DIR .. "src/mame/video/chihiro.cpp",
|
||||||
MAME_DIR .. "src/mame/machine/xbox.cpp",
|
MAME_DIR .. "src/mame/machine/xbox.cpp",
|
||||||
|
MAME_DIR .. "src/mame/machine/xbox_usb.cpp",
|
||||||
MAME_DIR .. "src/mame/includes/saturn.h",
|
MAME_DIR .. "src/mame/includes/saturn.h",
|
||||||
MAME_DIR .. "src/mame/drivers/saturn.cpp",
|
MAME_DIR .. "src/mame/drivers/saturn.cpp",
|
||||||
MAME_DIR .. "src/mame/machine/saturn.cpp",
|
MAME_DIR .. "src/mame/machine/saturn.cpp",
|
||||||
@ -2018,6 +2019,7 @@ createMESSProjects(_target, _subtarget, "microsoft")
|
|||||||
files {
|
files {
|
||||||
MAME_DIR .. "src/mame/drivers/xbox.cpp",
|
MAME_DIR .. "src/mame/drivers/xbox.cpp",
|
||||||
MAME_DIR .. "src/mame/includes/xbox.h",
|
MAME_DIR .. "src/mame/includes/xbox.h",
|
||||||
|
MAME_DIR .. "src/mame/includes/xbox_usb.h",
|
||||||
}
|
}
|
||||||
|
|
||||||
createMESSProjects(_target, _subtarget, "mit")
|
createMESSProjects(_target, _subtarget, "mit")
|
||||||
|
@ -381,6 +381,7 @@ Thanks to Alex, Mr Mudkips, and Philip Burke for this info.
|
|||||||
#include "debugger.h"
|
#include "debugger.h"
|
||||||
#include "includes/chihiro.h"
|
#include "includes/chihiro.h"
|
||||||
#include "includes/xbox.h"
|
#include "includes/xbox.h"
|
||||||
|
#include "includes/xbox_usb.h"
|
||||||
|
|
||||||
#define LOG_PCI
|
#define LOG_PCI
|
||||||
//#define LOG_BASEBOARD
|
//#define LOG_BASEBOARD
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
#include "debugger.h"
|
#include "debugger.h"
|
||||||
#include "includes/chihiro.h"
|
#include "includes/chihiro.h"
|
||||||
#include "includes/xbox.h"
|
#include "includes/xbox.h"
|
||||||
|
#include "includes/xbox_usb.h"
|
||||||
|
|
||||||
#define CPU_DIV 64
|
#define CPU_DIV 64
|
||||||
|
|
||||||
|
@ -1,458 +1,9 @@
|
|||||||
// license:BSD-3-Clause
|
// license:BSD-3-Clause
|
||||||
// copyright-holders:Samuele Zannoli
|
// copyright-holders:Samuele Zannoli
|
||||||
|
|
||||||
#include <forward_list>
|
#pragma once
|
||||||
|
|
||||||
struct OHCIEndpointDescriptor {
|
#include "xbox_usb.h"
|
||||||
int mps; // MaximumPacketSize
|
|
||||||
int f; // Format
|
|
||||||
int k; // sKip
|
|
||||||
int s; // Speed
|
|
||||||
int d; // Direction
|
|
||||||
int en; // EndpointNumber
|
|
||||||
int fa; // FunctionAddress
|
|
||||||
UINT32 tailp; // TDQueueTailPointer
|
|
||||||
UINT32 headp; // TDQueueHeadPointer
|
|
||||||
UINT32 nexted; // NextED
|
|
||||||
int c; // toggleCarry
|
|
||||||
int h; // Halted
|
|
||||||
UINT32 word0;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct OHCITransferDescriptor {
|
|
||||||
int cc; // ConditionCode
|
|
||||||
int ec; // ErrorCount
|
|
||||||
int t; // DataToggle
|
|
||||||
int di; // DelayInterrupt
|
|
||||||
int dp; // Direction/PID
|
|
||||||
int r; // bufferRounding
|
|
||||||
UINT32 cbp; // CurrentBufferPointer
|
|
||||||
UINT32 nexttd; // NextTD
|
|
||||||
UINT32 be; // BufferEnd
|
|
||||||
UINT32 word0;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct OHCIIsochronousTransferDescriptor {
|
|
||||||
int cc; // ConditionCode
|
|
||||||
int fc; // FrameCount
|
|
||||||
int di; // DelayInterrupt
|
|
||||||
int sf; // StartingFrame
|
|
||||||
UINT32 bp0; // BufferPage0
|
|
||||||
UINT32 nexttd; // NextTD
|
|
||||||
UINT32 be; // BufferEnd
|
|
||||||
UINT32 offset[8]; // Offset/PacketStatusWord
|
|
||||||
UINT32 word0;
|
|
||||||
UINT32 word1;
|
|
||||||
};
|
|
||||||
|
|
||||||
enum OHCIRegisters {
|
|
||||||
HcRevision=0,
|
|
||||||
HcControl,
|
|
||||||
HcCommandStatus,
|
|
||||||
HcInterruptStatus,
|
|
||||||
HcInterruptEnable,
|
|
||||||
HcInterruptDisable,
|
|
||||||
HcHCCA,
|
|
||||||
HcPeriodCurrentED,
|
|
||||||
HcControlHeadED,
|
|
||||||
HcControlCurrentED,
|
|
||||||
HcBulkHeadED,
|
|
||||||
HcBulkCurrentED,
|
|
||||||
HcDoneHead,
|
|
||||||
HcFmInterval,
|
|
||||||
HcFmRemaining,
|
|
||||||
HcFmNumber,
|
|
||||||
HcPeriodicStart,
|
|
||||||
HcLSThreshold,
|
|
||||||
HcRhDescriptorA,
|
|
||||||
HcRhDescriptorB,
|
|
||||||
HcRhStatus,
|
|
||||||
HcRhPortStatus1
|
|
||||||
};
|
|
||||||
|
|
||||||
enum HcControlBits
|
|
||||||
{
|
|
||||||
CBSR = 1 << 0, // ControlBulkServiceRatio
|
|
||||||
PLE = 1 << 2, // PeriodicListEnable
|
|
||||||
IE = 1 << 3, // IsochronousEnable
|
|
||||||
CLE = 1 << 4, // ControlListEnable
|
|
||||||
BLE = 1 << 5, // BulkListEnable
|
|
||||||
HCFS = 1 << 6, // HostControllerFunctionalState
|
|
||||||
IR = 1 << 8, // InterruptRouting
|
|
||||||
RWC = 1 << 9, // RemoteWakeupConnected
|
|
||||||
RWE = 1 << 10 // RemoteWakeupEnable
|
|
||||||
};
|
|
||||||
|
|
||||||
enum HcRhStatusBits
|
|
||||||
{
|
|
||||||
LPS = 1 << 0, // LocalPowerStatus
|
|
||||||
OCI = 1 << 1, // OverCurrentIndicator
|
|
||||||
DRWE = 1 << 15, // DeviceRemoteWakeupEnable
|
|
||||||
LPSC = 1 << 16, // LocalPowerStatusChange
|
|
||||||
OCIC = 1 << 17, // OverCurrentIndicatorChange
|
|
||||||
CRWE = 1 << 31, // ClearRemoteWakeupEnable
|
|
||||||
};
|
|
||||||
|
|
||||||
enum HcRhPortStatusBits
|
|
||||||
{
|
|
||||||
CCS = 1 << 0, // CurrentConnectStatus
|
|
||||||
PES = 1 << 1, // PortEnableStatus
|
|
||||||
PSS = 1 << 2, // PortSuspendStatus
|
|
||||||
POCI = 1 << 3, // PortOverCurrentIndicator
|
|
||||||
PRS = 1 << 4, // PortResetStatus
|
|
||||||
PPS = 1 << 8, // PortPowerStatus
|
|
||||||
LSDA = 1 << 9, // LowSpeedDeviceAttached
|
|
||||||
CSC = 1 << 16, // ConnectStatusChange
|
|
||||||
PESC = 1 << 17, // PortEnableStatusChange
|
|
||||||
PSSC = 1 << 18, // PortSuspendStatusChange
|
|
||||||
POCIC = 1 << 19, // PortOverCurrentIndicatorChange
|
|
||||||
PRSC = 1 << 20 // PortResetStatusChange
|
|
||||||
};
|
|
||||||
|
|
||||||
enum OHCIHostControllerFunctionalState {
|
|
||||||
UsbReset=0,
|
|
||||||
UsbResume,
|
|
||||||
UsbOperational,
|
|
||||||
UsbSuspend
|
|
||||||
};
|
|
||||||
|
|
||||||
enum OHCIInterrupt {
|
|
||||||
SchedulingOverrun=1,
|
|
||||||
WritebackDoneHead=2,
|
|
||||||
StartofFrame=4,
|
|
||||||
ResumeDetected=8,
|
|
||||||
UnrecoverableError=16,
|
|
||||||
FrameNumberOverflow=32,
|
|
||||||
RootHubStatusChange=64,
|
|
||||||
OwnershipChange=0x40000000,
|
|
||||||
MasterInterruptEnable=0x80000000
|
|
||||||
};
|
|
||||||
|
|
||||||
enum OHCICompletionCode {
|
|
||||||
NoError=0,
|
|
||||||
CRC,
|
|
||||||
BitStuffing,
|
|
||||||
DataToggleMismatch,
|
|
||||||
Stall,
|
|
||||||
DeviceNotResponding,
|
|
||||||
PIDCheckFailure,
|
|
||||||
UnexpectedPID,
|
|
||||||
DataOverrun,
|
|
||||||
DataUnderrun,
|
|
||||||
BufferOverrun=12,
|
|
||||||
BufferUnderrun,
|
|
||||||
NotAccessed=14
|
|
||||||
};
|
|
||||||
|
|
||||||
struct USBSetupPacket {
|
|
||||||
UINT8 bmRequestType;
|
|
||||||
UINT8 bRequest;
|
|
||||||
UINT16 wValue;
|
|
||||||
UINT16 wIndex;
|
|
||||||
UINT16 wLength;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct USBStandardDeviceDescriptor {
|
|
||||||
UINT8 bLength;
|
|
||||||
UINT8 bDescriptorType;
|
|
||||||
UINT16 bcdUSB;
|
|
||||||
UINT8 bDeviceClass;
|
|
||||||
UINT8 bDeviceSubClass;
|
|
||||||
UINT8 bDeviceProtocol;
|
|
||||||
UINT8 bMaxPacketSize0;
|
|
||||||
UINT16 idVendor;
|
|
||||||
UINT16 idProduct;
|
|
||||||
UINT16 bcdDevice;
|
|
||||||
UINT8 iManufacturer;
|
|
||||||
UINT8 iProduct;
|
|
||||||
UINT8 iSerialNumber;
|
|
||||||
UINT8 bNumConfigurations;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct USBStandardConfigurationDescriptor {
|
|
||||||
UINT8 bLength;
|
|
||||||
UINT8 bDescriptorType;
|
|
||||||
UINT16 wTotalLength;
|
|
||||||
UINT8 bNumInterfaces;
|
|
||||||
UINT8 bConfigurationValue;
|
|
||||||
UINT8 iConfiguration;
|
|
||||||
UINT8 bmAttributes;
|
|
||||||
UINT8 MaxPower;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct USBStandardInterfaceDescriptor {
|
|
||||||
UINT8 bLength;
|
|
||||||
UINT8 bDescriptorType;
|
|
||||||
UINT8 bInterfaceNumber;
|
|
||||||
UINT8 bAlternateSetting;
|
|
||||||
UINT8 bNumEndpoints;
|
|
||||||
UINT8 bInterfaceClass;
|
|
||||||
UINT8 bInterfaceSubClass;
|
|
||||||
UINT8 bInterfaceProtocol;
|
|
||||||
UINT8 iInterface;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct USBStandardEndpointDescriptor {
|
|
||||||
UINT8 bLength;
|
|
||||||
UINT8 bDescriptorType;
|
|
||||||
UINT8 bEndpointAddress;
|
|
||||||
UINT8 bmAttributes;
|
|
||||||
UINT16 wMaxPacketSize;
|
|
||||||
UINT8 bInterval;
|
|
||||||
};
|
|
||||||
|
|
||||||
enum USBPid {
|
|
||||||
SetupPid=0,
|
|
||||||
OutPid,
|
|
||||||
InPid
|
|
||||||
};
|
|
||||||
|
|
||||||
enum USBRequestCode {
|
|
||||||
GET_STATUS=0,
|
|
||||||
CLEAR_FEATURE=1,
|
|
||||||
SET_FEATURE=3,
|
|
||||||
SET_ADDRESS=5,
|
|
||||||
GET_DESCRIPTOR=6,
|
|
||||||
SET_DESCRIPTOR=7,
|
|
||||||
GET_CONFIGURATION=8,
|
|
||||||
SET_CONFIGURATION=9,
|
|
||||||
GET_INTERFACE=10,
|
|
||||||
SET_INTERFACE=11,
|
|
||||||
SYNCH_FRAME=12
|
|
||||||
};
|
|
||||||
|
|
||||||
enum USBDescriptorType {
|
|
||||||
DEVICE=1,
|
|
||||||
CONFIGURATION=2,
|
|
||||||
STRING=3,
|
|
||||||
INTERFACE=4,
|
|
||||||
ENDPOINT=5
|
|
||||||
};
|
|
||||||
|
|
||||||
enum USBRequestType
|
|
||||||
{
|
|
||||||
StandardType=0,
|
|
||||||
ClassType,
|
|
||||||
VendorType,
|
|
||||||
ReservedType
|
|
||||||
};
|
|
||||||
|
|
||||||
enum USBRequestRecipient
|
|
||||||
{
|
|
||||||
DeviceRecipient=0,
|
|
||||||
InterfaceRecipient,
|
|
||||||
EndpointRecipient,
|
|
||||||
OtherRecipient
|
|
||||||
};
|
|
||||||
|
|
||||||
enum USBDeviceState
|
|
||||||
{
|
|
||||||
DefaultState,
|
|
||||||
AddressState,
|
|
||||||
ConfiguredState
|
|
||||||
};
|
|
||||||
|
|
||||||
enum USBControlDirection
|
|
||||||
{
|
|
||||||
HostToDevice=0,
|
|
||||||
DeviceToHost=1
|
|
||||||
};
|
|
||||||
|
|
||||||
enum USBEndpointType
|
|
||||||
{
|
|
||||||
ControlEndpoint=0,
|
|
||||||
IsochronousEndpoint,
|
|
||||||
BulkEndpoint,
|
|
||||||
InterruptEndpoint
|
|
||||||
};
|
|
||||||
|
|
||||||
struct usb_device_string
|
|
||||||
{
|
|
||||||
UINT8 *position;
|
|
||||||
int size;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct usb_device_interface_alternate
|
|
||||||
{
|
|
||||||
UINT8 *position;
|
|
||||||
int size;
|
|
||||||
USBStandardInterfaceDescriptor interface_descriptor;
|
|
||||||
std::forward_list<USBStandardEndpointDescriptor> endpoint_descriptors;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct usb_device_interface
|
|
||||||
{
|
|
||||||
UINT8 *position;
|
|
||||||
int size;
|
|
||||||
std::forward_list<usb_device_interface_alternate *> alternate_settings;
|
|
||||||
int selected_alternate;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct usb_device_configuration
|
|
||||||
{
|
|
||||||
USBStandardConfigurationDescriptor configuration_descriptor;
|
|
||||||
UINT8 *position;
|
|
||||||
int size;
|
|
||||||
std::forward_list<usb_device_interface *> interfaces;
|
|
||||||
};
|
|
||||||
|
|
||||||
class ohci_function_device; // forward declaration
|
|
||||||
|
|
||||||
class ohci_usb_controller : public device_t
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
ohci_usb_controller(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
|
||||||
~ohci_usb_controller() {}
|
|
||||||
void usb_ohci_plug(int port, ohci_function_device *function);
|
|
||||||
void usb_ohci_device_address_changed(int old_address, int new_address);
|
|
||||||
|
|
||||||
template<class _Object> static devcb_base &set_interrupt_handler(device_t &device, _Object object) { return downcast<ohci_usb_controller &>(device).m_interrupt_handler.set_callback(object); }
|
|
||||||
|
|
||||||
DECLARE_READ32_MEMBER(read);
|
|
||||||
DECLARE_WRITE32_MEMBER(write);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
// device-level overrides
|
|
||||||
virtual void device_start() override;
|
|
||||||
virtual void device_reset() override;
|
|
||||||
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
void usb_ohci_interrupts();
|
|
||||||
void usb_ohci_read_endpoint_descriptor(UINT32 address);
|
|
||||||
void usb_ohci_writeback_endpoint_descriptor(UINT32 address);
|
|
||||||
void usb_ohci_read_transfer_descriptor(UINT32 address);
|
|
||||||
void usb_ohci_writeback_transfer_descriptor(UINT32 address);
|
|
||||||
void usb_ohci_read_isochronous_transfer_descriptor(UINT32 address);
|
|
||||||
void usb_ohci_writeback_isochronous_transfer_descriptor(UINT32 address);
|
|
||||||
cpu_device *m_maincpu;
|
|
||||||
//required_device<pic8259_device> pic8259_1;
|
|
||||||
struct {
|
|
||||||
UINT32 hc_regs[256];
|
|
||||||
struct {
|
|
||||||
ohci_function_device *function;
|
|
||||||
int address;
|
|
||||||
int delay;
|
|
||||||
} ports[4 + 1];
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
ohci_function_device *function;
|
|
||||||
int port;
|
|
||||||
} address[256];
|
|
||||||
emu_timer *timer;
|
|
||||||
int state;
|
|
||||||
UINT32 framenumber;
|
|
||||||
UINT32 nextinterupted;
|
|
||||||
UINT32 nextbulked;
|
|
||||||
int interruptbulkratio;
|
|
||||||
int writebackdonehadcounter;
|
|
||||||
address_space *space;
|
|
||||||
UINT8 buffer[1024];
|
|
||||||
OHCIEndpointDescriptor endpoint_descriptor;
|
|
||||||
OHCITransferDescriptor transfer_descriptor;
|
|
||||||
OHCIIsochronousTransferDescriptor isochronous_transfer_descriptor;
|
|
||||||
} ohcist;
|
|
||||||
devcb_write_line m_interrupt_handler;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern const device_type OHCI_USB_CONTROLLER;
|
|
||||||
|
|
||||||
#define MCFG_OHCI_USB_CONTROLLER_ADD(_tag) \
|
|
||||||
MCFG_DEVICE_ADD(_tag, OHCI_USB_CONTROLLER, 0)
|
|
||||||
#define MCFG_OHCI_USB_CONTROLLER_INTERRUPT_HANDLER(_devcb) \
|
|
||||||
devcb = &ohci_usb_controller::set_interrupt_handler(*device, DEVCB_##_devcb);
|
|
||||||
|
|
||||||
class ohci_function_device {
|
|
||||||
public:
|
|
||||||
ohci_function_device();
|
|
||||||
virtual void initialize(running_machine &machine, ohci_usb_controller *usb_bus_manager);
|
|
||||||
virtual void execute_reset();
|
|
||||||
virtual void execute_connect() {};
|
|
||||||
virtual void execute_disconnect() {};
|
|
||||||
int execute_transfer(int endpoint, int pid, UINT8 *buffer, int size);
|
|
||||||
protected:
|
|
||||||
virtual int handle_nonstandard_request(int endpoint, USBSetupPacket *setup) { return -1; };
|
|
||||||
virtual int handle_get_status_request(int endpoint, USBSetupPacket *setup) { return 0; };
|
|
||||||
virtual int handle_clear_feature_request(int endpoint, USBSetupPacket *setup) { return 0; };
|
|
||||||
virtual int handle_set_feature_request(int endpoint, USBSetupPacket *setup) { return 0; };
|
|
||||||
virtual int handle_set_descriptor_request(int endpoint, USBSetupPacket *setup) { return 0; };
|
|
||||||
virtual int handle_synch_frame_request(int endpoint, USBSetupPacket *setup) { return 0; };
|
|
||||||
virtual void handle_status_stage(int endpoint) { return; };
|
|
||||||
virtual int handle_bulk_pid(int endpoint, int pid, UINT8 *buffer, int size) { return 0; };
|
|
||||||
virtual int handle_interrupt_pid(int endpoint, int pid, UINT8 *buffer, int size) { return 0; };
|
|
||||||
virtual int handle_isochronous_pid(int endpoint, int pid, UINT8 *buffer, int size) { return 0; };
|
|
||||||
|
|
||||||
void add_device_descriptor(const USBStandardDeviceDescriptor &descriptor);
|
|
||||||
void add_configuration_descriptor(const USBStandardConfigurationDescriptor &descriptor);
|
|
||||||
void add_interface_descriptor(const USBStandardInterfaceDescriptor &descriptor);
|
|
||||||
void add_endpoint_descriptor(const USBStandardEndpointDescriptor &descriptor);
|
|
||||||
void add_string_descriptor(const UINT8 *descriptor);
|
|
||||||
void select_configuration(int index);
|
|
||||||
void select_alternate(int interfacei, int index);
|
|
||||||
int find_alternate(int interfacei);
|
|
||||||
UINT8 *position_device_descriptor(int &size);
|
|
||||||
UINT8 *position_configuration_descriptor(int index, int &size);
|
|
||||||
UINT8 *position_string_descriptor(int index, int &size);
|
|
||||||
ohci_usb_controller *busmanager;
|
|
||||||
struct {
|
|
||||||
int type;
|
|
||||||
int controldirection;
|
|
||||||
int controltype;
|
|
||||||
int controlrecipient;
|
|
||||||
int remain;
|
|
||||||
UINT8 *position;
|
|
||||||
UINT8 buffer[128];
|
|
||||||
} endpoints[256];
|
|
||||||
int state;
|
|
||||||
bool settingaddress;
|
|
||||||
int newaddress;
|
|
||||||
int address;
|
|
||||||
int configurationvalue;
|
|
||||||
UINT8 *descriptors;
|
|
||||||
int descriptors_pos;
|
|
||||||
bool wantstatuscallback;
|
|
||||||
USBStandardDeviceDescriptor device_descriptor;
|
|
||||||
std::forward_list<usb_device_configuration *> configurations;
|
|
||||||
std::forward_list<usb_device_string *> device_strings;
|
|
||||||
usb_device_configuration *latest_configuration;
|
|
||||||
usb_device_interface_alternate *latest_alternate;
|
|
||||||
usb_device_configuration *selected_configuration;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern const device_type OHCI_GAME_CONTROLLER;
|
|
||||||
|
|
||||||
class ohci_game_controller_device : public device_t, public ohci_function_device
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
ohci_game_controller_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
|
||||||
void initialize(running_machine &machine, ohci_usb_controller *usb_bus_manager) override;
|
|
||||||
int handle_nonstandard_request(int endpoint, USBSetupPacket *setup) override;
|
|
||||||
int handle_interrupt_pid(int endpoint, int pid, UINT8 *buffer, int size) override;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual void device_start() override;
|
|
||||||
virtual ioport_constructor device_input_ports() const override;
|
|
||||||
private:
|
|
||||||
static const USBStandardDeviceDescriptor devdesc;
|
|
||||||
static const USBStandardConfigurationDescriptor condesc;
|
|
||||||
static const USBStandardInterfaceDescriptor intdesc;
|
|
||||||
static const USBStandardEndpointDescriptor enddesc82;
|
|
||||||
static const USBStandardEndpointDescriptor enddesc02;
|
|
||||||
required_ioport m_ThumbstickLh; // left analog thumbstick horizontal movement
|
|
||||||
required_ioport m_ThumbstickLv; // left analog thumbstick vertical movement
|
|
||||||
required_ioport m_ThumbstickRh; // right analog thumbstick horizontal movement
|
|
||||||
required_ioport m_ThumbstickRv; // right analog thumbstick vertical movement
|
|
||||||
required_ioport m_DPad; // pressure sensitive directional pad
|
|
||||||
required_ioport m_TriggerL; // analog trigger
|
|
||||||
required_ioport m_TriggerR; // analog trigger
|
|
||||||
required_ioport m_Buttons; // digital buttons
|
|
||||||
required_ioport m_AGreen; // analog button
|
|
||||||
required_ioport m_BRed; // analog button
|
|
||||||
required_ioport m_XBlue; // analog button
|
|
||||||
required_ioport m_YYellow; // analog button
|
|
||||||
required_ioport m_Black; // analog button
|
|
||||||
required_ioport m_White; // analog button
|
|
||||||
};
|
|
||||||
|
|
||||||
class xbox_base_state : public driver_device
|
class xbox_base_state : public driver_device
|
||||||
{
|
{
|
||||||
|
457
src/mame/includes/xbox_usb.h
Normal file
457
src/mame/includes/xbox_usb.h
Normal file
@ -0,0 +1,457 @@
|
|||||||
|
// license:BSD-3-Clause
|
||||||
|
// copyright-holders:Samuele Zannoli
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <forward_list>
|
||||||
|
|
||||||
|
struct OHCIEndpointDescriptor {
|
||||||
|
int mps; // MaximumPacketSize
|
||||||
|
int f; // Format
|
||||||
|
int k; // sKip
|
||||||
|
int s; // Speed
|
||||||
|
int d; // Direction
|
||||||
|
int en; // EndpointNumber
|
||||||
|
int fa; // FunctionAddress
|
||||||
|
UINT32 tailp; // TDQueueTailPointer
|
||||||
|
UINT32 headp; // TDQueueHeadPointer
|
||||||
|
UINT32 nexted; // NextED
|
||||||
|
int c; // toggleCarry
|
||||||
|
int h; // Halted
|
||||||
|
UINT32 word0;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct OHCITransferDescriptor {
|
||||||
|
int cc; // ConditionCode
|
||||||
|
int ec; // ErrorCount
|
||||||
|
int t; // DataToggle
|
||||||
|
int di; // DelayInterrupt
|
||||||
|
int dp; // Direction/PID
|
||||||
|
int r; // bufferRounding
|
||||||
|
UINT32 cbp; // CurrentBufferPointer
|
||||||
|
UINT32 nexttd; // NextTD
|
||||||
|
UINT32 be; // BufferEnd
|
||||||
|
UINT32 word0;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct OHCIIsochronousTransferDescriptor {
|
||||||
|
int cc; // ConditionCode
|
||||||
|
int fc; // FrameCount
|
||||||
|
int di; // DelayInterrupt
|
||||||
|
int sf; // StartingFrame
|
||||||
|
UINT32 bp0; // BufferPage0
|
||||||
|
UINT32 nexttd; // NextTD
|
||||||
|
UINT32 be; // BufferEnd
|
||||||
|
UINT32 offset[8]; // Offset/PacketStatusWord
|
||||||
|
UINT32 word0;
|
||||||
|
UINT32 word1;
|
||||||
|
};
|
||||||
|
|
||||||
|
enum OHCIRegisters {
|
||||||
|
HcRevision=0,
|
||||||
|
HcControl,
|
||||||
|
HcCommandStatus,
|
||||||
|
HcInterruptStatus,
|
||||||
|
HcInterruptEnable,
|
||||||
|
HcInterruptDisable,
|
||||||
|
HcHCCA,
|
||||||
|
HcPeriodCurrentED,
|
||||||
|
HcControlHeadED,
|
||||||
|
HcControlCurrentED,
|
||||||
|
HcBulkHeadED,
|
||||||
|
HcBulkCurrentED,
|
||||||
|
HcDoneHead,
|
||||||
|
HcFmInterval,
|
||||||
|
HcFmRemaining,
|
||||||
|
HcFmNumber,
|
||||||
|
HcPeriodicStart,
|
||||||
|
HcLSThreshold,
|
||||||
|
HcRhDescriptorA,
|
||||||
|
HcRhDescriptorB,
|
||||||
|
HcRhStatus,
|
||||||
|
HcRhPortStatus1
|
||||||
|
};
|
||||||
|
|
||||||
|
enum HcControlBits
|
||||||
|
{
|
||||||
|
CBSR = 1 << 0, // ControlBulkServiceRatio
|
||||||
|
PLE = 1 << 2, // PeriodicListEnable
|
||||||
|
IE = 1 << 3, // IsochronousEnable
|
||||||
|
CLE = 1 << 4, // ControlListEnable
|
||||||
|
BLE = 1 << 5, // BulkListEnable
|
||||||
|
HCFS = 1 << 6, // HostControllerFunctionalState
|
||||||
|
IR = 1 << 8, // InterruptRouting
|
||||||
|
RWC = 1 << 9, // RemoteWakeupConnected
|
||||||
|
RWE = 1 << 10 // RemoteWakeupEnable
|
||||||
|
};
|
||||||
|
|
||||||
|
enum HcRhStatusBits
|
||||||
|
{
|
||||||
|
LPS = 1 << 0, // LocalPowerStatus
|
||||||
|
OCI = 1 << 1, // OverCurrentIndicator
|
||||||
|
DRWE = 1 << 15, // DeviceRemoteWakeupEnable
|
||||||
|
LPSC = 1 << 16, // LocalPowerStatusChange
|
||||||
|
OCIC = 1 << 17, // OverCurrentIndicatorChange
|
||||||
|
CRWE = 1 << 31, // ClearRemoteWakeupEnable
|
||||||
|
};
|
||||||
|
|
||||||
|
enum HcRhPortStatusBits
|
||||||
|
{
|
||||||
|
CCS = 1 << 0, // CurrentConnectStatus
|
||||||
|
PES = 1 << 1, // PortEnableStatus
|
||||||
|
PSS = 1 << 2, // PortSuspendStatus
|
||||||
|
POCI = 1 << 3, // PortOverCurrentIndicator
|
||||||
|
PRS = 1 << 4, // PortResetStatus
|
||||||
|
PPS = 1 << 8, // PortPowerStatus
|
||||||
|
LSDA = 1 << 9, // LowSpeedDeviceAttached
|
||||||
|
CSC = 1 << 16, // ConnectStatusChange
|
||||||
|
PESC = 1 << 17, // PortEnableStatusChange
|
||||||
|
PSSC = 1 << 18, // PortSuspendStatusChange
|
||||||
|
POCIC = 1 << 19, // PortOverCurrentIndicatorChange
|
||||||
|
PRSC = 1 << 20 // PortResetStatusChange
|
||||||
|
};
|
||||||
|
|
||||||
|
enum OHCIHostControllerFunctionalState {
|
||||||
|
UsbReset=0,
|
||||||
|
UsbResume,
|
||||||
|
UsbOperational,
|
||||||
|
UsbSuspend
|
||||||
|
};
|
||||||
|
|
||||||
|
enum OHCIInterrupt {
|
||||||
|
SchedulingOverrun=1,
|
||||||
|
WritebackDoneHead=2,
|
||||||
|
StartofFrame=4,
|
||||||
|
ResumeDetected=8,
|
||||||
|
UnrecoverableError=16,
|
||||||
|
FrameNumberOverflow=32,
|
||||||
|
RootHubStatusChange=64,
|
||||||
|
OwnershipChange=0x40000000,
|
||||||
|
MasterInterruptEnable=0x80000000
|
||||||
|
};
|
||||||
|
|
||||||
|
enum OHCICompletionCode {
|
||||||
|
NoError=0,
|
||||||
|
CRC,
|
||||||
|
BitStuffing,
|
||||||
|
DataToggleMismatch,
|
||||||
|
Stall,
|
||||||
|
DeviceNotResponding,
|
||||||
|
PIDCheckFailure,
|
||||||
|
UnexpectedPID,
|
||||||
|
DataOverrun,
|
||||||
|
DataUnderrun,
|
||||||
|
BufferOverrun=12,
|
||||||
|
BufferUnderrun,
|
||||||
|
NotAccessed=14
|
||||||
|
};
|
||||||
|
|
||||||
|
struct USBSetupPacket {
|
||||||
|
UINT8 bmRequestType;
|
||||||
|
UINT8 bRequest;
|
||||||
|
UINT16 wValue;
|
||||||
|
UINT16 wIndex;
|
||||||
|
UINT16 wLength;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct USBStandardDeviceDescriptor {
|
||||||
|
UINT8 bLength;
|
||||||
|
UINT8 bDescriptorType;
|
||||||
|
UINT16 bcdUSB;
|
||||||
|
UINT8 bDeviceClass;
|
||||||
|
UINT8 bDeviceSubClass;
|
||||||
|
UINT8 bDeviceProtocol;
|
||||||
|
UINT8 bMaxPacketSize0;
|
||||||
|
UINT16 idVendor;
|
||||||
|
UINT16 idProduct;
|
||||||
|
UINT16 bcdDevice;
|
||||||
|
UINT8 iManufacturer;
|
||||||
|
UINT8 iProduct;
|
||||||
|
UINT8 iSerialNumber;
|
||||||
|
UINT8 bNumConfigurations;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct USBStandardConfigurationDescriptor {
|
||||||
|
UINT8 bLength;
|
||||||
|
UINT8 bDescriptorType;
|
||||||
|
UINT16 wTotalLength;
|
||||||
|
UINT8 bNumInterfaces;
|
||||||
|
UINT8 bConfigurationValue;
|
||||||
|
UINT8 iConfiguration;
|
||||||
|
UINT8 bmAttributes;
|
||||||
|
UINT8 MaxPower;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct USBStandardInterfaceDescriptor {
|
||||||
|
UINT8 bLength;
|
||||||
|
UINT8 bDescriptorType;
|
||||||
|
UINT8 bInterfaceNumber;
|
||||||
|
UINT8 bAlternateSetting;
|
||||||
|
UINT8 bNumEndpoints;
|
||||||
|
UINT8 bInterfaceClass;
|
||||||
|
UINT8 bInterfaceSubClass;
|
||||||
|
UINT8 bInterfaceProtocol;
|
||||||
|
UINT8 iInterface;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct USBStandardEndpointDescriptor {
|
||||||
|
UINT8 bLength;
|
||||||
|
UINT8 bDescriptorType;
|
||||||
|
UINT8 bEndpointAddress;
|
||||||
|
UINT8 bmAttributes;
|
||||||
|
UINT16 wMaxPacketSize;
|
||||||
|
UINT8 bInterval;
|
||||||
|
};
|
||||||
|
|
||||||
|
enum USBPid {
|
||||||
|
SetupPid=0,
|
||||||
|
OutPid,
|
||||||
|
InPid
|
||||||
|
};
|
||||||
|
|
||||||
|
enum USBRequestCode {
|
||||||
|
GET_STATUS=0,
|
||||||
|
CLEAR_FEATURE=1,
|
||||||
|
SET_FEATURE=3,
|
||||||
|
SET_ADDRESS=5,
|
||||||
|
GET_DESCRIPTOR=6,
|
||||||
|
SET_DESCRIPTOR=7,
|
||||||
|
GET_CONFIGURATION=8,
|
||||||
|
SET_CONFIGURATION=9,
|
||||||
|
GET_INTERFACE=10,
|
||||||
|
SET_INTERFACE=11,
|
||||||
|
SYNCH_FRAME=12
|
||||||
|
};
|
||||||
|
|
||||||
|
enum USBDescriptorType {
|
||||||
|
DEVICE=1,
|
||||||
|
CONFIGURATION=2,
|
||||||
|
STRING=3,
|
||||||
|
INTERFACE=4,
|
||||||
|
ENDPOINT=5
|
||||||
|
};
|
||||||
|
|
||||||
|
enum USBRequestType
|
||||||
|
{
|
||||||
|
StandardType=0,
|
||||||
|
ClassType,
|
||||||
|
VendorType,
|
||||||
|
ReservedType
|
||||||
|
};
|
||||||
|
|
||||||
|
enum USBRequestRecipient
|
||||||
|
{
|
||||||
|
DeviceRecipient=0,
|
||||||
|
InterfaceRecipient,
|
||||||
|
EndpointRecipient,
|
||||||
|
OtherRecipient
|
||||||
|
};
|
||||||
|
|
||||||
|
enum USBDeviceState
|
||||||
|
{
|
||||||
|
DefaultState,
|
||||||
|
AddressState,
|
||||||
|
ConfiguredState
|
||||||
|
};
|
||||||
|
|
||||||
|
enum USBControlDirection
|
||||||
|
{
|
||||||
|
HostToDevice=0,
|
||||||
|
DeviceToHost=1
|
||||||
|
};
|
||||||
|
|
||||||
|
enum USBEndpointType
|
||||||
|
{
|
||||||
|
ControlEndpoint=0,
|
||||||
|
IsochronousEndpoint,
|
||||||
|
BulkEndpoint,
|
||||||
|
InterruptEndpoint
|
||||||
|
};
|
||||||
|
|
||||||
|
struct usb_device_string
|
||||||
|
{
|
||||||
|
UINT8 *position;
|
||||||
|
int size;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct usb_device_interface_alternate
|
||||||
|
{
|
||||||
|
UINT8 *position;
|
||||||
|
int size;
|
||||||
|
USBStandardInterfaceDescriptor interface_descriptor;
|
||||||
|
std::forward_list<USBStandardEndpointDescriptor> endpoint_descriptors;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct usb_device_interface
|
||||||
|
{
|
||||||
|
UINT8 *position;
|
||||||
|
int size;
|
||||||
|
std::forward_list<usb_device_interface_alternate *> alternate_settings;
|
||||||
|
int selected_alternate;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct usb_device_configuration
|
||||||
|
{
|
||||||
|
USBStandardConfigurationDescriptor configuration_descriptor;
|
||||||
|
UINT8 *position;
|
||||||
|
int size;
|
||||||
|
std::forward_list<usb_device_interface *> interfaces;
|
||||||
|
};
|
||||||
|
|
||||||
|
class ohci_function_device; // forward declaration
|
||||||
|
|
||||||
|
class ohci_usb_controller : public device_t
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ohci_usb_controller(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||||
|
~ohci_usb_controller() {}
|
||||||
|
void usb_ohci_plug(int port, ohci_function_device *function);
|
||||||
|
void usb_ohci_device_address_changed(int old_address, int new_address);
|
||||||
|
|
||||||
|
template<class _Object> static devcb_base &set_interrupt_handler(device_t &device, _Object object) { return downcast<ohci_usb_controller &>(device).m_interrupt_handler.set_callback(object); }
|
||||||
|
|
||||||
|
DECLARE_READ32_MEMBER(read);
|
||||||
|
DECLARE_WRITE32_MEMBER(write);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// device-level overrides
|
||||||
|
virtual void device_start() override;
|
||||||
|
virtual void device_reset() override;
|
||||||
|
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void usb_ohci_interrupts();
|
||||||
|
void usb_ohci_read_endpoint_descriptor(UINT32 address);
|
||||||
|
void usb_ohci_writeback_endpoint_descriptor(UINT32 address);
|
||||||
|
void usb_ohci_read_transfer_descriptor(UINT32 address);
|
||||||
|
void usb_ohci_writeback_transfer_descriptor(UINT32 address);
|
||||||
|
void usb_ohci_read_isochronous_transfer_descriptor(UINT32 address);
|
||||||
|
void usb_ohci_writeback_isochronous_transfer_descriptor(UINT32 address);
|
||||||
|
cpu_device *m_maincpu;
|
||||||
|
//required_device<pic8259_device> pic8259_1;
|
||||||
|
struct {
|
||||||
|
UINT32 hc_regs[256];
|
||||||
|
struct {
|
||||||
|
ohci_function_device *function;
|
||||||
|
int address;
|
||||||
|
int delay;
|
||||||
|
} ports[4 + 1];
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
ohci_function_device *function;
|
||||||
|
int port;
|
||||||
|
} address[256];
|
||||||
|
emu_timer *timer;
|
||||||
|
int state;
|
||||||
|
UINT32 framenumber;
|
||||||
|
UINT32 nextinterupted;
|
||||||
|
UINT32 nextbulked;
|
||||||
|
int interruptbulkratio;
|
||||||
|
int writebackdonehadcounter;
|
||||||
|
address_space *space;
|
||||||
|
UINT8 buffer[1024];
|
||||||
|
OHCIEndpointDescriptor endpoint_descriptor;
|
||||||
|
OHCITransferDescriptor transfer_descriptor;
|
||||||
|
OHCIIsochronousTransferDescriptor isochronous_transfer_descriptor;
|
||||||
|
} ohcist;
|
||||||
|
devcb_write_line m_interrupt_handler;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern const device_type OHCI_USB_CONTROLLER;
|
||||||
|
|
||||||
|
#define MCFG_OHCI_USB_CONTROLLER_ADD(_tag) \
|
||||||
|
MCFG_DEVICE_ADD(_tag, OHCI_USB_CONTROLLER, 0)
|
||||||
|
#define MCFG_OHCI_USB_CONTROLLER_INTERRUPT_HANDLER(_devcb) \
|
||||||
|
devcb = &ohci_usb_controller::set_interrupt_handler(*device, DEVCB_##_devcb);
|
||||||
|
|
||||||
|
class ohci_function_device {
|
||||||
|
public:
|
||||||
|
ohci_function_device();
|
||||||
|
virtual void initialize(running_machine &machine, ohci_usb_controller *usb_bus_manager);
|
||||||
|
virtual void execute_reset();
|
||||||
|
virtual void execute_connect() {};
|
||||||
|
virtual void execute_disconnect() {};
|
||||||
|
int execute_transfer(int endpoint, int pid, UINT8 *buffer, int size);
|
||||||
|
protected:
|
||||||
|
virtual int handle_nonstandard_request(int endpoint, USBSetupPacket *setup) { return -1; };
|
||||||
|
virtual int handle_get_status_request(int endpoint, USBSetupPacket *setup) { return 0; };
|
||||||
|
virtual int handle_clear_feature_request(int endpoint, USBSetupPacket *setup) { return 0; };
|
||||||
|
virtual int handle_set_feature_request(int endpoint, USBSetupPacket *setup) { return 0; };
|
||||||
|
virtual int handle_set_descriptor_request(int endpoint, USBSetupPacket *setup) { return 0; };
|
||||||
|
virtual int handle_synch_frame_request(int endpoint, USBSetupPacket *setup) { return 0; };
|
||||||
|
virtual void handle_status_stage(int endpoint) { return; };
|
||||||
|
virtual int handle_bulk_pid(int endpoint, int pid, UINT8 *buffer, int size) { return 0; };
|
||||||
|
virtual int handle_interrupt_pid(int endpoint, int pid, UINT8 *buffer, int size) { return 0; };
|
||||||
|
virtual int handle_isochronous_pid(int endpoint, int pid, UINT8 *buffer, int size) { return 0; };
|
||||||
|
|
||||||
|
void add_device_descriptor(const USBStandardDeviceDescriptor &descriptor);
|
||||||
|
void add_configuration_descriptor(const USBStandardConfigurationDescriptor &descriptor);
|
||||||
|
void add_interface_descriptor(const USBStandardInterfaceDescriptor &descriptor);
|
||||||
|
void add_endpoint_descriptor(const USBStandardEndpointDescriptor &descriptor);
|
||||||
|
void add_string_descriptor(const UINT8 *descriptor);
|
||||||
|
void select_configuration(int index);
|
||||||
|
void select_alternate(int interfacei, int index);
|
||||||
|
int find_alternate(int interfacei);
|
||||||
|
UINT8 *position_device_descriptor(int &size);
|
||||||
|
UINT8 *position_configuration_descriptor(int index, int &size);
|
||||||
|
UINT8 *position_string_descriptor(int index, int &size);
|
||||||
|
ohci_usb_controller *busmanager;
|
||||||
|
struct {
|
||||||
|
int type;
|
||||||
|
int controldirection;
|
||||||
|
int controltype;
|
||||||
|
int controlrecipient;
|
||||||
|
int remain;
|
||||||
|
UINT8 *position;
|
||||||
|
UINT8 buffer[128];
|
||||||
|
} endpoints[256];
|
||||||
|
int state;
|
||||||
|
bool settingaddress;
|
||||||
|
int newaddress;
|
||||||
|
int address;
|
||||||
|
int configurationvalue;
|
||||||
|
UINT8 *descriptors;
|
||||||
|
int descriptors_pos;
|
||||||
|
bool wantstatuscallback;
|
||||||
|
USBStandardDeviceDescriptor device_descriptor;
|
||||||
|
std::forward_list<usb_device_configuration *> configurations;
|
||||||
|
std::forward_list<usb_device_string *> device_strings;
|
||||||
|
usb_device_configuration *latest_configuration;
|
||||||
|
usb_device_interface_alternate *latest_alternate;
|
||||||
|
usb_device_configuration *selected_configuration;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern const device_type OHCI_GAME_CONTROLLER;
|
||||||
|
|
||||||
|
class ohci_game_controller_device : public device_t, public ohci_function_device
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ohci_game_controller_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||||
|
void initialize(running_machine &machine, ohci_usb_controller *usb_bus_manager) override;
|
||||||
|
int handle_nonstandard_request(int endpoint, USBSetupPacket *setup) override;
|
||||||
|
int handle_interrupt_pid(int endpoint, int pid, UINT8 *buffer, int size) override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void device_start() override;
|
||||||
|
virtual ioport_constructor device_input_ports() const override;
|
||||||
|
private:
|
||||||
|
static const USBStandardDeviceDescriptor devdesc;
|
||||||
|
static const USBStandardConfigurationDescriptor condesc;
|
||||||
|
static const USBStandardInterfaceDescriptor intdesc;
|
||||||
|
static const USBStandardEndpointDescriptor enddesc82;
|
||||||
|
static const USBStandardEndpointDescriptor enddesc02;
|
||||||
|
required_ioport m_ThumbstickLh; // left analog thumbstick horizontal movement
|
||||||
|
required_ioport m_ThumbstickLv; // left analog thumbstick vertical movement
|
||||||
|
required_ioport m_ThumbstickRh; // right analog thumbstick horizontal movement
|
||||||
|
required_ioport m_ThumbstickRv; // right analog thumbstick vertical movement
|
||||||
|
required_ioport m_DPad; // pressure sensitive directional pad
|
||||||
|
required_ioport m_TriggerL; // analog trigger
|
||||||
|
required_ioport m_TriggerR; // analog trigger
|
||||||
|
required_ioport m_Buttons; // digital buttons
|
||||||
|
required_ioport m_AGreen; // analog button
|
||||||
|
required_ioport m_BRed; // analog button
|
||||||
|
required_ioport m_XBlue; // analog button
|
||||||
|
required_ioport m_YYellow; // analog button
|
||||||
|
required_ioport m_Black; // analog button
|
||||||
|
required_ioport m_White; // analog button
|
||||||
|
};
|
File diff suppressed because it is too large
Load Diff
1540
src/mame/machine/xbox_usb.cpp
Normal file
1540
src/mame/machine/xbox_usb.cpp
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user