示例#1
0
文件: COM.cs 项目: Orvid/Cosmos
 /// <summary>
 /// Initializes a new set of IOPorts for the specified COM port number. 
 /// </summary>
 /// <param name="comPortNumber">Can be either 1,2,3, or 4.</param>
 public COM(byte comPortNumber)
 {
     if (comPortNumber > 4 && comPortNumber != 0)
     {
         throw new Exception("Cosmos.Core->IOGroup->COM.cs-> ERROR: Unknown COM Port.");
     }
     ushort portBase = 0;
     switch (comPortNumber)
     {
         case 1:
             portBase = 0x3F8;
             break;
         case 2:
             portBase = 0x2F8;
             break;
         case 3:
             portBase = 0x3E8;
             break;
         case 4:
             portBase = 0x2E8;
             break;
     }
     Data = new IOPort(portBase);
     InterruptEnable = new IOPort(unchecked((ushort)(portBase + 1)));
     FIFOControl = new IOPort(unchecked((ushort)(portBase + 2)));
     LineControl = new IOPort(unchecked((ushort)(portBase + 3)));
     ModemControl = new IOPort(unchecked((ushort)(portBase + 4)));
     LineStatus = new IOPort(unchecked((ushort)(portBase + 5)));
     ModemStatus = new IOPort(unchecked((ushort)(portBase + 6)));
     Scratch = new IOPort(unchecked((ushort)(portBase + 7)));
 }
示例#2
0
        private static int[] GetRawDate()
        {
            IOPort p70 = new IOPort(0x70);
            IOPort p71 = new IOPort(0x71);
            int[] raw = new int[0x0b];

            p70.Byte = 0x0b;
            p71.Byte = 0x02; //24h format + BCD encoding

            do
                p70.Byte = 0x0a;
            while ((p71.Byte & 0x80) == 0);

            for (byte i = 0; i < 0x0a; i++)
            {
                p70.Byte = i;

                raw[i] = p71.Word;
            }

            p70.Byte = 0x32;

            raw[0x0a] = p71.Word;

            return raw;
        }
示例#3
0
        public CIA(ushort address, ushort size, Irq irqLine, byte writeOnlyPinsA, byte writeOnlyPinsB)
            : base(address, size)
        {
            _portA = new IOPort(writeOnlyPinsA);
            _portB = new IOPort(writeOnlyPinsB);

            _irqLine = irqLine;
        }
 public AMDPCNetIIIOGroup(ushort baseAddress)
 {
     RegisterAddress = new IOPort(baseAddress, 0x14);
     RegisterData = new IOPort(baseAddress, 0x10);
     BusData = new IOPort(baseAddress, 0x1C);
     MAC1 = new IOPortRead(baseAddress, 0x00);
     MAC2 = new IOPortRead(baseAddress, 0x04);
 }
示例#5
0
文件: ATA.cs 项目: iSalva/Cosmos
    //* DEVADDRESS: BAR1 + 2; // I don't know what is the benefit from this register

    internal ATA(bool aSecondary)
    {
      Console.WriteLine("Creating ATA IOGroup");

      var xBAR0 = GetBAR0(aSecondary);
      var xBAR1 = GetBAR1(aSecondary);
      Data = new IOPort(xBAR0);
      SectorCount = new IOPortWrite(xBAR0, 2);
      LBA0 = new IOPort(xBAR0, 3);
      LBA1 = new IOPort(xBAR0, 4);
      LBA2 = new IOPort(xBAR0, 5);
      Command = new IOPortWrite(xBAR0, 7);
      Status = new IOPortRead(xBAR0, 7);
      DeviceSelect = new IOPortWrite(xBAR0, 6);
      Control = new IOPortWrite(xBAR1, 2);
    }
示例#6
0
文件: ATA.cs 项目: Orvid/Cosmos
    //* DEVADDRESS: BAR1 + 2; // I don't know what is the benefit from this register

    internal ATA(bool aSecondary)
    {
      if (aSecondary)
      {
        Debugger.DoSend("Creating Secondary ATA IOGroup");
      }
      else
      {
        Debugger.DoSend("Creating Primary ATA IOGroup");
      }

      var xBAR0 = GetBAR0(aSecondary);
      var xBAR1 = GetBAR1(aSecondary);
      Data = new IOPort(xBAR0);
      SectorCount = new IOPortWrite(xBAR0, 2);
      LBA0 = new IOPort(xBAR0, 3);
      LBA1 = new IOPort(xBAR0, 4);
      LBA2 = new IOPort(xBAR0, 5);
      Command = new IOPortWrite(xBAR0, 7);
      Status = new IOPortRead(xBAR0, 7);
      DeviceSelect = new IOPortWrite(xBAR0, 6);
      Control = new IOPortWrite(xBAR1, 2);
    }
示例#7
0
        public ATADiskDrive(bool primary, ATAControllerIdEnum aControllerId, ATABusPositionEnum aBusPosition, ATASpecLevel mDriveType)
        {
            var xBAR0 = (ushort)(!primary ? 0x0170 : 0x01F0);
            var xBAR1 = (ushort)(!primary ? 0x0374 : 0x03F4);

            IOControl      = (ushort)(xBAR1 + 2);
            IOCommand      = (ushort)(xBAR0 + 7);
            IOData         = (ushort)xBAR0;
            IOStatus       = (ushort)(xBAR0 + 7);
            IODeviceSelect = (ushort)(xBAR0 + 6);
            IOLBA0         = (ushort)(xBAR0 + 3);
            IOLBA1         = (ushort)(xBAR0 + 4);
            IOLBA2         = (ushort)(xBAR0 + 5);
            IOSectorCount  = (ushort)(xBAR0 + 2);
            mControllerID  = aControllerId;
            mBusPosition   = aBusPosition;
            DriveType      = mDriveType;

            if (DriveType == ATASpecLevel.ATA)
            {
                SendATACmd(ATACmd.Identify, IOCommand, IOStatus);
            }
            else
            {
                SendATACmd(ATACmd.IdentifyPacket, IOCommand, IOStatus);
            }
            var xBuff = (ushort *)Heap.alloc(512);

            for (int i = 0; i < 256; i++)
            {
                ushort read  = IOPort.inw(IOData);
                byte   upper = (byte)(read >> 8);
                byte   lower = (byte)read;
                xBuff[i] = (ushort)((lower << 8) | upper);
            }

            SerialNo    = GetString(xBuff, 10, 20);
            FirmwareRev = GetString(xBuff, 23, 8);
            ModelNo     = GetString(xBuff, 27, 40);
            DeviceLa    = GetString(xBuff, 54, 40);
            uint  l   = 0;
            byte *ptr = DeviceLa;

            while (*ptr != 0)
            {
                ptr++;
                l++;
            }
            char[] tmp = new char[l];
            for (int i = 0; i < l; i++)
            {
                tmp[i] = (char)DeviceLa[i];
            }
            Label = new string(tmp);

            BlockCount = ((uint)xBuff[61] << 16 | xBuff[60]) - 1;
            LBA48Bit   = (xBuff[83] & 0x40) != 0;
            if (LBA48Bit)
            {
                BlockCount = ((ulong)xBuff[102] << 32 | (ulong)xBuff[101] << 16 | (ulong)xBuff[100]) - 1;
            }
            byte *xMbrData = (byte *)Heap.alloc(512);

            ReadBlock(0, 1, xMbrData);
            MBR xMBR = new MBR();

            xMBR.Setup(this, xMbrData);

            for (int i = 0; i < xMBR.partitions.Count; i++)
            {
                DetectedPartitions.Add(xMBR.partitions[i]);
            }
        }
示例#8
0
文件: Power.cs 项目: djlw78/Medli
 // Enable ACPI
 public static void Enable()
 {
     smiIO = new IOPort(ACPI_ENABLE);
 }
        /// <summary>
        /// Writes a 16 bit word
        /// </summary>
        /// <param name="port"></param>
        /// <param name="data"></param>
        public static void outw(ushort port, ushort data)
        {
            IOPort io = new IOPort(port);

            io.Word = data;
        }
示例#10
0
        /// <summary>
        /// Reads a 32 bit word
        /// </summary>
        /// <param name="port"></param>
        /// <returns></returns>
        public static uint inl(ushort port)
        {
            IOPort io = new IOPort(port);

            return(io.DWord);
        }
