Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }
Example #4
0
 public static void SetDataToggle(UHCI_qTD_Struct *qTD, bool val)
 {
     if (val)
     {
         qTD->u2 |= Utils.BIT(19);
     }
     else
     {
         qTD->u2 &= ~Utils.BIT(19);
     }
 }
Example #5
0
 public static void SetIntOnComplete(UHCI_qTD_Struct *qTD, bool val)
 {
     if (val)
     {
         qTD->u1 |= Utils.BIT(24);
     }
     else
     {
         qTD->u1 &= ~Utils.BIT(24);
     }
 }
Example #6
0
 public static void SetActive(UHCI_qTD_Struct *qTD, bool val)
 {
     if (val)
     {
         qTD->u1 |= Utils.BIT(23);
     }
     else
     {
         qTD->u1 &= ~Utils.BIT(23);
     }
 }
Example #7
0
        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);
        }
Example #8
0
        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;
            }
        }
Example #9
0
 public static byte GetC_ERR(UHCI_qTD_Struct *qTD)
 {
     return((byte)((qTD->u1 & 0x18000000) >> 27));
 }
Example #10
0
 public static bool GetDataToggle(UHCI_qTD_Struct *qTD)
 {
     return((qTD->u2 & Utils.BIT(19)) != 0);
 }
Example #11
0
 public static void SetEndpoint(UHCI_qTD_Struct *qTD, byte val)
 {
     qTD->u2 = (qTD->u2 & 0xFFF87FFF) | ((uint)(val & 0x0F) << 15);
 }
Example #12
0
 public static byte GetEndpoint(UHCI_qTD_Struct *qTD)
 {
     return((byte)((qTD->u2 & 0x00078000) >> 15));
 }
Example #13
0
 public static void SetDeviceAddress(UHCI_qTD_Struct *qTD, byte val)
 {
     qTD->u2 = (qTD->u2 & 0xFFFF80FF) | ((uint)(val & 0x7F) << 8);
 }
Example #14
0
 public static byte GetDeviceAddress(UHCI_qTD_Struct *qTD)
 {
     return((byte)((qTD->u2 & 0x00007F00) >> 8));
 }
Example #15
0
 public static void SetPacketID(UHCI_qTD_Struct *qTD, byte val)
 {
     qTD->u2 = (qTD->u2 & 0xFFFFFF00) | val;
 }
Example #16
0
 //u2
 public static byte GetPacketID(UHCI_qTD_Struct *qTD)
 {
     return((byte)(qTD->u2));
 }
Example #17
0
 public static ushort GetMaxLength(UHCI_qTD_Struct *qTD)
 {
     return((ushort)((qTD->u2 & 0xFFE00000) >> 21));
 }
Example #18
0
 public static bool GetIntOnComplete(UHCI_qTD_Struct *qTD)
 {
     return((qTD->u1 & Utils.BIT(24)) != 0);
 }
Example #19
0
 //u1
 public static bool GetActive(UHCI_qTD_Struct *qTD)
 {
     return((qTD->u1 & Utils.BIT(23)) != 0);
 }
Example #20
0
 public static void SetMaxLength(UHCI_qTD_Struct *qTD, ushort val)
 {
     qTD->u2 = (qTD->u2 & 0x001FFFFF) | ((uint)val << 21);
 }
Example #21
0
 public static void SetC_ERR(UHCI_qTD_Struct *qTD, byte val)
 {
     qTD->u1 = (qTD->u1 & 0xE7FFFFFF) | ((uint)(val & 0x03) << 27);
 }