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 + -
显示快捷键?