acpi.java
来自「纯java操作系统jnode,安装简单和操作简单的个人使用的Java操作系统」· Java 代码 · 共 187 行
JAVA
187 行
/*
* $Id: ACPI.java,v 1.2 2004/01/21 16:06:17 epr Exp $
*/
package org.jnode.driver.acpi;
import java.util.Collection;
import javax.naming.NameNotFoundException;
import javax.naming.NamingException;
import org.apache.log4j.Logger;
import org.jnode.driver.ApiNotFoundException;
import org.jnode.driver.Device;
import org.jnode.driver.DeviceUtils;
import org.jnode.driver.acpi.aml.Aml;
import org.jnode.driver.acpi.aml.NameString;
import org.jnode.driver.acpi.aml.ParseNode;
import org.jnode.driver.acpi.vm.NameSpace;
import org.jnode.driver.firmware.AcpiRSDPInfo;
import org.jnode.driver.firmware.FirmwareAPI;
import org.jnode.naming.InitialNaming;
import org.jnode.system.MemoryResource;
import org.jnode.system.ResourceManager;
import org.jnode.system.ResourceNotFreeException;
import org.jnode.system.ResourceOwner;
import org.jnode.system.SimpleResourceOwner;
/**
* ACPI.
*
* <p>
* Title:
* </p>
* <p>
* Description:
* </p>
* <p>
* Licence: GNU LGPL
* </p>
* <p>
* </p>
*
* @author Francois-Frederic Ozog
* @version 1.0
*/
public class ACPI {
public static final Class NAME = ACPI.class;//"system/acpi";
private final Logger log = Logger.getLogger(getClass());
private RootSystemDescriptionTable RSDT = null;
private int version;
private String oemid;
private byte[] raw;
private NameSpace root;
public void reset() {
}
public ACPI() throws ResourceNotFreeException {
ResourceManager rm;
try {
InitialNaming.bind(NAME, this);
} catch (NamingException ex1) {
}
try {
rm = (ResourceManager) InitialNaming.lookup(ResourceManager.NAME);
} catch (NameNotFoundException ex) {
throw new ResourceNotFreeException("Could not find ResourceManager", ex);
}
final FirmwareAPI firmwareAPI;
try {
final Collection fwDevs = DeviceUtils.getDevicesByAPI(FirmwareAPI.class);
if (fwDevs.isEmpty()) {
throw new ResourceNotFreeException("Cannot find any Firmware devices");
} else {
firmwareAPI = (FirmwareAPI) ((Device) fwDevs.iterator().next()).getAPI(FirmwareAPI.class);
}
} catch (ApiNotFoundException ex) {
throw new ResourceNotFreeException("Firmware device does not implement FirmwareAPI (this is a bug)", ex);
}
// log.debug(" Locating RSD PTR");
final AcpiRSDPInfo acpiInfo = firmwareAPI.getAcpiRSDPInfo();
if (acpiInfo != null) {
final ResourceOwner owner = new SimpleResourceOwner("ACPI");
final MemoryResource rsdtptr;
rsdtptr = rm.claimMemoryResource(owner, acpiInfo.getRsdpStart(), acpiInfo.getLength(), ResourceManager.MEMMODE_NORMAL);
try {
raw = new byte[(int) rsdtptr.getSize()];
rsdtptr.getBytes(0, raw, 0, (int) rsdtptr.getSize());
version = rsdtptr.getByte(15);
oemid = new String(raw, 9, 6);
long startOfRSDT = rsdtptr.getInt(16);
// log.debug("RSDT " + oemid + " start=" + Long.toHexString(startOfRSDT));
if (startOfRSDT > 0) {
RSDT = (RootSystemDescriptionTable) AcpiTable.getTable(new SimpleResourceOwner("ACPI"), rm, (int) startOfRSDT);
// log.debug(RSDT);
RSDT.parse();
/* FixedAcpiDescriptionTable facp = */
RSDT.getFACP();
log.debug(" " + this);
// log.debug("Reset register=" + facp.getResetRegister());
root = NameSpace.getRoot();
root.parse(RSDT.getParsedAml());
// root.dump();
} else {
throw new ResourceNotFreeException("Could not find the RSDT pointer");
}
} finally {
rsdtptr.release();
}
}
}
final void release() {
InitialNaming.unbind(NAME);
}
public void dump() {
if (root != null) {
root.dump();
}
}
public void dumpBattery() {
ParseNode battery;
battery = RSDT.getParsedAml().findName(new NameString("BAT0"), Aml.AML_DEVICE);
if (battery != null) {
log.info(battery.toString());
}
battery = RSDT.getParsedAml().findName(new NameString("BAT1"), Aml.AML_DEVICE);
if (battery != null) {
log.info(battery.toString());
}
}
public String toString() {
StringBuffer buffer = new StringBuffer();
/* FixedAcpiDescriptionTable facp = */
RSDT.getFACP();
buffer.append(oemid);
buffer.append(' ');
buffer.append(RSDT.getOemTableId());
buffer.append(": ACPI version ");
buffer.append(version == 0 ? "1.0" : (version == 2 ? "2.0" : "unknown-" + version));
return buffer.toString();
}
public String toDetailedString() {
StringBuffer buffer = new StringBuffer();
FixedAcpiDescriptionTable facp = RSDT.getFACP();
buffer.append(oemid);
buffer.append(' ');
buffer.append(RSDT.getOemTableId());
buffer.append(" ACPI version ");
buffer.append(version == 0 ? "1.0" : (version == 2 ? "2.0" : "unknown-" + version));
buffer.append("\n PM1A(");
buffer.append(Integer.toHexString(facp.getPm1aControl()));
buffer.append(", ");
buffer.append(Integer.toHexString(facp.getPm1aEvent()));
buffer.append("), PM1B(");
buffer.append(Integer.toHexString(facp.getPm1bControl()));
buffer.append(", ");
buffer.append(Integer.toHexString(facp.getPm1bEvent()));
buffer.append("), PM2(");
buffer.append(Integer.toHexString(facp.getPm2Control()));
buffer.append("), Timer(");
buffer.append(Integer.toHexString(facp.getPmTimer()));
buffer.append("), Events(");
buffer.append(Integer.toHexString(facp.getGeneralPurposeEvent0()));
buffer.append(", ");
buffer.append(Integer.toHexString(facp.getGeneralPurposeEvent1()));
buffer.append("), Flags(");
buffer.append(Integer.toHexString(facp.getFlags()));
buffer.append(")");
return buffer.toString();
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?