示例#11
0
        /// <summary>
        /// Reads a byte
        /// </summary>
        /// <param name="port"></param>
        /// <returns></returns>
        public static byte inb(ushort port)
        {
            IOPort io = new IOPort(port);

            return(io.Byte);
        }
示例#12
0
 static byte Inb(ushort port)
 {
     io = new IOPort(port);
     return(io.Byte);
 }
示例#13
0
 internal PIC(bool aSlave) {
     byte aBase = (byte)(aSlave ? 0xA0 : 0x20);
     Cmd = new IOPort(aBase);
     Data = new IOPort((byte)(aBase + 1));
 }
示例#14
0
        internal static bool Init()
        {
            byte *ptr = (byte *)RSDPAddress(); int addr = 0;

            for (int i = 19; i >= 16; i--)
            {
                addr += (*((byte *)ptr + i));
                addr  = (i == 16) ? addr : addr << 8;
            }
            ptr  = (byte *)addr;
            ptr += 4; addr = 0;
            for (int i = 3; i >= 0; i--)
            {
                addr += (*((byte *)ptr + i));
                addr  = (i == 0) ? addr : addr << 8;
            }
            int length = addr;

            ptr -= 4;
            if (ptr != null && acpiCheckHeader((byte *)ptr, "RSDT") == 0)
            {
                addr = 0;
                int entrys = length;
                entrys = (entrys - 36) / 4;
                ptr   += 36;
                byte *yeuse;

                while (0 < entrys--)
                {
                    for (int i = 3; i >= 0; i--)
                    {
                        addr += (*((byte *)ptr + i));
                        addr  = (i == 0) ? addr : addr << 8;
                    }
                    yeuse = (byte *)addr;
                    Facp  = (byte *)yeuse;
                    if (Compare("FACP", Facp) == 0)
                    {
                        if (acpiCheckHeader((byte *)facpget(0), "DSDT") == 0)
                        {
                            byte *S5Addr     = (byte *)facpget(0) + 36;
                            int   dsdtLength = *(facpget(0) + 1) - 36;
                            while (0 < dsdtLength--)
                            {
                                if (Compare("_S5_", (byte *)S5Addr) == 0)
                                {
                                    break;
                                }
                                S5Addr++;
                            }
                            if (dsdtLength > 0)
                            {
                                if ((*(S5Addr - 1) == 0x08 || (*(S5Addr - 2) == 0x08 && *(S5Addr - 1) == '\\')) && *(S5Addr + 4) == 0x12)
                                {
                                    S5Addr += 5;
                                    S5Addr += ((*S5Addr & 0xC0) >> 6) + 2;
                                    if (*S5Addr == 0x0A)
                                    {
                                        S5Addr++;
                                    }
                                    SLP_TYPa = (short)(*(S5Addr) << 10);
                                    S5Addr++;
                                    if (*S5Addr == 0x0A)
                                    {
                                        S5Addr++;
                                    }
                                    SLP_TYPb     = (short)(*(S5Addr) << 10);
                                    SMI_CMD      = facpget(1);
                                    ACPI_ENABLE  = facpbget(0);
                                    ACPI_DISABLE = facpbget(1);
                                    PM1a_CNT     = facpget(2);
                                    PM1b_CNT     = facpget(3);
                                    PM1_CNT_LEN  = facpbget(3);
                                    SLP_EN       = 1 << 13;
                                    SCI_EN       = 1;
                                    smiIO        = new IOPort((ushort)SMI_CMD);
                                    pm1aIO       = new IOPort((ushort)PM1a_CNT);
                                    pm1bIO       = new IOPort((ushort)PM1b_CNT);
                                    return(true);
                                }
                            }
                        }
                    }
                    ptr += 4;
                }
            }
            return(false);
        }
示例#15
0
        public static void Init()
        {
            Drivers.Add(new PS2Keyboard(null));
            Drivers.Add(new PS2Mouse(null));
            Drivers.Add(new VideoGraphicsArray(null));
            bool foundGPU = false;

            foreach (PCIDevice device in PCI.PCIDevices)
            {
                IDriver driver = null;
                if (device.type == PCIDevice.PCIType.Graphics)
                {
                    foundGPU = true;
                }
                switch (device.VendorID)
                {
                case 0x1022:     //AMD
                    switch (device.DeviceID)
                    {
                    case 0x2000:
                        break;        //return "AMD PCnet LANCE PCI Ethernet Controller";
                    }
                    break;

                case 0x104B:     //Sony
                    switch (device.DeviceID)
                    {
                    case 0x1040:
                        break;        //return "Mylex BT958 SCSI Host Adaptor";
                    }
                    break;

                case 0x1274:     //Ensoniq
                    switch (device.DeviceID)
                    {
                    case 0x1371:
                        break;        //return "Ensoniq AudioPCI";
                    }
                    break;

                case 0x15AD:     //VMware
                    switch (device.DeviceID)
                    {
                    case 0x0405:
                        Drivers.Add(new NVIDIA9500MGS(device));
                        break;        //return "VMware NVIDIA 9500MGS";

                    case 0x0770:
                        break;        //return "VMware Standard Enhanced PCI to USB Host Controller";

                    case 0x0790:
                        break;        //return "VMware 6.0 Virtual USB 2.0 Host Controller";

                    case 0x07A0:
                        break;        //return "VMware PCI Express Root Port";
                    }
                    break;

                case 0x8086:     //Intel
                    switch (device.DeviceID)
                    {
                    case 0x7190:
                        break;        //return "Intel 440BX/ZX AGPset Host Bridge";

                    case 0x7191:
                        break;        //return "Intel 440BX/ZX AGPset PCI-to-PCI bridge";

                    case 0x7110:
                        break;        //return "Intel PIIX4/4E/4M ISA Bridge";

                    case 0x7112:
                        break;        //return "Intel PIIX4/4E/4M USB Interface";
                    }
                    break;
                }
                switch (device.ClassCode)
                {
                case 0x01:
                    break;    //return "Mass Storage Controller";

                case 0x02:
                    break;    //return "Network Controller";

                case 0x03:
                    break;    //return "Display Controller";

                case 0x04:
                    break;    //return "Multimedia Controller";

                case 0x05:
                    break;    //return "Memory Controller";

                case 0x06:
                    break;    //return "Bridge Device";

                case 0x07:
                    break;    //return "Simple Communication Controller";

                case 0x08:
                    break;    //return "Base System Peripheral";

                case 0x09:
                    break;    //return "Input Device";

                case 0x0A:
                    break;    //return "Docking Station";

                case 0x0B:
                    break;    //return "Processor";

                case 0x0C:
                    break;    //return "Serial Bus Controller";

                case 0x0D:
                    break;    //return "Wireless Controller";

                case 0x0E:
                    break;    //return "Intelligent I/O Controller";

                case 0x0F:
                    break;    //return "Satellite Communication Controller";

                case 0x10:
                    break;    //return "Encryption/Decryption Controller";

                case 0x11:
                    break;    //return "Data Acquisition and Signal Processing Controller";

                case 0xFF:
                    break;    //return "Unkown device";
                }
                if (driver != null)
                {
                    Drivers.Add(driver);
                }
            }
            if (!foundGPU)
            {
                IOPort.outw(0x01CE, 0x00);
                ushort read = IOPort.inw(0x01CF);
                if (read >= 0xB0C4 && read != 0xFFFF)
                {
                    Drivers.Add(new BochsGraphicsAdaptor(null));
                }
            }
        }
示例#16
0
文件: Ports.cs 项目: KM198912/AirOS
        /// <summary>
        /// Writes a 32 bit word
        /// </summary>
        /// <param name="port"></param>
        /// <param name="data"></param>
        public static void outd(ushort port, byte data)
        {
            IOPort io = new IOPort(port);

            io.DWord = data;
        }
示例#17
0
文件: Power.cs 项目: djlw78/Medli
 // Disable ACPI
 public static void Disable()
 {
     smiIO = new IOPort(ACPI_DISABLE);
 }
示例#18
0
 private static byte Read()
 {
     WaitData();
     return(IOPort.inb(p60));
 }
示例#19
0
 public TestIOPort(IOPort IOPort)
 {
     _IOPort = IOPort;
     Start();
 }
示例#20
0
        private void DoListen()
        {
            while (_keepListen)
            {
                Thread.Sleep(1);
                if (_listener.Pending())
                {
                    TcpClient _client = _listener.AcceptTcpClient();
                    Trace.WriteLine("Client connected...");
					_client.SendBufferSize = 4095;
					System.Console.WriteLine(_client.Client.AddressFamily);
					System.Console.WriteLine(_client.Client.ProtocolType);
					System.Console.WriteLine(_client.Client.SocketType);

                    IOPort port = new IOPort(_client,m_msgReceivedSignal,this);
                    Clients.Add(port);
                    m_connectedSignal.Set();
                }

                //Check if all clients are alive
                for (int i = 0; i < Clients.Count; i++)
                {
                    IOPort port = Clients[i];

                    if (!port.IsConnected)
                    {
                        Trace.WriteLine("Dead client detected... Will be removed. ");
                        Clients.Remove(port);
                    }
                }
            }

            _listener.Stop();
        }
        public override double RapidErrorRate(int syn = 0)
        {
            lock (syncRoot)
            {
                UInt16[] buff = new UInt16[1];

                double ErrorRate = 1;


                UInt16 Mantissa;
                UInt16 Exponent;
                try
                {
                    EdGatingStart(false);
                    Thread.Sleep(50);
                    EdGatingStart(true);

                    Thread.Sleep(edGatingTime * 1000);

                    switch (MyParameter.MoudleChannel)
                    {
                    case 1:
                        buff = IOPort.ReadMDIO(MyParameter.deviceIndex, 1, MyParameter.phycialAdress, 0xA290, IOPort.MDIOSoftHard.SOFTWARE, 1);
                        break;

                    case 2:
                        buff = IOPort.ReadMDIO(MyParameter.deviceIndex, 1, MyParameter.phycialAdress, 0xA291, IOPort.MDIOSoftHard.SOFTWARE, 1);
                        break;

                    case 3:
                        buff = IOPort.ReadMDIO(MyParameter.deviceIndex, 1, MyParameter.phycialAdress, 0xA292, IOPort.MDIOSoftHard.SOFTWARE, 1);
                        break;

                    case 4:
                        buff = IOPort.ReadMDIO(MyParameter.deviceIndex, 1, MyParameter.phycialAdress, 0xA293, IOPort.MDIOSoftHard.SOFTWARE, 1);
                        break;

                    default:
                        buff = IOPort.ReadMDIO(MyParameter.deviceIndex, 1, MyParameter.phycialAdress, 0xA290, IOPort.MDIOSoftHard.SOFTWARE, 1);
                        break;
                    }

                    Exponent = Convert.ToUInt16(buff[0] >> 10);   //Hig  6bit

                    Mantissa = Convert.ToUInt16(buff[0] & 0x3FF); //Low  10bit

                    ErrorRate = Mantissa * (Math.Pow(2, Exponent)) / (MyParameter.dDataRate * MyParameter.GatingTime * 1E+9);

                    return(ErrorRate);
                }
                catch (InnoExCeption error)
                {
                    Log.SaveLogToTxt("ErrorCode=" + ExceptionDictionary.Code._Funtion_Fatal_0x05002 + "Reason=" + error.TargetSite.Name + "Fail");
                    throw error;
                }

                catch (Exception error)
                {
                    Log.SaveLogToTxt("ErrorCode=" + ExceptionDictionary.Code._Funtion_Fatal_0x05002 + "Reason=" + error.TargetSite.Name + "Fail");
                    throw new InnoExCeption(ExceptionDictionary.Code._Funtion_Fatal_0x05002, error.StackTrace);
                    // throw new InnoExCeption(ex);
                }
            }
        }
示例#22
0
 public static void Write(byte a, Port PORT = Port.Com1)
 {
     WaitForWriteReady(PORT);
     IOPort.Outb((ushort)PORT, a);
 }
示例#23
0
 /// <summary>
 /// Reads an integer from the IO Port
 /// </summary>
 /// <returns></returns>
 public override uint Read32()
 {
     return(IOPort.In32(Address));
 }
示例#24
0
        protected void Init()
        {
            Data = new IOPort((ushort)(port + 0));
            InterruptEnable = new IOPort((ushort)(port + 1));
            BaudLSB = new IOPort((ushort)(port + 0));
            BaudMSB = new IOPort((ushort)(port + 1));
            FIFOControl = new IOPort((ushort)(port + 2));
            LineControl = new IOPort((ushort)(port + 3));
            ModemControl = new IOPort((ushort)(port + 4));
            LineStatus = new IOPort((ushort)(port + 5));
            ModemStatus = new IOPort((ushort)(port + 6));
            Scratch = new IOPort((ushort)(port + 7));

            InterruptEnable.Write_Byte((byte)interrupts);
            
            LineControl.Write_Byte((byte)LineControlFlags.DivisorLatchAccessBit);
            BaudLSB.Write_Byte((byte)((byte)baudRate & 0x00FF));
            BaudMSB.Write_Byte((byte)((byte)baudRate & 0xFF00));
            
            // This also clears the DLAB flag
            LineControl.Write_Byte((byte)((byte)dataBits | (byte)stopBits | (byte)parityBits));
            FIFOControl.Write_Byte((byte)(FIFOControlFlags.Enable | 
                                          FIFOControlFlags.ClearReceive | FIFOControlFlags.ClearTransmit |
                                          FIFOTriggerLevel));
            ModemControl.Write_Byte((byte)(ModemControlFlags.DTR | ModemControlFlags.RTS));
        }
示例#25
0
 /// <summary>
 ///  Writes a byte to the IO Port
 /// </summary>
 /// <param name="data">The data.</param>
 public override void Write8(byte data)
 {
     IOPort.Out8(Address, data);
 }
示例#26
0
        public static void nosound()
        {
            byte tmp = (byte)(IOPort.inb(0x61) & 0xFC);

            IOPort.outb(0x61, tmp);
        }
示例#27
0
 /// <summary>
 ///  Writes a short to the IO Port
 /// </summary>
 /// <param name="data">The data.</param>
 public override void Write16(ushort data)
 {
     IOPort.Out16(Address, data);
 }
示例#28
0
        /// <summary>
        /// Creates a new instance of the <see cref="AC97"/> class, with the
        /// given buffer size.
        /// </summary>
        /// <param name="bufferSize">The buffer size in samples to use. This value cannot be an odd number, as per the AC97 specification.</param>
        /// <exception cref="ArgumentException">Thrown when the given buffer size is invalid.</exception>
        /// <exception cref="InvalidOperationException">Thrown when no AC97-compatible sound card is present.</exception>
        private AC97(ushort bufferSize)
        {
            if (bufferSize % 2 != 0)
            {
                // As per the AC97 specification, the buffer size cannot be odd.
                // (1.2.4.2 PCM Buffer Restrictions, Intel document 302349-003)
                throw new ArgumentException("The buffer size must be an even number.", nameof(bufferSize));
            }

            PCIDevice pci = Cosmos.HAL.PCI.GetDeviceClass(
                ClassID.MultimediaDevice, // 0x04
                (SubclassID)0x01          // 0x01
                );

            if (pci == null || !pci.DeviceExists || pci.InterruptLine > 0xF)
            {
                throw new InvalidOperationException("No AC97-compatible device could be found.");
            }

            PCI = pci; // Expose PCI device to the public API

            pci.EnableBusMaster(true);
            pci.EnableMemory(true);
            pci.EnableDevice(); // enable I/O space

            INTs.SetIrqHandler(pci.InterruptLine, HandleInterrupt);

            ushort NAMbar  = (ushort)pci.BaseAddressBar[0].BaseAddress; // Native Audio Mixer
            ushort NABMbar = (ushort)pci.BaseAddressBar[1].BaseAddress; // Native Audio Bus Master

            pTransferControl   = new IOPort((ushort)(NABMbar + 0x1B));
            pMasterVolume      = new IOPort((ushort)(NAMbar + 0x02));
            pPCMOutVolume      = new IOPort((ushort)(NAMbar + 0x18));
            pBufferDescriptors = new IOPort((ushort)(NABMbar + 0x10));
            pTransferStatus    = new IOPort((ushort)(NABMbar + 0x16));
            pLastValidEntry    = new IOPort((ushort)(NABMbar + 0x15));
            pGlobalControl     = new IOPort((ushort)(NABMbar + 0x2C));
            pResetRegister     = new IOPort((ushort)(NAMbar + 0x00));

            // Reset device
            pGlobalControl.Byte  = 0x2;
            pResetRegister.DWord = 0xDEADBEEF; // any value will do here

            // Reset PCM out
            uint polls = 0; // The amount we polled the device for a reset

            pTransferControl.Byte = (byte)(pTransferControl.Byte | TC_TRANSFER_RESET);
            while ((pTransferControl.Byte & TC_TRANSFER_RESET) != 0 && polls < RESET_POLL_LIMIT)
            {
                // Wait until the byte is cleared
                polls++;
            }

            // The device hasn't responded to our reset request. Probably not a fully-compatible AC97 card.
            if (polls >= RESET_POLL_LIMIT)
            {
                throw new InvalidOperationException("No AC97-compatible device could be found - the reset timeout has expired.");
            }

            // Volume
            pMasterVolume.Word = CreateMixerVolumeValue(AC97_VOLUME_MAX, AC97_VOLUME_MAX, false);
            pPCMOutVolume.Word = CreateMixerVolumeValue(AC97_VOLUME_MAX, AC97_VOLUME_MAX, false);

            // Create all needed buffers
            CreateBuffers(bufferSize);

            // Initialization done - driver can now be activated by using Enable()
        }
