mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-24 12:35:31 +00:00
[AHCI] AHCI Registers
This commit is contained in:
parent
055b13498c
commit
e3930ac08f
1 changed files with 968 additions and 0 deletions
968
source/Cosmos.HAL2/BlockDevice/Registers/AHCIRegs.cs
Normal file
968
source/Cosmos.HAL2/BlockDevice/Registers/AHCIRegs.cs
Normal file
|
|
@ -0,0 +1,968 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using Cosmos.Core;
|
||||||
|
|
||||||
|
namespace Cosmos.HAL.BlockDevice.Registers
|
||||||
|
{
|
||||||
|
// Registers
|
||||||
|
public class GenericRegisters
|
||||||
|
{
|
||||||
|
private MemoryBlock xBlock;
|
||||||
|
private uint xAddress;
|
||||||
|
public GenericRegisters(uint aAddress)
|
||||||
|
{
|
||||||
|
xAddress = aAddress;
|
||||||
|
xBlock = new MemoryBlock(aAddress, 0x100);
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint Capabilities
|
||||||
|
{
|
||||||
|
get { return xBlock[0x00]; }
|
||||||
|
set { xBlock[0x00] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint GlobalHostControl
|
||||||
|
{
|
||||||
|
get { return xBlock[0x04]; }
|
||||||
|
set { xBlock[0x04] = value; }
|
||||||
|
}
|
||||||
|
public uint InterruptStatus
|
||||||
|
{
|
||||||
|
get { return xBlock[0x08]; }
|
||||||
|
set { xBlock[0x08] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint ImplementedPorts
|
||||||
|
{
|
||||||
|
get { return xBlock[0x0C]; }
|
||||||
|
set { xBlock[0x0C] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint AHCIVersion
|
||||||
|
{
|
||||||
|
get { return xBlock[0x10]; }
|
||||||
|
set { xBlock[0x10] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint CCC_Control
|
||||||
|
{
|
||||||
|
get { return xBlock[0x14]; }
|
||||||
|
set { xBlock[0x14] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint CCC_Ports
|
||||||
|
{
|
||||||
|
get { return xBlock[0x18]; }
|
||||||
|
set { xBlock[0x18] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint EM_Location
|
||||||
|
{
|
||||||
|
get { return xBlock[0x1C]; }
|
||||||
|
set { xBlock[0x1C] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint EM_Control
|
||||||
|
{
|
||||||
|
get { return xBlock[0x20]; }
|
||||||
|
set { xBlock[0x20] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint ExtendedCapabilities
|
||||||
|
{
|
||||||
|
get { return xBlock[0x24]; }
|
||||||
|
set { xBlock[0x24] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint BIOSHandOffStatus
|
||||||
|
{
|
||||||
|
get { return xBlock[0x28]; }
|
||||||
|
set { xBlock[0x28] = value; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class PortRegisters
|
||||||
|
{
|
||||||
|
private MemoryBlock xBlock;
|
||||||
|
private uint xAddress;
|
||||||
|
public uint mPortNumber;
|
||||||
|
public PortType mPortType = PortType.Nothing;
|
||||||
|
public bool Active;
|
||||||
|
public PortRegisters(uint aAddress, uint aPortNumber)
|
||||||
|
{
|
||||||
|
xAddress = aAddress;
|
||||||
|
mPortNumber = aPortNumber;
|
||||||
|
xBlock = new MemoryBlock(aAddress, 0x80);
|
||||||
|
Active = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint CLB
|
||||||
|
{
|
||||||
|
get { return xBlock[0x00]; }
|
||||||
|
set { xBlock[0x00] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint CLBU
|
||||||
|
{
|
||||||
|
get { return xBlock[0x04]; }
|
||||||
|
set { xBlock[0x04] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint FB
|
||||||
|
{
|
||||||
|
get { return xBlock[0x08]; }
|
||||||
|
set { xBlock[0x08] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint FBU
|
||||||
|
{
|
||||||
|
get { return xBlock[0x0C]; }
|
||||||
|
set { xBlock[0x0C] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint IS
|
||||||
|
{
|
||||||
|
get { return xBlock[0x10]; }
|
||||||
|
set { xBlock[0x10] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint IE
|
||||||
|
{
|
||||||
|
get { return xBlock[0x14]; }
|
||||||
|
set { xBlock[0x14] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint CMD
|
||||||
|
{
|
||||||
|
get { return xBlock[0x18]; }
|
||||||
|
set { xBlock[0x18] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint Reserved
|
||||||
|
{
|
||||||
|
get { return xBlock[0x1C]; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint TFD
|
||||||
|
{
|
||||||
|
get { return xBlock[0x20]; }
|
||||||
|
set { xBlock[0x20] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint SIG
|
||||||
|
{
|
||||||
|
get { return xBlock[0x24]; }
|
||||||
|
set { xBlock[0x24] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint SSTS
|
||||||
|
{
|
||||||
|
get { return xBlock[0x28]; }
|
||||||
|
set { xBlock[0x28] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint SCTL
|
||||||
|
{
|
||||||
|
get { return xBlock[0x2C]; }
|
||||||
|
set { xBlock[0x2C] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint SERR
|
||||||
|
{
|
||||||
|
get { return xBlock[0x30]; }
|
||||||
|
set { xBlock[0x30] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint SACT
|
||||||
|
{
|
||||||
|
get { return xBlock[0x34]; }
|
||||||
|
set { xBlock[0x34] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint CI
|
||||||
|
{
|
||||||
|
get { return xBlock[0x38]; }
|
||||||
|
set { xBlock[0x38] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint SNTF
|
||||||
|
{
|
||||||
|
get { return xBlock[0x3C]; }
|
||||||
|
set { xBlock[0x3C] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint FBS
|
||||||
|
{
|
||||||
|
get { return xBlock[0x40]; }
|
||||||
|
set { xBlock[0x40] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint DEVSLP
|
||||||
|
{
|
||||||
|
get { return xBlock[0x44]; }
|
||||||
|
set { xBlock[0x44] = value; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Command List
|
||||||
|
public class HBACommandHeader
|
||||||
|
{
|
||||||
|
private MemoryBlock xBlock;
|
||||||
|
private uint xAddress;//
|
||||||
|
private uint xSlot;
|
||||||
|
public HBACommandHeader(uint aAddress, uint aSlot)
|
||||||
|
{
|
||||||
|
xAddress = aAddress;
|
||||||
|
xSlot = aSlot;
|
||||||
|
xBlock = new MemoryBlock(aAddress + (0x20 * aSlot), 0x20);
|
||||||
|
xBlock.Fill(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte CFL
|
||||||
|
{
|
||||||
|
get { return (byte)(xBlock.Bytes[0x00] & 0x1F); }
|
||||||
|
set { xBlock.Bytes[0x00] = value; }
|
||||||
|
}
|
||||||
|
public byte ATAPI
|
||||||
|
{
|
||||||
|
get { return (byte)((xBlock.Bytes[0x00] >> 5) & 1); }
|
||||||
|
set { xBlock.Bytes[0x00] |= (byte)(value << 5); }
|
||||||
|
}
|
||||||
|
public byte Write
|
||||||
|
{
|
||||||
|
get { return (byte)((xBlock.Bytes[0x00] >> 6) & 1); }
|
||||||
|
set { xBlock.Bytes[0x00] |= (byte)(value << 6); }
|
||||||
|
}
|
||||||
|
public byte Prefetchable
|
||||||
|
{
|
||||||
|
get { return (byte)((xBlock.Bytes[0x00] >> 7) & 1); }
|
||||||
|
set { xBlock.Bytes[0x00] |= (byte)(value << 7); }
|
||||||
|
}
|
||||||
|
public byte Reset
|
||||||
|
{
|
||||||
|
get { return (byte)((xBlock.Bytes[0x01]) & 1); }
|
||||||
|
set { xBlock.Bytes[0x01] |= (byte)(value); }
|
||||||
|
}
|
||||||
|
public byte BIST
|
||||||
|
{
|
||||||
|
get { return (byte)((xBlock.Bytes[0x01] >> 1) & 1); }
|
||||||
|
set { xBlock.Bytes[0x01] |= (byte)(value << 1); }
|
||||||
|
}
|
||||||
|
public byte ClearBusy
|
||||||
|
{
|
||||||
|
get { return (byte)((xBlock.Bytes[0x01] >> 2) & 1); }
|
||||||
|
set { xBlock.Bytes[0x01] |= (byte)(value << 2); }
|
||||||
|
}
|
||||||
|
public byte Reserved
|
||||||
|
{
|
||||||
|
get { return (byte)((xBlock.Bytes[0x01] >> 3) & 1); }
|
||||||
|
}
|
||||||
|
public byte PMP
|
||||||
|
{
|
||||||
|
get { return (byte)((xBlock.Bytes[0x01] >> 4) & 0x0F); }
|
||||||
|
set { xBlock.Bytes[0x01] = (byte)(value << 4); }
|
||||||
|
}
|
||||||
|
public ushort PRDTL
|
||||||
|
{
|
||||||
|
get { return (ushort)(xBlock.Words[0x02] & 0xFFFF); }
|
||||||
|
set { xBlock.Words[0x02] = (ushort)(value); }
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint PRDBC
|
||||||
|
{
|
||||||
|
get { return xBlock[0x04]; }
|
||||||
|
set { xBlock[0x04] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint CTBA
|
||||||
|
{
|
||||||
|
get { return xBlock[0x08] >> 7; }
|
||||||
|
set { xBlock[0x08] = (value << 7); }
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint CTBAU
|
||||||
|
{
|
||||||
|
get { return xBlock[0x0C]; }
|
||||||
|
set { xBlock[0x0C] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint Reserved1
|
||||||
|
{
|
||||||
|
get { return xBlock[0x10]; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint Reserved2
|
||||||
|
{
|
||||||
|
get { return xBlock[0x14]; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint Reserved3
|
||||||
|
{
|
||||||
|
get { return xBlock[0x18]; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint Reserved4
|
||||||
|
{
|
||||||
|
get { return xBlock[0x1C]; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class HBACommandTable
|
||||||
|
{
|
||||||
|
private MemoryBlock xBlock;
|
||||||
|
private uint xAddress;
|
||||||
|
private uint xSlot;
|
||||||
|
public HBACommandTable(uint aAddress, uint aSlot)
|
||||||
|
{
|
||||||
|
xAddress = aAddress;
|
||||||
|
xSlot = aSlot;
|
||||||
|
xBlock = new MemoryBlock(aAddress + (256 * xSlot), 0x80);
|
||||||
|
xBlock.Fill(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint CFIS
|
||||||
|
{
|
||||||
|
get { return xAddress; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint ACMD
|
||||||
|
{
|
||||||
|
get { return xAddress + 0x40; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint Reserved
|
||||||
|
{
|
||||||
|
get { return xBlock[0x50]; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public HBAPRDTEntry[] PRDTEntry;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class HBAPRDTEntry
|
||||||
|
{
|
||||||
|
private MemoryBlock xBlock;
|
||||||
|
private uint xAddress;
|
||||||
|
private uint xEntry;
|
||||||
|
public HBAPRDTEntry(uint aAddress, uint aEntry)
|
||||||
|
{
|
||||||
|
xAddress = aAddress;
|
||||||
|
xEntry = aEntry;
|
||||||
|
xBlock = new MemoryBlock(aAddress + (0x10 * xEntry), 0x10);
|
||||||
|
xBlock.Fill(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint DBA
|
||||||
|
{
|
||||||
|
get { return xBlock[0x00] >> 1; }
|
||||||
|
set { xBlock[0x00] = (uint)(value << 1); }
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint DBAU
|
||||||
|
{
|
||||||
|
get { return xBlock[0x04]; }
|
||||||
|
set { xBlock[0x04] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint Reserved
|
||||||
|
{
|
||||||
|
get { return xBlock[0x08]; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint DBC
|
||||||
|
{
|
||||||
|
get { return xBlock[0x0C] & 0x3FFFFF; }
|
||||||
|
set { xBlock[0x0C] = value; }
|
||||||
|
}
|
||||||
|
public uint Reserved1
|
||||||
|
{
|
||||||
|
get { return xBlock[0x0E] << 6; }
|
||||||
|
}
|
||||||
|
public byte InterruptOnCompletion
|
||||||
|
{
|
||||||
|
get { return (byte)(xBlock.Bytes[0x0F] >> 7); }
|
||||||
|
set { xBlock.Bytes[0x0F] |= (byte)(value << 7); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// FISes
|
||||||
|
public class FISRegisterH2D
|
||||||
|
{
|
||||||
|
private MemoryBlock xBlock;
|
||||||
|
private uint xAddress;
|
||||||
|
public FISRegisterH2D(uint aAddress)
|
||||||
|
{
|
||||||
|
xAddress = aAddress;
|
||||||
|
xBlock = new MemoryBlock(aAddress, 20);
|
||||||
|
xBlock.Fill(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte FISType
|
||||||
|
{
|
||||||
|
get { return (byte)(xBlock.Bytes[0x00]); }
|
||||||
|
set { xBlock.Bytes[0x00] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte IsCommand
|
||||||
|
{
|
||||||
|
get { return (byte)((xBlock.Bytes[0x01] >> 7)); }
|
||||||
|
set { xBlock.Bytes[0x01] |= (byte)(value << 7); }
|
||||||
|
}
|
||||||
|
public byte Command
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x02]; }
|
||||||
|
set { xBlock.Bytes[0x02] = value; }
|
||||||
|
}
|
||||||
|
public byte FeatureLow
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x03]; }
|
||||||
|
set { xBlock.Bytes[0x03] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte LBA0
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x04]; }
|
||||||
|
set { xBlock.Bytes[0x04] = value; }
|
||||||
|
}
|
||||||
|
public byte LBA1
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x05]; }
|
||||||
|
set { xBlock.Bytes[0x05] = value; }
|
||||||
|
}
|
||||||
|
public byte LBA2
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x06]; }
|
||||||
|
set { xBlock.Bytes[0x06] = value; }
|
||||||
|
}
|
||||||
|
public byte Device
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x07]; }
|
||||||
|
set { xBlock.Bytes[0x07] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte LBA3
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x08]; }
|
||||||
|
set { xBlock.Bytes[0x08] = value; }
|
||||||
|
}
|
||||||
|
public byte LBA4
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x09]; }
|
||||||
|
set { xBlock.Bytes[0x09] = value; }
|
||||||
|
}
|
||||||
|
public byte LBA5
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x0A]; }
|
||||||
|
set { xBlock.Bytes[0x0A] = value; }
|
||||||
|
}
|
||||||
|
public byte FeatureHigh
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x0B]; }
|
||||||
|
set { xBlock.Bytes[0x0B] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte CountL
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x0C]; }
|
||||||
|
set { xBlock.Bytes[0x0C] = value; }
|
||||||
|
}
|
||||||
|
public byte CountH
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x0D]; }
|
||||||
|
set { xBlock.Bytes[0x0D] = value; }
|
||||||
|
}
|
||||||
|
public byte ICC
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x0E]; }
|
||||||
|
set { xBlock.Bytes[0x0E] = value; }
|
||||||
|
}
|
||||||
|
public byte Control
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x0F]; }
|
||||||
|
set { xBlock.Bytes[0x0F] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte Reserved1
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x10]; }
|
||||||
|
}
|
||||||
|
public byte Reserved2
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x11]; }
|
||||||
|
}
|
||||||
|
public byte Reserved3
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x12]; }
|
||||||
|
}
|
||||||
|
public byte Reserved4
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x13]; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class FISRegisterD2H
|
||||||
|
{
|
||||||
|
private MemoryBlock xBlock;
|
||||||
|
private uint xAddress;
|
||||||
|
public FISRegisterD2H(uint aAddress)
|
||||||
|
{
|
||||||
|
xAddress = aAddress;
|
||||||
|
xBlock = new MemoryBlock(aAddress, 20);
|
||||||
|
}
|
||||||
|
|
||||||
|
public FISType FISType
|
||||||
|
{
|
||||||
|
get { return (FISType)xBlock.Bytes[0x00]; }
|
||||||
|
set { xBlock.Bytes[0x00] = (byte)value; }
|
||||||
|
}
|
||||||
|
public byte PortMultiplier
|
||||||
|
{
|
||||||
|
get { return (byte)(xBlock.Bytes[0x00] << 8); }
|
||||||
|
set { xBlock.Bytes[0x00] = (byte)value; }
|
||||||
|
}
|
||||||
|
public byte Reserved
|
||||||
|
{
|
||||||
|
get { return (byte)(xBlock.Bytes[0x00] << 12); }
|
||||||
|
}
|
||||||
|
public byte InterruptBit
|
||||||
|
{
|
||||||
|
get { return (byte)(xBlock.Bytes[0x00] << 14); }
|
||||||
|
set { xBlock.Bytes[0x00] = (byte)(value << 14); }
|
||||||
|
}
|
||||||
|
public byte Reserved1
|
||||||
|
{
|
||||||
|
get { return (byte)(xBlock.Bytes[0x00] << 15); }
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte Status
|
||||||
|
{
|
||||||
|
get { return (byte)(xBlock.Bytes[0x00] << 16); }
|
||||||
|
set { xBlock.Bytes[0x00] = (byte)(value << 16); }
|
||||||
|
}
|
||||||
|
public byte Error
|
||||||
|
{
|
||||||
|
get { return (byte)(xBlock.Bytes[0x00] << 24); }
|
||||||
|
set { xBlock.Bytes[0x00] = (byte)(value << 24); }
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte LBA0
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x04]; }
|
||||||
|
set { xBlock.Bytes[0x04] = value; }
|
||||||
|
}
|
||||||
|
public byte LBA1
|
||||||
|
{
|
||||||
|
get { return (byte)(xBlock.Bytes[0x04] << 8); }
|
||||||
|
set { xBlock.Bytes[0x04] = (byte)(value << 8); }
|
||||||
|
}
|
||||||
|
public byte LBA2
|
||||||
|
{
|
||||||
|
get { return (byte)(xBlock.Bytes[0x04] << 16); }
|
||||||
|
set { xBlock.Bytes[0x04] = (byte)(value << 16); }
|
||||||
|
}
|
||||||
|
public byte Device
|
||||||
|
{
|
||||||
|
get { return (byte)(xBlock.Bytes[0x04] << 24); }
|
||||||
|
set { xBlock.Bytes[0x04] = (byte)(value << 24); }
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte LBA3
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x08]; }
|
||||||
|
set { xBlock.Bytes[0x08] = value; }
|
||||||
|
}
|
||||||
|
public byte LBA4
|
||||||
|
{
|
||||||
|
get { return (byte)(xBlock.Bytes[0x08] << 8); }
|
||||||
|
set { xBlock.Bytes[0x08] = (byte)(value << 8); }
|
||||||
|
}
|
||||||
|
public byte LBA5
|
||||||
|
{
|
||||||
|
get { return (byte)(xBlock.Bytes[0x08] << 16); }
|
||||||
|
set { xBlock.Bytes[0x08] = (byte)(value << 16); }
|
||||||
|
}
|
||||||
|
public byte Reserved2
|
||||||
|
{
|
||||||
|
get { return (byte)(xBlock.Bytes[0x08] << 24); }
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte CountL
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x0C]; }
|
||||||
|
set { xBlock.Bytes[0x0C] = value; }
|
||||||
|
}
|
||||||
|
public byte CountH
|
||||||
|
{
|
||||||
|
get { return (byte)(xBlock.Bytes[0x0C] << 8); }
|
||||||
|
set { xBlock.Bytes[0x0C] = (byte)(value << 8); }
|
||||||
|
}
|
||||||
|
public byte Reserved3
|
||||||
|
{
|
||||||
|
get { return (byte)(xBlock.Bytes[0x0C] << 16); }
|
||||||
|
}
|
||||||
|
public byte Reserved4
|
||||||
|
{
|
||||||
|
get { return (byte)(xBlock.Bytes[0x0C] << 24); }
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte Reserved5
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x10]; }
|
||||||
|
}
|
||||||
|
public byte Reserved6
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x11]; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte Reserved7
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x12]; }
|
||||||
|
}
|
||||||
|
public byte Reserved8
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x13]; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class FISPIOSetup
|
||||||
|
{
|
||||||
|
private static MemoryBlock xBlock;
|
||||||
|
private static uint xAddress;
|
||||||
|
private static uint xDataSize;
|
||||||
|
public static FISPIOSetup GetFIS(uint aAddress)
|
||||||
|
{
|
||||||
|
xAddress = aAddress;
|
||||||
|
xBlock = new MemoryBlock(xAddress + 0x20, 0x14);
|
||||||
|
return new FISPIOSetup();
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte FISType
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x00]; }
|
||||||
|
set { xBlock.Bytes[0x00] = value; }
|
||||||
|
}
|
||||||
|
public byte PortMultiplier
|
||||||
|
{
|
||||||
|
get { return (byte)(xBlock.Bytes[0x01] & 0x0F); }
|
||||||
|
set { xBlock.Bytes[0x01] = value; }
|
||||||
|
}
|
||||||
|
public byte Reserved
|
||||||
|
{
|
||||||
|
get { return (byte)((xBlock.Bytes[0x01] >> 4) & 1); }
|
||||||
|
}
|
||||||
|
public byte DataTransferDir
|
||||||
|
{
|
||||||
|
get { return (byte)((xBlock.Bytes[0x01] >> 5) & 1); }
|
||||||
|
set { xBlock.Bytes[0x01] |= (byte)((value) << 5); }
|
||||||
|
}
|
||||||
|
public byte InterruptBit
|
||||||
|
{
|
||||||
|
get { return (byte)((xBlock.Bytes[0x01] >> 6) & 1); }
|
||||||
|
set { xBlock.Bytes[0x01] |= (byte)((value) << 6); }
|
||||||
|
}
|
||||||
|
public byte Reserved1
|
||||||
|
{
|
||||||
|
get { return (byte)((xBlock.Bytes[0x01] >> 7) & 1); }
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte Status
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x02]; }
|
||||||
|
set { xBlock.Bytes[0x02] = value; }
|
||||||
|
}
|
||||||
|
public byte Error
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x03]; }
|
||||||
|
set { xBlock.Bytes[0x03] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte LBA0
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x04]; }
|
||||||
|
set { xBlock.Bytes[0x04] = value; }
|
||||||
|
}
|
||||||
|
public byte LBA1
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x05]; }
|
||||||
|
set { xBlock.Bytes[0x05] = value; }
|
||||||
|
}
|
||||||
|
public byte LBA2
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x06]; }
|
||||||
|
set { xBlock.Bytes[0x06] = value; }
|
||||||
|
}
|
||||||
|
public byte Device
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x07]; }
|
||||||
|
set { xBlock.Bytes[0x07] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte LBA3
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x08]; }
|
||||||
|
set { xBlock.Bytes[0x08] = value; }
|
||||||
|
}
|
||||||
|
public byte LBA4
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x09]; }
|
||||||
|
set { xBlock.Bytes[0x09] = value; }
|
||||||
|
}
|
||||||
|
public byte LBA5
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x0A]; }
|
||||||
|
set { xBlock.Bytes[0x0A] = value; }
|
||||||
|
}
|
||||||
|
public byte Reserved2 // FeatureL in other Fis types
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x0B]; }
|
||||||
|
set { xBlock.Bytes[0x0B] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte CountLow
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x0C]; }
|
||||||
|
set { xBlock.Bytes[0x0C] = value; }
|
||||||
|
}
|
||||||
|
public byte CountHigh
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x0D]; }
|
||||||
|
set { xBlock.Bytes[0x0D] = value; }
|
||||||
|
}
|
||||||
|
public byte Reserved3 // ICC in other Fis types
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x0E]; }
|
||||||
|
set { xBlock.Bytes[0x0E] = value; }
|
||||||
|
}
|
||||||
|
public byte E_Status
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x0F]; }
|
||||||
|
set { xBlock.Bytes[0x0F] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public ushort DataCount
|
||||||
|
{
|
||||||
|
get { return xBlock.Words[0x10]; }
|
||||||
|
set { xBlock.Words[0x10] = value; }
|
||||||
|
}
|
||||||
|
public byte Reserved4
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x12]; }
|
||||||
|
set { xBlock.Bytes[0x12] = value; }
|
||||||
|
}
|
||||||
|
public byte Reserved5
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x13]; }
|
||||||
|
set { xBlock.Bytes[0x13] = value; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class FISData
|
||||||
|
{
|
||||||
|
private static MemoryBlock xBlock;
|
||||||
|
private static uint xAddress;
|
||||||
|
private static uint xDataSize;
|
||||||
|
public static FISData GetFIS(uint aAddress, uint aDataSize)
|
||||||
|
{
|
||||||
|
xAddress = aAddress;
|
||||||
|
xDataSize = aDataSize;
|
||||||
|
xBlock = new MemoryBlock(xAddress, 4 + (4 * aDataSize));
|
||||||
|
return new FISData();
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte FISType
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x00]; }
|
||||||
|
set { xBlock.Bytes[0x00] = value; }
|
||||||
|
}
|
||||||
|
public byte PortMultiplier
|
||||||
|
{
|
||||||
|
get { return (byte)((xBlock.Bytes[0x01]) & 0x0F); }
|
||||||
|
set { xBlock.Bytes[0x01] = value; }
|
||||||
|
}
|
||||||
|
public byte Reserved
|
||||||
|
{
|
||||||
|
get { return (byte)(((xBlock.Bytes[0x01]) >> 4) & 0x0F); }
|
||||||
|
}
|
||||||
|
public byte Reserved1
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x02]; }
|
||||||
|
}
|
||||||
|
public byte Reserved2
|
||||||
|
{
|
||||||
|
get { return xBlock.Bytes[0x03]; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint[] Data
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
UInt32[] xResult = new UInt32[xDataSize];
|
||||||
|
for (int i = 0; i < xResult.Length; i++)
|
||||||
|
{
|
||||||
|
xResult[i] = xBlock[(uint)(0x04 * i)];
|
||||||
|
}
|
||||||
|
return xResult;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enums
|
||||||
|
public enum PortType
|
||||||
|
{
|
||||||
|
Nothing = 0x00,
|
||||||
|
SATA = 0x01,
|
||||||
|
SATAPI = 0x02,
|
||||||
|
SEMB = 0x03,
|
||||||
|
PM = 0x04
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum FISType
|
||||||
|
{
|
||||||
|
FIS_Type_RegisterH2D = 0x27, // Register FIS: Host to Device
|
||||||
|
FIS_Type_RegisterD2H = 0x34, // Register FIS: Device to Host
|
||||||
|
FIS_Type_DMA_Activate = 0x39, // DMA Activate
|
||||||
|
FIS_Type_DMA_Setup = 0x41, // DMA Setup: Device to Host
|
||||||
|
FIS_Type_Data = 0x46, // Data FIS: Bidirectional
|
||||||
|
FIS_Type_BIST = 0x58, // BIST
|
||||||
|
FIS_Type_PIO_Setup = 0x5F, // PIO Setup: Device to Host
|
||||||
|
FIS_Type_DeviceBits = 0xA1 // Device bits
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum FISSize : byte
|
||||||
|
{
|
||||||
|
//FISRegisterH2D = Marshal.SizeOf(FISRegisterH2D);
|
||||||
|
FISRegisterH2D = 40 / sizeof(uint)
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum DriveSignature : uint // Drive Signature to identify what drive is plugged to Port X:X
|
||||||
|
{
|
||||||
|
SATADrive = 0x00000101,
|
||||||
|
PMDrive = 0x96690101,
|
||||||
|
SATAPIDrive = 0xEB140101,
|
||||||
|
SEMBDrive = 0xC33C0101,
|
||||||
|
NullDrive = 0xFFFFFFFF
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum InterfacePowerManagementStatus : uint // SATA Status: Interface Power Management Status
|
||||||
|
{
|
||||||
|
NotPresent = 0x00,
|
||||||
|
Active = 0x01,
|
||||||
|
Partial = 0x02,
|
||||||
|
Slumber = 0x06,
|
||||||
|
DeviceSleep = 0x08
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum CurrentInterfaceSpeedStatus : uint // SATA Status: Current Interface Speed
|
||||||
|
{
|
||||||
|
NotPresent = 0x00,
|
||||||
|
Gen1Rate = 0x01,
|
||||||
|
Gen2Rate = 0x02,
|
||||||
|
Gen3Rate = 0x03
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum DeviceDetectionStatus : uint // SATA Status: Device Detection Status
|
||||||
|
{
|
||||||
|
NotDetected = 0x00,
|
||||||
|
DeviceDetectedNoPhy = 0x01,
|
||||||
|
DeviceDetectedWithPhy = 0x03,
|
||||||
|
PhyOffline = 0x04
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum ATADeviceStatus : uint
|
||||||
|
{
|
||||||
|
Busy = 0x80,
|
||||||
|
DRQ = 0x08
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum CommandAndStatus : uint
|
||||||
|
{
|
||||||
|
ICC_Reserved0 = 0x0000000F,
|
||||||
|
ICC_DevSleep = 0x00000008,
|
||||||
|
ICC_Slumber = 0x00000006,
|
||||||
|
ICC_Partial = 0x00000002,
|
||||||
|
ICC_Active = 0x00000001,
|
||||||
|
ICC_Idle = 0x00000000,
|
||||||
|
ASP = (01 << 27),
|
||||||
|
ALPE = (01 << 26),
|
||||||
|
EnableATAPILED = (01 << 25),
|
||||||
|
ATAPIDevice = (01 << 24),
|
||||||
|
APSTE = (01 << 23),
|
||||||
|
FISSwitchPort = (01 << 22),
|
||||||
|
ExternalSATAPort = (01 << 21),
|
||||||
|
ColdPresenceDetect = (01 << 20),
|
||||||
|
MPSP = (01 << 19),
|
||||||
|
HotPlugCapPort = (01 << 18),
|
||||||
|
PortMultAttach = (01 << 17),
|
||||||
|
ColdPresenceState = (01 << 16),
|
||||||
|
CMDListRunning = (01 << 15),
|
||||||
|
FISRecieveRunning = (01 << 14),
|
||||||
|
MPSS = (01 << 13),
|
||||||
|
CurrentCMDSlot = (01 << 12),
|
||||||
|
Reserved0 = (01 << 07),
|
||||||
|
FISRecieveEnable = (01 << 04),
|
||||||
|
CMDListOverride = (01 << 03),
|
||||||
|
PowerOnDevice = (01 << 02),
|
||||||
|
SpinUpDevice = (01 << 01),
|
||||||
|
StartProccess = (01 << 00),
|
||||||
|
Null = 0xFFFF
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum InterruptStatus : int
|
||||||
|
{
|
||||||
|
ColdPortDetectStatus = (01 << 31),
|
||||||
|
TaskFileErrorStatus = (01 << 30),
|
||||||
|
HostBusFatalErrorStatus = (01 << 29),
|
||||||
|
HostBusDataErrorStatus = (01 << 28),
|
||||||
|
InterfaceFatalErrorStatus = (01 << 27),
|
||||||
|
InterfaceNFatalErrorStatus = (01 << 26),
|
||||||
|
OverflowStatus = (01 << 24),
|
||||||
|
IncorrectPMStatus = (01 << 23),
|
||||||
|
PhyRdyChangeStatus = (01 << 22),
|
||||||
|
DevMechanicalPresenceStatus = (01 << 07),
|
||||||
|
PortConnectChangeStatus = (01 << 06),
|
||||||
|
DescriptorProcessed = (01 << 05),
|
||||||
|
UnknownFISInterrupt = (01 << 04),
|
||||||
|
SetDeviceBitsInterrupt = (01 << 03),
|
||||||
|
DMASetupFISInterrupt = (01 << 02),
|
||||||
|
PIOSetupFISInterrupt = (01 << 01),
|
||||||
|
D2HRegFISInterrupt = (01 << 00),
|
||||||
|
Null = 0xFFFF
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum InterruptEnable : uint
|
||||||
|
{
|
||||||
|
OverflowEnable = (01 << 24),
|
||||||
|
IncorrectPMEnable = (01 << 23),
|
||||||
|
PhyRdyChangeInterruptEnable = (01 << 22),
|
||||||
|
DevMechanicalPresenceEnable = (01 << 07),
|
||||||
|
PortChangeInterruptEnable = (01 << 06),
|
||||||
|
DescProcessedInterruptEnable = (01 << 05),
|
||||||
|
UnknownFISInterruptEnable = (01 << 04),
|
||||||
|
SetDeviceBitsInterruptEnable = (01 << 03),
|
||||||
|
DMASetupFISInterruptEnable = (01 << 02),
|
||||||
|
PIOSetupFISInterruptEnable = (01 << 01),
|
||||||
|
D2HRegFISInterruptEnable = (01 << 00),
|
||||||
|
Null = 0xFFFF
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum ATACommands : byte
|
||||||
|
{
|
||||||
|
ReadDma = 0xC8,
|
||||||
|
ReadDmaExt = 0x25,
|
||||||
|
WriteDma = 0xCA,
|
||||||
|
WriteDmaExt = 0x35,
|
||||||
|
CacheFlush = 0xE7,
|
||||||
|
CacheFlushExt = 0xEA,
|
||||||
|
Packet = 0xA0,
|
||||||
|
IdentifyPacket = 0xA1,
|
||||||
|
IdentifyDMA = 0xEE,
|
||||||
|
Identify = 0xEC,
|
||||||
|
Read = 0xA8,
|
||||||
|
Eject = 0x1B
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum Bases : uint
|
||||||
|
{
|
||||||
|
SATA = 0x00400000
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue