protected UHCI_qTD_Struct *CreateQTD_IO(UHCI_QueueHead_Struct *uQH, uint *next, byte direction, bool toggle, ushort tokenBytes, byte device, byte endpoint, uint packetSize) { #if UHCI_TRACE BasicConsole.WriteLine("UHCI: Create qTD IO"); BasicConsole.DelayOutput(5); #endif UHCI_qTD_Struct *td = AllocQTD(next); UHCI_qTD.SetPacketID(td, direction); if (tokenBytes != 0) { UHCI_qTD.SetMaxLength(td, (ushort)((tokenBytes - 1u) & 0x7FFu)); } else { UHCI_qTD.SetMaxLength(td, 0x7FF); } UHCI_qTD.SetDataToggle(td, toggle); UHCI_qTD.SetC_ERR(td, 0x3); UHCI_qTD.SetDeviceAddress(td, device); UHCI_qTD.SetEndpoint(td, endpoint); AllocQTDbuffer(td); uQH->q_last = td; return(td); }
protected UHCI_qTD_Struct *CreateQTD_SETUP(UHCI_QueueHead_Struct *uQH, uint *next, bool toggle, ushort tokenBytes, byte type, byte req, byte hiVal, byte loVal, ushort i, ushort length, byte device, byte endpoint, uint packetSize) { #if UHCI_TRACE BasicConsole.WriteLine("UHCI: Create qTD SETUP"); BasicConsole.DelayOutput(5); #endif UHCI_qTD_Struct *td = AllocQTD(next); UHCI_qTD.SetPacketID(td, UHCI_Consts.TD_SETUP); UHCI_qTD.SetDataToggle(td, toggle); UHCI_qTD.SetDeviceAddress(td, device); UHCI_qTD.SetEndpoint(td, endpoint); UHCI_qTD.SetMaxLength(td, (ushort)(tokenBytes - 1)); UHCI_qTD.SetC_ERR(td, 0x3); //TODO: *buffer = USBRequest *request = (USBRequest *)(AllocQTDbuffer(td)); request->type = type; request->request = req; request->valueHi = hiVal; request->valueLo = loVal; request->index = i; request->length = length; uQH->q_last = td; return(td); }
protected static UHCI_qTD_Struct *AllocQTD(uint *next) { #if UHCI_TRACE BasicConsole.WriteLine("UHCI: Alloc qTD"); BasicConsole.DelayOutput(5); #endif UHCI_qTD_Struct *td = (UHCI_qTD_Struct *)FOS_System.Heap.AllocZeroedAPB((uint)sizeof(UHCI_qTD_Struct), 32, "UHCI : AllocQTD"); if ((uint)next != Utils.BIT(0)) { td->next = ((uint)VirtMemManager.GetPhysicalAddress(next) & 0xFFFFFFF0) | UHCI_Consts.BIT_Vf; td->q_next = (UHCI_qTD_Struct *)next; } else { td->next = UHCI_Consts.BIT_T; } UHCI_qTD.SetActive(td, true); // to be executed UHCI_qTD.SetPacketID(td, UHCI_Consts.TD_SETUP); UHCI_qTD.SetMaxLength(td, 0x3F); // 64 byte // uhci, rev. 1.1, page 24 return(td); }
public static void SetDataToggle(UHCI_qTD_Struct *qTD, bool val) { if (val) { qTD->u2 |= Utils.BIT(19); } else { qTD->u2 &= ~Utils.BIT(19); } }
public static void SetIntOnComplete(UHCI_qTD_Struct *qTD, bool val) { if (val) { qTD->u1 |= Utils.BIT(24); } else { qTD->u1 &= ~Utils.BIT(24); } }
public static void SetActive(UHCI_qTD_Struct *qTD, bool val) { if (val) { qTD->u1 |= Utils.BIT(23); } else { qTD->u1 &= ~Utils.BIT(23); } }
protected static void *AllocQTDbuffer(UHCI_qTD_Struct *td) { #if UHCI_TRACE BasicConsole.WriteLine("UHCI: Alloc qTD Buffer"); BasicConsole.DelayOutput(5); #endif td->virtBuffer = FOS_System.Heap.AllocZeroedAPB(0x1000, 0x1000, "UHCI : AllocQTDBuffer"); td->buffer = (uint *)VirtMemManager.GetPhysicalAddress(td->virtBuffer); return(td->virtBuffer); }
protected void CreateQH(UHCI_QueueHead_Struct *head, uint horizPtr, UHCI_qTD_Struct *firstTD) { #if UHCI_TRACE BasicConsole.WriteLine("UHCI: Create QH"); BasicConsole.DelayOutput(5); #endif head->next = (UHCI_QueueHead_Struct *)UHCI_Consts.BIT_T; // (paging_getPhysAddr((void*)horizPtr) & 0xFFFFFFF0) | BIT_QH; if (firstTD == null) { head->transfer = (UHCI_qTD_Struct *)UHCI_Consts.BIT_T; } else { head->transfer = (UHCI_qTD_Struct *)((uint)VirtMemManager.GetPhysicalAddress(firstTD) & 0xFFFFFFF0); head->q_first = firstTD; } }
public static byte GetC_ERR(UHCI_qTD_Struct *qTD) { return((byte)((qTD->u1 & 0x18000000) >> 27)); }
public static bool GetDataToggle(UHCI_qTD_Struct *qTD) { return((qTD->u2 & Utils.BIT(19)) != 0); }
public static void SetEndpoint(UHCI_qTD_Struct *qTD, byte val) { qTD->u2 = (qTD->u2 & 0xFFF87FFF) | ((uint)(val & 0x0F) << 15); }
public static byte GetEndpoint(UHCI_qTD_Struct *qTD) { return((byte)((qTD->u2 & 0x00078000) >> 15)); }
public static void SetDeviceAddress(UHCI_qTD_Struct *qTD, byte val) { qTD->u2 = (qTD->u2 & 0xFFFF80FF) | ((uint)(val & 0x7F) << 8); }
public static byte GetDeviceAddress(UHCI_qTD_Struct *qTD) { return((byte)((qTD->u2 & 0x00007F00) >> 8)); }
public static void SetPacketID(UHCI_qTD_Struct *qTD, byte val) { qTD->u2 = (qTD->u2 & 0xFFFFFF00) | val; }
//u2 public static byte GetPacketID(UHCI_qTD_Struct *qTD) { return((byte)(qTD->u2)); }
public static ushort GetMaxLength(UHCI_qTD_Struct *qTD) { return((ushort)((qTD->u2 & 0xFFE00000) >> 21)); }
public static bool GetIntOnComplete(UHCI_qTD_Struct *qTD) { return((qTD->u1 & Utils.BIT(24)) != 0); }
//u1 public static bool GetActive(UHCI_qTD_Struct *qTD) { return((qTD->u1 & Utils.BIT(23)) != 0); }
public static void SetMaxLength(UHCI_qTD_Struct *qTD, ushort val) { qTD->u2 = (qTD->u2 & 0x001FFFFF) | ((uint)val << 21); }
public static void SetC_ERR(UHCI_qTD_Struct *qTD, byte val) { qTD->u1 = (qTD->u1 & 0xE7FFFFFF) | ((uint)(val & 0x03) << 27); }