Hardware/LPC/LPCIO.cs
changeset 163 67be1c62f950
parent 147 17f982ee3a46
child 165 813d8bc3192f
     1.1 --- a/Hardware/LPC/LPCIO.cs	Wed Aug 04 20:27:05 2010 +0000
     1.2 +++ b/Hardware/LPC/LPCIO.cs	Thu Aug 05 18:06:18 2010 +0000
     1.3 @@ -120,9 +120,7 @@
     1.4        WinRing0.WriteIoPortByte(registerPort, 0xAA);
     1.5      }
     1.6  
     1.7 -    public LPCIO() {
     1.8 -      if (!WinRing0.IsAvailable)
     1.9 -        return;
    1.10 +    private void Detect() {
    1.11  
    1.12        for (int i = 0; i < REGISTER_PORTS.Length; i++) {
    1.13          registerPort = REGISTER_PORTS[i];
    1.14 @@ -145,35 +143,35 @@
    1.15                case 0x41:
    1.16                  chip = Chip.F71882;
    1.17                  logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN;
    1.18 -                break;              
    1.19 +                break;
    1.20              } break;
    1.21            case 0x06:
    1.22 -            switch (revision) {             
    1.23 +            switch (revision) {
    1.24                case 0x01:
    1.25                  chip = Chip.F71862;
    1.26                  logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN;
    1.27 -                break;              
    1.28 +                break;
    1.29              } break;
    1.30            case 0x07:
    1.31              switch (revision) {
    1.32                case 0x23:
    1.33                  chip = Chip.F71889F;
    1.34                  logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN;
    1.35 -                break;              
    1.36 +                break;
    1.37              } break;
    1.38            case 0x08:
    1.39              switch (revision) {
    1.40                case 0x14:
    1.41                  chip = Chip.F71869;
    1.42                  logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN;
    1.43 -                break;              
    1.44 +                break;
    1.45              } break;
    1.46            case 0x09:
    1.47              switch (revision) {
    1.48                case 0x09:
    1.49                  chip = Chip.F71889ED;
    1.50                  logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN;
    1.51 -                break;              
    1.52 +                break;
    1.53              } break;
    1.54            case 0x52:
    1.55              switch (revision) {
    1.56 @@ -182,7 +180,7 @@
    1.57                case 0x41:
    1.58                  chip = Chip.W83627HF;
    1.59                  logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
    1.60 -                break;             
    1.61 +                break;
    1.62              } break;
    1.63            case 0x82:
    1.64              switch (revision & 0xF0) {
    1.65 @@ -208,10 +206,10 @@
    1.66              } break;
    1.67            case 0xA0:
    1.68              switch (revision & 0xF0) {
    1.69 -              case 0x20: 
    1.70 +              case 0x20:
    1.71                  chip = Chip.W83627DHG;
    1.72 -                logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;  
    1.73 -                break;             
    1.74 +                logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
    1.75 +                break;
    1.76              } break;
    1.77            case 0xA5:
    1.78              switch (revision & 0xF0) {
    1.79 @@ -225,7 +223,7 @@
    1.80                case 0x70:
    1.81                  chip = Chip.W83627DHGP;
    1.82                  logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
    1.83 -                break;             
    1.84 +                break;
    1.85              } break;
    1.86            case 0xB3:
    1.87              switch (revision & 0xF0) {
    1.88 @@ -233,20 +231,20 @@
    1.89                  chip = Chip.W83667HGB;
    1.90                  logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
    1.91                  break;
    1.92 -            } break; 
    1.93 +            } break;
    1.94          }
    1.95          if (chip == Chip.Unknown) {
    1.96            if (id != 0 && id != 0xff) {
    1.97              WinbondFintekExit();
    1.98  
    1.99 -            report.Append("Chip ID: Unknown Winbond / Fintek with ID 0x"); 
   1.100 +            report.Append("Chip ID: Unknown Winbond / Fintek with ID 0x");
   1.101              report.AppendLine(((id << 8) | revision).ToString("X"));
   1.102              report.AppendLine();
   1.103            }
   1.104          } else {
   1.105  
   1.106            Select(logicalDeviceNumber);
   1.107 -          ushort address = ReadWord(BASE_ADDRESS_REGISTER);          
   1.108 +          ushort address = ReadWord(BASE_ADDRESS_REGISTER);
   1.109            Thread.Sleep(1);
   1.110            ushort verify = ReadWord(BASE_ADDRESS_REGISTER);
   1.111  
   1.112 @@ -254,10 +252,10 @@
   1.113  
   1.114            WinbondFintekExit();
   1.115  
   1.116 -          if (address != verify) {            
   1.117 -            report.Append("Chip ID: 0x"); 
   1.118 +          if (address != verify) {
   1.119 +            report.Append("Chip ID: 0x");
   1.120              report.AppendLine(chip.ToString("X"));
   1.121 -            report.Append("Chip revision: 0x"); 
   1.122 +            report.Append("Chip revision: 0x");
   1.123              report.AppendLine(revision.ToString("X"));
   1.124              report.AppendLine("Error: Address verification failed");
   1.125              report.AppendLine();
   1.126 @@ -268,7 +266,7 @@
   1.127            if ((address & 0x07) == 0x05)
   1.128              address &= 0xFFF8;
   1.129  
   1.130 -          if (address < 0x100 || (address & 0xF007) != 0) {            
   1.131 +          if (address < 0x100 || (address & 0xF007) != 0) {
   1.132              report.Append("Chip ID: 0x");
   1.133              report.AppendLine(chip.ToString("X"));
   1.134              report.Append("Chip revision: 0x");
   1.135 @@ -310,7 +308,7 @@
   1.136                break;
   1.137              default: break;
   1.138            }
   1.139 -          
   1.140 +
   1.141            return;
   1.142          }
   1.143  
   1.144 @@ -322,7 +320,7 @@
   1.145            case 0x8716: chip = Chip.IT8716F; break;
   1.146            case 0x8718: chip = Chip.IT8718F; break;
   1.147            case 0x8720: chip = Chip.IT8720F; break;
   1.148 -          case 0x8726: chip = Chip.IT8726F; break; 
   1.149 +          case 0x8726: chip = Chip.IT8726F; break;
   1.150            default: chip = Chip.Unknown; break;
   1.151          }
   1.152          if (chip == Chip.Unknown) {
   1.153 @@ -333,7 +331,7 @@
   1.154              report.AppendLine(chipID.ToString("X"));
   1.155              report.AppendLine();
   1.156            }
   1.157 -        } else {          
   1.158 +        } else {
   1.159            Select(IT87_ENVIRONMENT_CONTROLLER_LDN);
   1.160            ushort address = ReadWord(BASE_ADDRESS_REGISTER);
   1.161            Thread.Sleep(1);
   1.162 @@ -345,14 +343,14 @@
   1.163  
   1.164            if (address != verify || address < 0x100 || (address & 0xF007) != 0) {
   1.165              report.Append("Chip ID: 0x");
   1.166 -            report.AppendLine(chip.ToString("X"));            
   1.167 +            report.AppendLine(chip.ToString("X"));
   1.168              report.Append("Error: Invalid address 0x");
   1.169              report.AppendLine(address.ToString("X"));
   1.170              report.AppendLine();
   1.171              return;
   1.172            }
   1.173  
   1.174 -         superIOs.Add(new IT87XX(chip, address, version));
   1.175 +          superIOs.Add(new IT87XX(chip, address, version));
   1.176  
   1.177            return;
   1.178          }
   1.179 @@ -376,7 +374,19 @@
   1.180  
   1.181            return;
   1.182          }
   1.183 -      }   
   1.184 +      }  
   1.185 +    }
   1.186 +
   1.187 +    public LPCIO() {
   1.188 +      if (!WinRing0.IsAvailable)
   1.189 +        return;
   1.190 +
   1.191 +      if (!WinRing0.WaitIsaBusMutex(100))
   1.192 +        return;
   1.193 +
   1.194 +      Detect();
   1.195 +
   1.196 +      WinRing0.ReleaseIsaBusMutex();      
   1.197      }
   1.198  
   1.199      public ISuperIO[] SuperIO {