|
|
/*++
Copyright (c) 1999 Microsoft Corporation
Module Name:
usbuhci.c
Abstract:
WinDbg Extension Api implements
Author:
jd
Environment:
User Mode.
Revision History:
--*/
#include "precomp.h"
#include "usb.h"
#include "usbhcdi.h"
#include "..\miniport\usbuhci\uhci.h"
#include "..\miniport\usbuhci\usbuhci.h"
#include "usbhcdkd.h"
VOID DumpUHCI_DeviceData( MEMLOC MemLoc, BOOLEAN Verbose ) { UCHAR cs[] = "usbuhci!_DEVICE_DATA"; ULONG f, i; UCHAR fld[40], fld1[40], fld2[40], fld3[40], fld4[40]; STRUC_ENTRY t[] = { "Sig", FT_SIG, "Registers", FT_PTR, "EnabledInterrupts", FT_ULONG, "AsyncQueueHead", FT_PTR, "ControllerFlavor", FT_ULONG, "LastFrame", FT_ULONG, "FrameNumberHighPart", FT_ULONG, "PortResetChange", FT_ULONG, "PortSuspendChange", FT_ULONG, "PortConnectChange", FT_ULONG, "IrqStatus", FT_USHORT, "PortPowerControl", FT_USHORT, "FrameListVA", FT_PTR, "ControlQueueHead", FT_PTR, "BulkQueueHead", FT_PTR, "LastBulkQueueHead", FT_PTR };
PrintfMemLoc("*USBUHCI DEVICE DATA ", MemLoc, "\n"); UsbDumpStruc(MemLoc, cs, &t[0], sizeof(t)/sizeof(STRUC_ENTRY));
}
VOID DumpUHCI_Qh( MEMLOC MemLoc ) { HW_QUEUE_HEAD hwqh; ULONG cb; UCHAR cs[] = "_HCD_QUEUEHEAD_DESCRIPTOR"; STRUC_ENTRY qh[] = { "Sig", FT_SIG, "PhysicalAddress", FT_ULONG, "QhFlags", FT_ULONG, "NextQh", FT_PTR, "PrevQh", FT_PTR, "EndpointData", FT_PTR, };
PrintfMemLoc("*USBUHCI QH ", MemLoc, "\n");
UsbDumpStruc(MemLoc, cs, &qh[0], sizeof(qh)/sizeof(STRUC_ENTRY));
ReadMemory(MemLoc, &hwqh, sizeof(hwqh), &cb);
dprintf("HwQH\n"); // dump as
dprintf("\t HLink %08.8x ", hwqh.HLink.HwAddress); if (hwqh.HLink.Terminate) { dprintf("(T)"); } if (hwqh.HLink.QHTDSelect) { dprintf("(QH)"); } dprintf("\n"); dprintf("\t\t Physical Address %08.8x \n", hwqh.HLink.HwAddress & ~HW_LINK_FLAGS_MASK);
// dump as
dprintf("\t VLink %08.8x ", hwqh.VLink.HwAddress); if (hwqh.VLink.Terminate) { dprintf("(T)"); } if (hwqh.VLink.QHTDSelect) { dprintf("(QTD)"); } dprintf("\n"); dprintf("\t\t Physical Address %08.8x \n", hwqh.VLink.HwAddress & ~HW_LINK_FLAGS_MASK);
}
VOID DumpUHCI_FrameList( MEMLOC MemLoc ) { UCHAR cs[] = "usbuhci!_DEVICE_DATA"; ULONG addr, cb, i; MEMLOC fl; fl = UsbReadFieldPtr(MemLoc, cs, "FrameListVA"), PrintfMemLoc("*FRAME LIST @", fl, "\n");
for (i = 0; i< 1024; i++) { ReadMemory(fl, &addr, sizeof(addr), &cb); dprintf("[%03.3x] - %08.8x ", i, addr & ~HW_LINK_FLAGS_MASK); fl+=sizeof(ULONG);
if ((i+1)%4 == 0) { dprintf("\n"); } }
}
VOID DumpUHCI_Td( MEMLOC MemLoc ) { HW_QUEUE_ELEMENT_TD hwtd; ULONG cb; UCHAR cs[] = "_HCD_TRANSFER_DESCRIPTOR"; STRUC_ENTRY td[] = { "Sig", FT_SIG, "PhysicalAddress", FT_ULONG, "Packet[0]", FT_UCHAR, "Packet[1]", FT_UCHAR, "Packet[2]", FT_UCHAR, "Packet[3]", FT_UCHAR, "Packet[4]", FT_UCHAR, "Packet[5]", FT_UCHAR, "Packet[6]", FT_UCHAR, "TransferContext", FT_PTR, "Flags", FT_ULONG, "TransferLength", FT_ULONG, "NextHcdTD", FT_PTR, "DoubleBufferIndex", FT_ULONG };
PrintfMemLoc("*USBUHCI TD ", MemLoc, "\n");
UsbDumpStruc(MemLoc, cs, &td[0], sizeof(td)/sizeof(STRUC_ENTRY));
// tds are a fixed size of 64/32 platforms so
// we can just read it in
ReadMemory(MemLoc, &hwtd, sizeof(hwtd), &cb);
dprintf("HwTD\n");
// dump as async
dprintf("\t LinkPointer %08.8x\n", hwtd.LinkPointer); dprintf("\t Control %08.8x\n", hwtd.Control); dprintf("\t\t Control.Reserved1 %d\n", hwtd.Control.Reserved1); dprintf("\t\t Control.ActualLength %d\n", hwtd.Control.ActualLength); dprintf("\t\t Control.BitstuffError %d\n", hwtd.Control.BitstuffError); dprintf("\t\t Control.Reserved2 %d\n", hwtd.Control.Reserved2); dprintf("\t\t Control.TimeoutCRC %d\n", hwtd.Control.TimeoutCRC); dprintf("\t\t Control.NAKReceived %d\n", hwtd.Control.NAKReceived); dprintf("\t\t Control.BabbleDetected %d\n", hwtd.Control.BabbleDetected); dprintf("\t\t Control.DataBufferError %d\n", hwtd.Control.DataBufferError); dprintf("\t\t Control.Stalled %d\n", hwtd.Control.Stalled); dprintf("\t\t Control.Active %d\n", hwtd.Control.Active); dprintf("\t\t Control.InterruptOnComplete %d\n", hwtd.Control.InterruptOnComplete); dprintf("\t\t Control.IsochronousSelect %d\n", hwtd.Control.IsochronousSelect); dprintf("\t\t Control.LowSpeedDevice %d\n", hwtd.Control.LowSpeedDevice); dprintf("\t\t Control.ErrorCount %d\n", hwtd.Control.ErrorCount); dprintf("\t\t Control.ShortPacketDetect %d\n", hwtd.Control.ShortPacketDetect); dprintf("\t\t Control.Reserved3 %d\n", hwtd.Control.Reserved3); dprintf("\t Token %08.8x\n", hwtd.Token); dprintf("\t\t Token.DeviceAddress %d\n", hwtd.Token.DeviceAddress); dprintf("\t\t Token.Endpoint %d\n", hwtd.Token.Endpoint); dprintf("\t\t Token.DataToggle %d\n", hwtd.Token.DataToggle); dprintf("\t\t Token.Reserved %d\n", hwtd.Token.Reserved); dprintf("\t\t Token.MaximumLength %d\n", hwtd.Token.MaximumLength); dprintf("\n"); }
DECLARE_API( _uhcifl )
/*++
Routine Description:
dumps the extension
Arguments:
args - Address flags
Return Value:
None
--*/
{ MEMLOC addr; // fetch the list head
addr = GetExpression(args); DumpUHCI_FrameList (addr);
return S_OK; }
DECLARE_API( _uhcitd )
/*++
Routine Description:
dumps the extension
Arguments:
args - Address flags
Return Value:
None
--*/
{ MEMLOC addr; // fetch the list head
addr = GetExpression(args); DumpUHCI_Td (addr);
return S_OK; }
DECLARE_API( _uhciqh )
/*++
Routine Description:
dumps the extension
Arguments:
args - Address flags
Return Value:
None
--*/
{ MEMLOC addr; // fetch the list head
addr = GetExpression(args); DumpUHCI_Qh (addr);
return S_OK; }
DECLARE_API( _uhciports )
/*++
Routine Description:
dumps the extension
Arguments:
args - Address flags
Return Value:
None
--*/
{ MEMLOC addr;
return S_OK; }
DECLARE_API( _uhcidd )
/*++
Routine Description:
dumps the extension
Arguments:
args - Address flags
Return Value:
None
--*/
{ MEMLOC addr; PCSTR s; UCHAR parm[32];
GetExpressionEx( args, &addr, &s ); sscanf(s, ",%s", &parm); dprintf("%s\n", parm);
DumpUHCI_DeviceData(addr, parm[0] == 'v');
return S_OK; }
|