mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-27 22:12:25 +00:00
added start of usb device support
This commit is contained in:
parent
f071301b7d
commit
1f891e6809
3 changed files with 191 additions and 0 deletions
11
source/Cosmos/Cosmos.Hardware/PC/Bus/USB/USBHost.cs
Normal file
11
source/Cosmos/Cosmos.Hardware/PC/Bus/USB/USBHost.cs
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace Cosmos.Hardware.PC.Bus.USB
|
||||
{
|
||||
public abstract class USBHost : Device
|
||||
{
|
||||
}
|
||||
}
|
||||
38
source/Cosmos/Cosmos.Hardware/PC/Bus/USB/USBHostOHCI.cs
Normal file
38
source/Cosmos/Cosmos.Hardware/PC/Bus/USB/USBHostOHCI.cs
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace Cosmos.Hardware.PC.Bus.USB
|
||||
{
|
||||
public class USBHostOHCI : USBHost
|
||||
{
|
||||
public static void ScanDevices()
|
||||
{
|
||||
foreach (PCIDevice pci in PCIBus.Devices)
|
||||
{
|
||||
if (pci.ClassCode == 0x0c && //bus
|
||||
pci.SubClass == 0x03 && //usb
|
||||
pci.ProgIF == 0x10) //ohci :D
|
||||
{
|
||||
//(as this is an open standard, vendor/device specific implementations should all work the same)
|
||||
Device.Add(new USBHostOHCI(pci));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private PCIDeviceNormal mydevice;
|
||||
private USBHostOHCIRegisters regs;
|
||||
public USBHostOHCI(PCIDevice pcidev)
|
||||
{
|
||||
mydevice = pcidev as PCIDeviceNormal;
|
||||
regs = new USBHostOHCIRegisters(pcidev.GetAddressSpace(0) as MemoryAddressSpace);
|
||||
}
|
||||
|
||||
|
||||
public override string Name
|
||||
{
|
||||
get { throw new NotImplementedException(); }
|
||||
}
|
||||
}
|
||||
}
|
||||
142
source/Cosmos/Cosmos.Hardware/PC/Bus/USB/USBHostOHCIRegisters.cs
Normal file
142
source/Cosmos/Cosmos.Hardware/PC/Bus/USB/USBHostOHCIRegisters.cs
Normal file
|
|
@ -0,0 +1,142 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Cosmos.Hardware.PC.Bus;
|
||||
|
||||
namespace Cosmos.Hardware.PC.Bus.USB
|
||||
{
|
||||
public class USBHostOHCIRegisters
|
||||
{
|
||||
private MemoryAddressSpace regs;
|
||||
public USBHostOHCIRegisters(MemoryAddressSpace regs)
|
||||
{
|
||||
this.regs = regs;
|
||||
}
|
||||
|
||||
public UInt32 HcRevision { get { return regs.Read32Unchecked(0x0); } }
|
||||
public UInt32 HcControl { get { return regs.Read32Unchecked(0x4); } set { regs.Write32Unchecked(0x4, value); } }
|
||||
public UInt32 HcCommandStatus { get { return regs.Read32Unchecked(0x8); } set { regs.Write32Unchecked(0x8, value); } }
|
||||
public UInt32 HcInterruptStatus { get { return regs.Read32Unchecked(0xC); } set { regs.Write32Unchecked(0xC, value); } }
|
||||
public UInt32 HcInterruptEnable { get { return regs.Read32Unchecked(0x10); } set { regs.Write32Unchecked(0x10, value); } }
|
||||
public UInt32 HcInterruptDisable { get { return regs.Read32Unchecked(0x14); } set { regs.Write32Unchecked(0x14, value); } }
|
||||
public UInt32 HcHCCA { get { return regs.Read32Unchecked(0x18); } set { regs.Write32Unchecked(0x18, value); } }
|
||||
public UInt32 HcPeriodCurrentED { get { return regs.Read32Unchecked(0x1C); } set { regs.Write32Unchecked(0x1C, value); } }
|
||||
public UInt32 HcControlHeadED { get { return regs.Read32Unchecked(0x20); } set { regs.Write32Unchecked(0x20, value); } }
|
||||
public UInt32 HcControlCurrentED { get { return regs.Read32Unchecked(0x24); } set { regs.Write32Unchecked(0x24, value); } }
|
||||
public UInt32 HcBulkHeadED { get { return regs.Read32Unchecked(0x28); } set { regs.Write32Unchecked(0x28, value); } }
|
||||
public UInt32 HcBulkCurrentED { get { return regs.Read32Unchecked(0x2C); } set { regs.Write32Unchecked(0x2C, value); } }
|
||||
public UInt32 HcDoneHead { get { return regs.Read32Unchecked(0x30); } set { regs.Write32Unchecked(0x30, value); } }
|
||||
public UInt32 HcFmInterval { get { return regs.Read32Unchecked(0x34); } set { regs.Write32Unchecked(0x34, value); } }
|
||||
public UInt32 HcFmRemaining { get { return regs.Read32Unchecked(0x38); } set { regs.Write32Unchecked(0x38, value); } }
|
||||
public UInt32 HcFmNumber { get { return regs.Read32Unchecked(0x3C); } set { regs.Write32Unchecked(0x3C, value); } }
|
||||
public UInt32 HcPeriodicStart { get { return regs.Read32Unchecked(0x40); } set { regs.Write32Unchecked(0x40, value); } }
|
||||
public UInt32 HcLSThreshold { get { return regs.Read32Unchecked(0x44); } set { regs.Write32Unchecked(0x44, value); } }
|
||||
public UInt32 HcRhDescriptorA { get { return regs.Read32Unchecked(0x48); } set { regs.Write32Unchecked(0x48, value); } }
|
||||
public UInt32 HcRhDescriptorB { get { return regs.Read32Unchecked(0x4C); } set { regs.Write32Unchecked(0x4C, value); } }
|
||||
public UInt32 HcRhStatus { get { return regs.Read32Unchecked(0x50); } set { regs.Write32Unchecked(0x50, value); } }
|
||||
|
||||
}
|
||||
|
||||
public struct HcRevisionReg
|
||||
{
|
||||
private UInt32 data;
|
||||
private HcRevisionReg(UInt32 a)
|
||||
{
|
||||
this.data = a;
|
||||
}
|
||||
|
||||
#region Implicit Conversions
|
||||
public static implicit operator UInt32(HcRevisionReg a)
|
||||
{
|
||||
return a.data;
|
||||
}
|
||||
|
||||
public static implicit operator HcRevisionReg(UInt32 u)
|
||||
{
|
||||
return new HcRevisionReg(u);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region FieldAccessors
|
||||
public byte Major
|
||||
{
|
||||
get { return (byte)((data & 0xf0) >> 4); }
|
||||
set { data = (data & 0xffffff0f) | (UInt32)((value & 0xf) << 4); }
|
||||
}
|
||||
public byte Minor
|
||||
{
|
||||
get { return (byte)(data & 0xf); }
|
||||
set { data = (data & 0xfffffff0) | (UInt32)(value & 0xf); }
|
||||
}
|
||||
#endregion
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return data.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
public struct HcControlReg
|
||||
{
|
||||
private UInt32 data;
|
||||
private HcControlReg(UInt32 a)
|
||||
{
|
||||
this.data = a;
|
||||
}
|
||||
|
||||
#region Implicit Conversions
|
||||
public static implicit operator UInt32(HcControlReg a)
|
||||
{
|
||||
return a.data;
|
||||
}
|
||||
|
||||
public static implicit operator HcControlReg(UInt32 u)
|
||||
{
|
||||
return new HcControlReg(u);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region FieldAccessors
|
||||
|
||||
public byte ControlBulkServiceRatio
|
||||
{
|
||||
get { return (byte)((data & 0x3)); }
|
||||
}
|
||||
public bool PeriodicListEnable
|
||||
{
|
||||
get { return (data & 0x4) == 0x4; }
|
||||
}
|
||||
public bool IsochronousEnable
|
||||
{
|
||||
get { return (data & 0x8) == 0x8; }
|
||||
}
|
||||
|
||||
public bool ControlListEnable
|
||||
{
|
||||
get { return (data & 0x10) == 0x10; }
|
||||
}
|
||||
public bool BulkListEnable
|
||||
{
|
||||
get { return (data & 0x20) == 0x20; }
|
||||
}
|
||||
|
||||
public USBStates HostControllerFunctionalState
|
||||
{
|
||||
get { return (USBStates)((data & 0xc0) >> 6); }
|
||||
set { data = data & 0xffffff3f | ((UInt32)value << 6); }
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return data.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
public enum USBStates : byte
|
||||
{
|
||||
Reset = 0, Resume = 1, Operational = 2, Suspend = 3
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue