uhcicontrolrequest.java

来自「纯java操作系统jnode,安装简单和操作简单的个人使用的Java操作系统」· Java 代码 · 共 87 行

JAVA
87
字号
/*
 * $Id: UHCIControlRequest.java,v 1.1 2003/11/25 11:42:17 epr Exp $
 */
package org.jnode.driver.usb.uhci;

import org.jnode.driver.usb.SetupPacket;
import org.jnode.driver.usb.USBConstants;
import org.jnode.driver.usb.USBException;
import org.jnode.driver.usb.USBPacket;
import org.jnode.driver.usb.spi.AbstractUSBControlRequest;

/**
 * @author Ewout Prangsma (epr@users.sourceforge.net)
 */
public class UHCIControlRequest extends AbstractUSBControlRequest implements UHCIRequest, USBConstants {

	/** The first TD of this request */
	private TransferDescriptor setupTD;
	
	/**
	 * Initialize this instance
	 * @param setupPacket
	 * @param dataPacket
	 */
	public UHCIControlRequest(SetupPacket setupPacket, USBPacket dataPacket) {
		super(setupPacket, dataPacket);
	}
	
	public void createTDs(UHCIPipe pipe)
	throws USBException {
		final SetupPacket setupPacket = getSetupPacket();
		
		// The setup TD
		setupTD = pipe.createTD(USB_PID_SETUP, true, setupPacket.getData(), 0, setupPacket.getSize(), false);
		//log.debug("setupTD: " + setupTD + ", ls=" + ls);
		
		// Add the data TD's
		final USBPacket dataPacket = getDataPacket();
		final int transferLength = setupPacket.getLength();
		int length = transferLength;
		int offset = 0;
		final int dataPid = (setupPacket.isDirIn() ? USB_PID_IN : USB_PID_OUT);
		boolean dataToggle = false; // Start with DATA1
		final int maxPacketSize = pipe.getMaxPacketSize();
		if (maxPacketSize <= 0) {
			throw new USBException("Invalid maximum packet size " + maxPacketSize);
		}
		while (length > 0) {

			// Create the TD for this part of the data packet
			final TransferDescriptor dataTD;
			final int curlen = Math.min(length, maxPacketSize);
			dataTD = pipe.createTD(dataPid, dataToggle, dataPacket.getData(), offset, curlen, false);
			// Add the TD to the list
			setupTD.append(dataTD, false);
			
			// Update fields
			dataToggle = !dataToggle;
			length -= curlen;
			offset += curlen;
		}
		
		// Add final control packet
		final TransferDescriptor statusTD;
		final int statusPid = ((setupPacket.isDirOut() || (transferLength == 0)) ? USB_PID_IN : USB_PID_OUT);
		statusTD = pipe.createTD(statusPid, false, null, 0, 0, true);
		// Append theTD to the list
		setupTD.append(statusTD, false);
	}
	

	/**
	 * Gets the first TD of this request.
	 */
	public TransferDescriptor getFirstTD() {
		return setupTD;
	}
	
	/**
	 * @see java.lang.Object#toString()
	 */
	public String toString() {
		return "setup[" + getSetupPacket() + "]";
	}

}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?