示例#29
0
 /// <summary>
 ///  Writes an integer to the IO Port
 /// </summary>
 /// <param name="data">The data.</param>
 public override void Write32(uint data)
 {
     IOPort.Out32(Address, data);
 }
示例#30
0
 public void VBEWrite(VBERegisterIndex index, uint value)
 {
     IOPort.outw(IndexPort, (ushort)index);
     IOPort.outd(DataPort, value);
 }
示例#31
0
 /// <summary>
 /// Reads a byte from the IO Port
 /// </summary>
 /// <returns></returns>
 public override byte Read8()
 {
     return(IOPort.In8(Address));
 }
示例#32
0
 public static void SelectATADrive(byte aLbaHigh4, ushort IODeviceSelect, ATABusPositionEnum mBusPosition, ushort IOStatus)
 {
     IOPort.outb(IODeviceSelect, (byte)((byte)(ATADvcSelVal.Default | ATADvcSelVal.LBA | (mBusPosition == ATABusPositionEnum.Slave ? ATADvcSelVal.Slave : 0)) | aLbaHigh4));
     ATAWait(IOStatus);
 }
示例#33
0
 /// <summary>
 /// Reads a short from the IO Port
 /// </summary>
 /// <returns></returns>
 public override ushort Read16()
 {
     return(IOPort.In16(Address));
 }
示例#34
0
        /// <summary>
        /// Reads a 16 bit word
        /// </summary>
        /// <param name="port"></param>
        /// <returns></returns>
        public static ushort inw(ushort port)
        {
            IOPort io = new IOPort(port);

            return(io.Word);
        }
示例#35
0
文件: ACPI.cs 项目: Solar2/SolarOS
        public static int Init()
        {
            byte *ptr  = (byte *)RSDPAddress();
            int   addr = 0;

            for (int i = 19; i >= 16; i--)
            {
                addr += (*((byte *)ptr + i));
                addr  = (i == 16) ? addr : addr << 8;
            }

            ptr  = (byte *)addr;
            ptr += 4;
            addr = 0;
            for (int i = 3; i >= 0; i--)
            {
                addr += (*((byte *)ptr + i));
                addr  = (i == 0) ? addr : addr << 8;
            }
            int length = addr;

            ptr -= 4;
            // check if address is correct  ( if acpi is available on this pc )
            if (ptr != null && acpiCheckHeader((byte *)ptr, "RSDT") == 0)
            {
                addr = 0;
                // the RSDT contains an unknown number of pointers to acpi tables

                int entrys = length;
                entrys = (entrys - 36) / 4;
                ptr   += 36; // skip header information
                byte *yeuse;

                while (0 < entrys--)
                {
                    for (int i = 3; i >= 0; i--)
                    {
                        addr += (*((byte *)ptr + i));
                        addr  = (i == 0) ? addr : addr << 8;
                    }
                    yeuse = (byte *)addr;
                    // check if the desired table is reached
                    Facp = (byte *)yeuse;
                    if (Compare("FACP", Facp) == 0)
                    {
                        if (acpiCheckHeader((byte *)facpget(0), "DSDT") == 0)
                        {
                            // search the \_S5 package in the DSDT
                            byte *S5Addr     = (byte *)facpget(0) + 36; // skip header
                            int   dsdtLength = *(facpget(0) + 1) - 36;
                            while (0 < dsdtLength--)
                            {
                                if (Compare("_S5_", (byte *)S5Addr) == 0)
                                {
                                    break;
                                }
                                S5Addr++;
                            }
                            // check if \_S5 was found
                            if (dsdtLength > 0)
                            {
                                // check for valid AML structure
                                if ((*(S5Addr - 1) == 0x08 || (*(S5Addr - 2) == 0x08 && *(S5Addr - 1) == '\\')) && *(S5Addr + 4) == 0x12)
                                {
                                    S5Addr += 5;
                                    S5Addr += ((*S5Addr & 0xC0) >> 6) + 2;   // calculate PkgLength size

                                    if (*S5Addr == 0x0A)
                                    {
                                        S5Addr++;    // skip byteprefix
                                    }
                                    SLP_TYPa = (short)(*(S5Addr) << 10);
                                    S5Addr++;

                                    if (*S5Addr == 0x0A)
                                    {
                                        S5Addr++;    // skip byteprefix
                                    }
                                    SLP_TYPb = (short)(*(S5Addr) << 10);

                                    SMI_CMD = facpget(1);

                                    ACPI_ENABLE  = facpbget(0);
                                    ACPI_DISABLE = facpbget(1);

                                    PM1a_CNT = facpget(2);
                                    PM1b_CNT = facpget(3);

                                    PM1_CNT_LEN = facpbget(3);

                                    SLP_EN = 1 << 13;
                                    SCI_EN = 1;
                                    smiIO  = new IOPort((ushort)SMI_CMD);
                                    pm1aIO = new IOPort((ushort)PM1a_CNT);
                                    pm1bIO = new IOPort((ushort)PM1b_CNT);
                                    return(0);
                                }
                                else
                                {
                                    Console.WriteLine("\\_S5 parse error.\n");
                                }
                            }
                            else
                            {
                                Console.WriteLine("\\_S5 not present.\n");
                            }
                        }
                        else
                        {
                            Console.WriteLine("DSDT invalid.\n");
                        }
                    }
                    ptr += 4;
                }
                Console.WriteLine("no valid FACP present.\n");
            }
            else
            {
                Console.WriteLine("no acpi.\n");
            }

            return(-1);
        }
示例#36
0
        /// <summary>
        /// Writes a byte
        /// </summary>
        /// <param name="port"></param>
        /// <param name="data"></param>
        public static void outb(ushort port, byte data)
        {
            IOPort io = new IOPort(port);

            io.Byte = data;
        }
示例#37
0
 private static byte RTC_Register(byte aNo)
 {
     IOPort.Outb((byte)cmos.Address, aNo);
     return(IOPort.Inb((byte)cmos.Data));
 }
示例#38
0
        /// <summary>
        /// Writes a 32 bit word
        /// </summary>
        /// <param name="port"></param>
        /// <param name="data"></param>
        public static void outl(ushort port, uint data)
        {
            IOPort io = new IOPort(port);

            io.DWord = data;
        }
示例#39
0
 private void SelectDrive(byte aLbaHigh4)
 {
     IOPort.outb(IODeviceSelect, (byte)((byte)(ATADvcSelVal.Default | ATADvcSelVal.LBA | (mBusPosition == ATABusPositionEnum.Slave ? ATADvcSelVal.Slave : 0)) | aLbaHigh4));
     Wait();
 }