Dropped support for USB1 device
This commit is contained in:
parent
3d18703c86
commit
d06c4d62ca
|
@ -66,7 +66,7 @@
|
|||
#define AC97_BASE 0xFEC00000
|
||||
#define AC97_SIZE 0x1000
|
||||
#define USB0_BASE 0xFED00000
|
||||
#define USB1_BASE 0xFED08000
|
||||
#define USB1_BASE 0xFED08000 // alpha kits only
|
||||
#define USB_SIZE 0x1000
|
||||
#define NVNet_BASE 0xFEF00000
|
||||
#define NVNet_SIZE 0x400
|
||||
|
@ -150,4 +150,4 @@ private:
|
|||
*/
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
@ -47,7 +47,6 @@ NVNetDevice* g_NVNet;
|
|||
NV2ADevice* g_NV2A;
|
||||
ADM1032Device* g_ADM1032;
|
||||
USBDevice* g_USB0;
|
||||
USBDevice* g_USB1;
|
||||
|
||||
MCPXRevision MCPXRevisionFromHardwareModel(HardwareModel hardwareModel)
|
||||
{
|
||||
|
@ -134,7 +133,6 @@ void InitXboxHardware(HardwareModel hardwareModel)
|
|||
g_ADM1032 = new ADM1032Device();
|
||||
if (bLLE_USB) {
|
||||
g_USB0 = new USBDevice();
|
||||
g_USB1 = new USBDevice();
|
||||
}
|
||||
|
||||
// Connect devices to SM bus
|
||||
|
@ -164,9 +162,13 @@ void InitXboxHardware(HardwareModel hardwareModel)
|
|||
//g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(5, 0)), g_NVAPU);
|
||||
//g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(6, 0)), g_AC97);
|
||||
g_PCIBus->ConnectDevice(PCI_DEVID(1, PCI_DEVFN(0, 0)), g_NV2A, NV2A_ADDR);
|
||||
if (bLLE_USB) {
|
||||
if (bLLE_USB) {
|
||||
// ergo720: according to some research done by LukeUsher, only Xbox Alpha Kits have a two HCs configuration. This seems to also be confirmed by the xboxdevwiki,
|
||||
// which states that it has a xircom PGPCI2(OPTI 82C861) 2 USB port PCI card -> 2 ports, not 4. Finally, I disassembled various xbe's and discovered that the number
|
||||
// of ports per HC is hardcoded as 4 in the driver instead of being detected at runtime by reading the HcRhDescriptorA register and so a game would have to be
|
||||
// recompiled to support 2 HCs, which further confirms the point. Because we are not going to emulate an Alpha Kit, we can simply ignore the USB1 device.
|
||||
|
||||
g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(2, 0)), g_USB0, USB0_BASE);
|
||||
g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(3, 0)), g_USB1, USB1_BASE);
|
||||
}
|
||||
|
||||
// TODO : Handle other SMBUS Addresses, like PIC_ADDRESS, XCALIBUR_ADDRESS
|
||||
|
|
|
@ -80,6 +80,5 @@ extern EEPROMDevice* g_EEPROM;
|
|||
extern NVNetDevice* g_NVNet;
|
||||
extern NV2ADevice* g_NV2A;
|
||||
extern USBDevice* g_USB0;
|
||||
extern USBDevice* g_USB1;
|
||||
|
||||
extern void InitXboxHardware(HardwareModel hardwareModel);
|
||||
extern void InitXboxHardware(HardwareModel hardwareModel);
|
||||
|
|
|
@ -87,8 +87,7 @@ namespace xboxkrnl
|
|||
|
||||
|
||||
// To avoid including Xbox.h
|
||||
extern USBDevice* g_USB0;
|
||||
extern USBDevice* g_USB1;
|
||||
extern USBDevice* g_USB0;
|
||||
|
||||
Hub* g_HubObjArray[4] = { nullptr };
|
||||
|
||||
|
@ -230,28 +229,24 @@ int Hub::UsbHubClaimPort(XboxDeviceState* dev, int port)
|
|||
|
||||
assert(dev->Port == nullptr);
|
||||
|
||||
m_UsbDev = g_USB0;
|
||||
it = m_UsbDev->m_FreePorts.end();
|
||||
i = 0;
|
||||
if (port > 2) {
|
||||
m_UsbDev = g_USB1;
|
||||
}
|
||||
else {
|
||||
m_UsbDev = g_USB0;
|
||||
}
|
||||
|
||||
while (m_UsbDev->m_HostController->m_bFrameTime) { Sleep(1); }
|
||||
m_UsbDev->m_HostController->m_bFrameTime = true;
|
||||
|
||||
for (auto usb_port : m_UsbDev->m_FreePorts) {
|
||||
if (usb_port->Path == std::to_string(port)) {
|
||||
it = m_UsbDev->m_FreePorts.begin() + i;
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
if (i == 2) {
|
||||
if (it == m_UsbDev->m_FreePorts.end()) {
|
||||
EmuWarning("Port requested %d not found (in use?)", port);
|
||||
return -1;
|
||||
}
|
||||
it = m_UsbDev->m_FreePorts.begin() + i;
|
||||
dev->Port = *it;
|
||||
(*it)->Dev = dev;
|
||||
m_UsbDev->m_FreePorts.erase(it);
|
||||
|
|
|
@ -207,12 +207,11 @@ namespace xboxkrnl
|
|||
#endif // DEBUG
|
||||
|
||||
|
||||
OHCI::OHCI(int Irq, USBDevice* UsbObj)
|
||||
OHCI::OHCI(USBDevice* UsbObj)
|
||||
{
|
||||
int offset = 0;
|
||||
USBPortOps* ops;
|
||||
|
||||
m_IrqNum = Irq;
|
||||
m_UsbDevice = UsbObj;
|
||||
m_bFrameTime = false;
|
||||
ops = new USBPortOps();
|
||||
|
@ -226,12 +225,8 @@ OHCI::OHCI(int Irq, USBDevice* UsbObj)
|
|||
ops->complete = std::bind(&OHCI::OHCI_AsyncCompletePacket, this, _1, _2);
|
||||
}
|
||||
|
||||
if (m_IrqNum == 9) {
|
||||
offset = 2;
|
||||
}
|
||||
|
||||
for (int i = 0; i < 2; i++) {
|
||||
m_UsbDevice->USB_RegisterPort(&m_Registers.RhPort[i].UsbPort, i + offset, USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL, ops);
|
||||
for (int i = 0; i < 4; i++) {
|
||||
m_UsbDevice->USB_RegisterPort(&m_Registers.RhPort[i].UsbPort, i, USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL, ops);
|
||||
}
|
||||
OHCI_PacketInit(&m_UsbPacket);
|
||||
|
||||
|
@ -863,7 +858,7 @@ XboxDeviceState* OHCI::OHCI_FindDevice(uint8_t Addr)
|
|||
XboxDeviceState* dev;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 2; i++) {
|
||||
for (i = 0; i < 4; i++) {
|
||||
if ((m_Registers.RhPort[i].HcRhPortStatus & OHCI_PORT_PES) == 0) {
|
||||
continue; // port is disabled
|
||||
}
|
||||
|
@ -905,13 +900,13 @@ void OHCI::OHCI_StateReset()
|
|||
m_Registers.HcPeriodicStart = 0;
|
||||
m_Registers.HcLSThreshold = OHCI_LS_THRESH;
|
||||
|
||||
m_Registers.HcRhDescriptorA = OHCI_RHA_NPS | 2; // The xbox lacks the hw to switch off the power on the ports and has 2 ports per HC
|
||||
m_Registers.HcRhDescriptorA = OHCI_RHA_NOCP | OHCI_RHA_NPS | 4; // The xbox lacks the hw to switch off the power on the ports and has 4 ports per HC
|
||||
m_Registers.HcRhDescriptorB = 0; // The attached devices are removable and use PowerSwitchingMode to control the power on the ports
|
||||
m_Registers.HcRhStatus = 0;
|
||||
|
||||
m_DoneCount = 7;
|
||||
|
||||
for (int i = 0; i < 2; i++)
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
OHCIPort* Port = &m_Registers.RhPort[i];
|
||||
Port->HcRhPortStatus = 0;
|
||||
|
@ -1132,21 +1127,21 @@ uint32_t OHCI::OHCI_ReadRegister(xbaddr Addr)
|
|||
// Always report that the port power is on since the Xbox cannot switch off the electrical current to it
|
||||
case 21: // RhPort 0
|
||||
ret = m_Registers.RhPort[0].HcRhPortStatus | OHCI_PORT_PPS;
|
||||
TestOut("m_Registers.RhPort[0].HcRhPortStatus: 0x%X\n", m_Registers.RhPort[0].HcRhPortStatus | OHCI_PORT_PPS);
|
||||
TestOut("m_Registers.RhPort[0].HcRhPortStatus: 0x%X\n", ret);
|
||||
break;
|
||||
|
||||
case 22: // RhPort 1
|
||||
ret = m_Registers.RhPort[1].HcRhPortStatus | OHCI_PORT_PPS;
|
||||
TestOut("m_Registers.RhPort[1].HcRhPortStatus: 0x%X\n", m_Registers.RhPort[1].HcRhPortStatus | OHCI_PORT_PPS);
|
||||
TestOut("m_Registers.RhPort[1].HcRhPortStatus: 0x%X\n", ret);
|
||||
break;
|
||||
|
||||
case 23:
|
||||
ret = 0 | OHCI_PORT_PPS;
|
||||
ret = m_Registers.RhPort[2].HcRhPortStatus | OHCI_PORT_PPS;
|
||||
TestOut("m_Registers.RhPort[2].HcRhPortStatus: 0x%X\n", ret);
|
||||
break;
|
||||
|
||||
case 24:
|
||||
ret = 0 | OHCI_PORT_PPS;
|
||||
ret = m_Registers.RhPort[3].HcRhPortStatus | OHCI_PORT_PPS;
|
||||
TestOut("m_Registers.RhPort[3].HcRhPortStatus: 0x%X\n", ret);
|
||||
break;
|
||||
|
||||
|
@ -1321,12 +1316,16 @@ void OHCI::OHCI_WriteRegister(xbaddr Addr, uint32_t Value)
|
|||
TestOut("W m_Registers.RhPort 1: 0x%X\n", m_Registers.RhPort[1].HcRhPortStatus);
|
||||
break;
|
||||
|
||||
case 23:
|
||||
TestOut("W m_Registers.RhPort 2: 0x%X\n", Value);
|
||||
case 23: // RhPort 2
|
||||
TestOut("W m_Registers.RhPort 2: 0x%X\n", Value);
|
||||
OHCI_PortSetStatus(2, Value);
|
||||
TestOut("W m_Registers.RhPort 2: 0x%X\n", m_Registers.RhPort[2].HcRhPortStatus);
|
||||
break;
|
||||
|
||||
case 24:
|
||||
TestOut("W m_Registers.RhPort 3: 0x%X\n", Value);
|
||||
case 24: // RhPort 3
|
||||
TestOut("W m_Registers.RhPort 3: 0x%X\n", Value);
|
||||
OHCI_PortSetStatus(3, Value);
|
||||
TestOut("W m_Registers.RhPort 3: 0x%X\n", m_Registers.RhPort[3].HcRhPortStatus);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -1338,8 +1337,8 @@ void OHCI::OHCI_WriteRegister(xbaddr Addr, uint32_t Value)
|
|||
void OHCI::OHCI_UpdateInterrupt()
|
||||
{
|
||||
if ((m_Registers.HcInterrupt & OHCI_INTR_MIE) && (m_Registers.HcInterruptStatus & m_Registers.HcInterrupt)) {
|
||||
HalSystemInterrupts[m_IrqNum].Assert(false);
|
||||
HalSystemInterrupts[m_IrqNum].Assert(true);
|
||||
HalSystemInterrupts[1].Assert(false);
|
||||
HalSystemInterrupts[1].Assert(true);
|
||||
TestOut("Fired interrupt -> m_Registers.HcInterruptStatus is 0x%X\n", m_Registers.HcInterruptStatus);
|
||||
}
|
||||
}
|
||||
|
@ -1378,7 +1377,7 @@ void OHCI::OHCI_StopEndpoints()
|
|||
XboxDeviceState* dev;
|
||||
int i, j;
|
||||
|
||||
for (i = 0; i < 2; i++) {
|
||||
for (i = 0; i < 4; i++) {
|
||||
dev = m_Registers.RhPort[i].UsbPort.Dev;
|
||||
if (dev && dev->Attached) {
|
||||
m_UsbDevice->USB_DeviceEPstopped(dev, &dev->EP_ctl);
|
||||
|
@ -1404,7 +1403,7 @@ void OHCI::OHCI_SetHubStatus(uint32_t Value)
|
|||
if (Value & OHCI_RHS_LPS) {
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 2; i++) {
|
||||
for (i = 0; i < 4; i++) {
|
||||
OHCI_PortPower(i, 0);
|
||||
}
|
||||
DbgPrintf("%s: powered down all ports\n", LOG_STR_OHCI);
|
||||
|
@ -1413,7 +1412,7 @@ void OHCI::OHCI_SetHubStatus(uint32_t Value)
|
|||
if (Value & OHCI_RHS_LPSC) {
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 2; i++) {
|
||||
for (i = 0; i < 4; i++) {
|
||||
OHCI_PortPower(i, 1);
|
||||
}
|
||||
DbgPrintf("%s: powered up all ports\n", LOG_STR_OHCI);
|
||||
|
|
|
@ -133,7 +133,7 @@ struct OHCI_Registers
|
|||
uint32_t HcRhDescriptorA;
|
||||
uint32_t HcRhDescriptorB;
|
||||
uint32_t HcRhStatus;
|
||||
OHCIPort RhPort[2]; // 2 ports per HC, for a total of 4 USB ports
|
||||
OHCIPort RhPort[4]; // 4 ports per HC
|
||||
};
|
||||
|
||||
|
||||
|
@ -146,7 +146,7 @@ class OHCI
|
|||
std::atomic_bool m_bFrameTime;
|
||||
|
||||
// constructor
|
||||
OHCI(int Irqn, USBDevice* UsbObj);
|
||||
OHCI(USBDevice* UsbObj);
|
||||
// destructor
|
||||
~OHCI() {}
|
||||
// read a register
|
||||
|
@ -174,8 +174,6 @@ class OHCI
|
|||
uint8_t m_UsbBuffer[8192] = {};
|
||||
// the value of HcControl in the previous frame
|
||||
uint32_t m_OldHcControl;
|
||||
// irq number
|
||||
int m_IrqNum;
|
||||
// Done Queue Interrupt Counter
|
||||
int m_DoneCount;
|
||||
// the address of the pending TD
|
||||
|
|
|
@ -69,14 +69,8 @@ void USBDevice::Init(unsigned int address)
|
|||
m_DeviceId = 0x01C2;
|
||||
m_VendorId = PCI_VENDOR_ID_NVIDIA;
|
||||
|
||||
if (address == USB0_BASE) {
|
||||
m_HostController = new OHCI(1, this);
|
||||
m_PciPath = "pci.0:02.0";
|
||||
return;
|
||||
}
|
||||
|
||||
m_HostController = new OHCI(9, this);
|
||||
m_PciPath = "pci.0:03.0";
|
||||
m_HostController = new OHCI(this);
|
||||
m_PciPath = "pci.0:02.0";
|
||||
}
|
||||
|
||||
uint32_t USBDevice::MMIORead(int barIndex, uint32_t addr, unsigned size)
|
||||
|
@ -739,7 +733,6 @@ void USBDevice::USB_CreateSerial(XboxDeviceState* dev, std::string&& str)
|
|||
{
|
||||
const USBDesc* desc = USBDesc_GetUsbDeviceDesc(dev);
|
||||
int index = desc->id.iSerialNumber;
|
||||
std::string str2;
|
||||
|
||||
assert(index != 0 && str.empty() == false);
|
||||
str += '-';
|
||||
|
@ -995,7 +988,7 @@ int USBDevice::USBDesc_HandleControl(XboxDeviceState* dev, USBPacket *p,
|
|||
// From the standard: "This request allows the host to select an alternate setting for the specified interface"
|
||||
// wValue = Alternative Setting; wIndex = Interface
|
||||
ret = USBDesc_SetInterface(dev, index, value);
|
||||
DbgPrintf("%s; received standard SetInterface() request for device at address 0x%X. Interface selected is %d, Alternative Setting \
|
||||
DbgPrintf("%s: received standard SetInterface() request for device at address 0x%X. Interface selected is %d, Alternative Setting \
|
||||
is %d and returned %d\n", LOG_STR_USB, dev->Addr, index, value, ret);
|
||||
break;
|
||||
}
|
||||
|
@ -1252,7 +1245,7 @@ int USBDevice::USB_ReadStringDesc(XboxDeviceState* dev, int index, uint8_t* dest
|
|||
// From the standard: "The UNICODE string descriptor is not NULL-terminated. The string length is
|
||||
// computed by subtracting two from the value of the first byte of the descriptor"
|
||||
|
||||
bLength = strlen(str) * 2 + 2;
|
||||
bLength = std::strlen(str) * 2 + 2;
|
||||
dest[0] = bLength;
|
||||
dest[1] = USB_DT_STRING;
|
||||
i = 0; pos = 2;
|
||||
|
|
|
@ -106,7 +106,7 @@ class USBDevice : public PCIDevice {
|
|||
void USB_PacketCheckState(USBPacket* p, USBPacketState expected);
|
||||
// process the packet
|
||||
void USB_ProcessOne(USBPacket* p);
|
||||
//
|
||||
// TODO
|
||||
void USB_DoParameter(XboxDeviceState* s, USBPacket* p);
|
||||
// process a setup token
|
||||
void USB_DoTokenSetup(XboxDeviceState* s, USBPacket* p);
|
||||
|
|
|
@ -58,6 +58,8 @@ namespace xboxkrnl
|
|||
#define HID_SET_REPORT 0x09
|
||||
#define XID_GET_CAPABILITIES 0x01
|
||||
|
||||
// To avoid including Xbox.h
|
||||
extern USBDevice* g_USB0;
|
||||
|
||||
XidGamepad* g_XidControllerObjArray[4];
|
||||
|
||||
|
@ -240,28 +242,26 @@ int XidGamepad::UsbXidClaimPort(XboxDeviceState* dev, int port)
|
|||
|
||||
assert(dev->Port == nullptr);
|
||||
|
||||
for (int j = 0; j < 4; j++) {
|
||||
if (g_HubObjArray[j]) {
|
||||
i = 0;
|
||||
for (auto usb_port : g_HubObjArray[j]->m_UsbDev->m_FreePorts) {
|
||||
if (usb_port->Path == (std::to_string(port) + ".2")) {
|
||||
m_UsbDev = g_HubObjArray[j]->m_UsbDev;
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (m_UsbDev == nullptr) {
|
||||
EmuWarning("Port requested %d.2 not found (in use?)", port);
|
||||
return -1;
|
||||
}
|
||||
m_UsbDev = g_USB0;
|
||||
it = m_UsbDev->m_FreePorts.end();
|
||||
i = 0;
|
||||
|
||||
while (m_UsbDev->m_HostController->m_bFrameTime) { Sleep(1); }
|
||||
m_UsbDev->m_HostController->m_bFrameTime = true;
|
||||
|
||||
for (auto usb_port : m_UsbDev->m_FreePorts) {
|
||||
if (usb_port->Path == (std::to_string(port) + ".2")) {
|
||||
it = m_UsbDev->m_FreePorts.begin() + i;
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
if (it == m_UsbDev->m_FreePorts.end()) {
|
||||
EmuWarning("Port requested %d.2 not found (in use?)", port);
|
||||
return -1;
|
||||
}
|
||||
|
||||
m_Port = port;
|
||||
it = m_UsbDev->m_FreePorts.begin() + i;
|
||||
dev->Port = *it;
|
||||
(*it)->Dev = dev;
|
||||
m_UsbDev->m_FreePorts.erase(it);
|
||||
|
|
Loading…
Reference in New Issue