如何制作支持VMWare的Windows CE BSP2

附2,UHCI driver需要修改的代码(红色部分,在$(DRIVERS)/USB/HCD/UHC/system.csystem.c中):­

­

图片 // Inline functions­

图片 __inline static WORD­

图片 PCIConfig_ReadWord(­

图片                    ULONG BusNumber,­

图片                    ULONG Device,­

图片                    ULONG Function,­

图片                    ULONG Offset­

图片                    )­

图片 图片 ...{­

图片     WORD RetVal = 0;­

图片     PCI_SLOT_NUMBER SlotNumber;­

图片 ­

图片     SlotNumber.u.AsULONG = 0;­

图片     SlotNumber.u.bits.DeviceNumber = Device;­

图片     SlotNumber.u.bits.FunctionNumber = Function;­

图片     HalGetBusDataByOffset(PCIConfiguration, BusNumber, SlotNumber.u.AsULONG, &RetVal, Offset, sizeof(RetVal));­

图片 ­

图片     return RetVal;­

图片

图片 ­

图片 __inline static void­

图片 PCIConfig_Write(­

图片                 ULONG BusNumber,­

图片                 ULONG Device,­

图片                 ULONG Function,­

图片                 ULONG Offset,­

图片                 ULONG Value,­

图片                 ULONG Size­

图片                 )­

图片 图片 ...{­

图片     PCI_SLOT_NUMBER SlotNumber;­

图片 ­

图片     SlotNumber.u.AsULONG = 0;­

图片     SlotNumber.u.bits.DeviceNumber = Device;­

图片     SlotNumber.u.bits.FunctionNumber = Function;­

图片 ­

图片     HalSetBusDataByOffset(PCIConfiguration, BusNumber, SlotNumber.u.AsULONG, &Value, Offset, Size);­

图片

图片 ­

图片 图片 /**//* InitializeUHCI­

图片

图片 * Configure and initialize UHCI card­

图片

图片 * Return Value:­

图片 * Return TRUE if card could be located and configured, otherwise FALSE­

图片 */­

图片 static BOOL­

图片 InitializeUHCI(­

图片                SUhcdPdd * pPddObject, // IN - Pointer to PDD structure­

图片                LPCWSTR szDriverRegKey) // IN - Pointer to active registry key string­

图片 图片 ...{­

图片     PUCHAR ioPortBase = NULL;­

图片     DWORD dwAddrLen;­

图片     DWORD dwIOSpace;­

图片     BOOL InstallIsr = FALSE;­

图片     BOOL fResult = FALSE;­

图片     LPVOID pobMem = NULL;­

图片     LPVOID pobUhcd = NULL;­

图片     DWORD PhysAddr;­

图片     DWORD dwHPPhysicalMemSize;­

图片     HKEY hKey;­

图片     WORD LegSup;图片 ­

图片     DDKWINDOWINFO dwi;­

图片     DDKISRINFO dii;­

图片     DDKPCIINFO dpi;图片 图片     if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,szDriverRegKey,0,0,&hKey)!= ERROR_SUCCESS) ...{­

图片         DEBUGMSG(ZONE_ERROR,(TEXT("InitializeUHCI:GetRegistryConfig RegOpenKeyEx(%s) failed "),­

图片             szDriverRegKey));­

图片         return FALSE;­

图片     }­

图片     dwi.cbSize=sizeof(dwi);­

图片     dii.cbSize=sizeof(dii);­

图片     dpi.cbSize=sizeof(dpi);­

图片     if ( DDKReg_GetWindowInfo(hKey, &dwi ) !=ERROR_SUCCESS ||­

图片         DDKReg_GetIsrInfo (hKey, &dii ) != ERROR_SUCCESS ||­

图片 图片         DDKReg_GetPciInfo (hKey, &dpi ) != ERROR_SUCCESS) ...{­

图片             DEBUGMSG(ZONE_ERROR,(TEXT("InitializeUHCI:DDKReg_GetWindowInfo or DDKReg_GetWindowInfo or DDKReg_GetPciInfo failed ")));图片             goto InitializeUHCI_Error;­

图片         }­

图片 图片     if (dwi.dwNumMemWindows!=0) ...{­

图片         PhysAddr = dwi.memWindows[0].dwBase;­

图片         dwAddrLen= dwi.memWindows[0].dwLen;­

图片         dwIOSpace = 0;­

图片     }­

图片 图片     else if (dwi.dwNumIoWindows!=0) ...{­

图片         PhysAddr= dwi.ioWindows[0].dwBase;­

图片         dwAddrLen = dwi.ioWindows[0].dwLen;­

图片         dwIOSpace = 1;­

图片     }­

图片     else­

图片         goto InitializeUHCI_Error;­

图片     DEBUGMSG(ZONE_INIT,(TEXT("UHCD: Read config from registry: Base Address: 0x%X, Length: 0x%X, I/O Port: %s, SysIntr: 0x%X, Interface Type: %u, Bus Number: %u "),­

图片         PhysAddr, dwAddrLen, dwIOSpace ? L"YES" : L"NO", dii.dwSysintr, dwi.dwInterfaceType, dwi.dwBusNumber));­

图片 ­

图片     ioPortBase = (PUCHAR)PhysAddr;­

图片 图片     if (!(fResult = ConfigureUHCICard(pPddObject, &ioPortBase, dwAddrLen, dwIOSpace, dwi.dwInterfaceType, dwi.dwBusNumber))) ...{­

图片         goto InitializeUHCI_Error;­

图片     }­

图片 图片     if (dii.szIsrDll[0] != 0 && dii.szIsrHandler[0]!=0 && dii.dwIrq<0xff && dii.dwIrq>0 ) ...{­

图片         // Install ISR handler­

图片         pPddObject->IsrHandle = LoadIntChainHandler(dii.szIsrDll,dii.szIsrHandler, (BYTE)dii.dwIrq);­

图片 ­

图片 图片         if (!pPddObject->IsrHandle) ...{­

图片             DEBUGMSG(ZONE_ERROR, (L"UHCD: Couldn't install ISR handler "));­

图片 图片         } else ...{­

图片             GIISR_INFO Info;­

图片 图片             PHYSICAL_ADDRESS PortAddress = ...{PhysAddr, 0};­

图片             DEBUGMSG(ZONE_INIT, (L"UHCD: Installed ISR handler, Dll = '%s', Handler = '%s', Irq = %d ",­

图片                 dii.szIsrDll, dii.szIsrHandler, dii.dwIrq));­

图片 图片             if (!BusTransBusAddrToStatic(pPddObject->hParentBusHandle,dwi.dwInterfaceType, dwi.dwBusNumber, PortAddress, dwAddrLen, &dwIOSpace, &(PVOID)PhysAddr)) ...{­

图片                 DEBUGMSG(ZONE_ERROR, (L"UHCD: Failed TransBusAddrToStatic "));­

图片                 return FALSE;­

图片             }­

图片             // Set up ISR handler­

图片             Info.SysIntr = dii.dwSysintr;­

图片             Info.CheckPort = TRUE;­

图片             Info.PortIsIO = (dwIOSpace) ? TRUE : FALSE;­

图片             Info.UseMaskReg = TRUE;;­

图片             Info.PortAddr = PhysAddr + 0x2;­

图片             Info.PortSize = sizeof(WORD);­

图片             Info.MaskAddr = PhysAddr + 0x4;­

图片 图片             if (!KernelLibIoControl(pPddObject->IsrHandle, IOCTL_GIISR_INFO, &Info, sizeof(Info), NULL, 0, NULL)) ...{­

图片                 DEBUGMSG(ZONE_ERROR, (L"UHCD: KernelLibIoControl call failed. "));­

图片             }­

图片         }­

图片     }­

图片     // The PDD can supply a buffer of contiguous physical memory here, or can let the­

图片     // MDD try to allocate the memory from system RAM. We will use the HalAllocateCommonBuffer()­

图片     // API to allocate the memory and bus controller physical addresses and pass this information­

图片     // into the MDD.­

图片 图片     if (GetRegistryPhysicalMemSize(szDriverRegKey,&pPddObject->dwPhysicalMemSize)) ...{­

图片         // A quarter for High priority Memory.­

图片         dwHPPhysicalMemSize = pPddObject->dwPhysicalMemSize/4;­

图片         // Align with page size.­

图片         pPddObject->dwPhysicalMemSize = (pPddObject->dwPhysicalMemSize + PAGE_SIZE -1) & ~(PAGE_SIZE -1);­

图片         dwHPPhysicalMemSize = ((dwHPPhysicalMemSize + PAGE_SIZE -1) & ~(PAGE_SIZE -1));­

图片     }­

图片 图片     else ...{­

图片         pPddObject->dwPhysicalMemSize=0;­

图片         dwHPPhysicalMemSize = 0;­

图片     }­

图片 图片     if (pPddObject->dwPhysicalMemSize<gcTotalAvailablePhysicalMemory) ...{ // Setup Minimun requirement.­

图片         pPddObject->dwPhysicalMemSize = gcTotalAvailablePhysicalMemory;­

图片         dwHPPhysicalMemSize = gcHighPriorityPhysicalMemory;­

图片     }­

图片 ­

图片     pPddObject->AdapterObject.ObjectSize = sizeof(DMA_ADAPTER_OBJECT);­

图片     pPddObject->AdapterObject.InterfaceType = dwi.dwInterfaceType;­

图片     pPddObject->AdapterObject.BusNumber = dwi.dwBusNumber;­

图片 图片     if ((pPddObject->pvVirtualAddress = HalAllocateCommonBuffer(&pPddObject->AdapterObject, pPddObject->dwPhysicalMemSize, &pPddObject->LogicalAddress, FALSE)) == NULL) ...{­

图片         goto InitializeUHCI_Error;­

图片     }­

图片 图片     if (!(pobMem = HcdMdd_CreateMemoryObject(pPddObject->dwPhysicalMemSize, dwHPPhysicalMemSize, (PUCHAR) pPddObject->pvVirtualAddress, (PUCHAR) pPddObject->LogicalAddress.LowPart))) ...{­

图片         goto InitializeUHCI_Error;­

图片     }­

图片 ­

图片 图片     if (!(pobUhcd = HcdMdd_CreateHcdObject(pPddObject, pobMem, szDriverRegKey, ioPortBase, dii.dwSysintr))) ...{­

图片         goto InitializeUHCI_Error;­

图片     }­

图片 ­

图片     // set LEGSUP here­

图片     LegSup = PCIConfig_ReadWord(dwi.dwBusNumber, dpi.dwDeviceNumber, dpi.dwFunctionNumber, 0xC0);­

图片     RETAILMSG(1, (TEXT("UHCD: LEGSUP=0x%08x "), LegSup));­

图片     LegSup = 0x2000;­

图片     PCIConfig_Write(dwi.dwBusNumber, dpi.dwDeviceNumber, dpi.dwFunctionNumber, 0xC0, LegSup, sizeof(LegSup));图片 ­

图片     pPddObject->lpvMemoryObject = pobMem;­

图片     pPddObject->lpvUhcdMddObject = pobUhcd;­

图片     _tcsncpy(pPddObject->szDriverRegKey, szDriverRegKey, MAX_PATH);­

图片     pPddObject->ioPortBase = ioPortBase;­

图片     pPddObject->dwSysIntr = dii.dwSysintr;­

图片     // PCI OHCI support suspend and resume­

图片 图片     if ( hKey!=NULL) ...{­

图片         DWORD dwCapability;­

图片         DWORD dwType;­

图片         DWORD dwLength = sizeof(DWORD);­

图片         if (RegQueryValueEx(hKey, HCD_CAPABILITY_VALNAME, 0, &dwType, (PUCHAR)&dwCapability, &dwLength) == ERROR_SUCCESS)­

图片             HcdMdd_SetCapability (pobUhcd,dwCapability);­

图片         RegCloseKey(hKey);­

图片     }­

图片 ­

图片     return TRUE;­

图片 ­

图片 InitializeUHCI_Error:­

图片 图片     if (pPddObject->IsrHandle) ...{­

图片         FreeIntChainHandler(pPddObject->IsrHandle);­

图片         pPddObject->IsrHandle = NULL;­

图片     }­

图片     if (pobUhcd)­

图片         HcdMdd_DestroyHcdObject(pobUhcd);­

图片     if (pobMem)­

图片         HcdMdd_DestroyMemoryObject(pobMem);­

图片     if(pPddObject->pvVirtualAddress)­

图片         HalFreeCommonBuffer(&pPddObject->AdapterObject, pPddObject->dwPhysicalMemSize, pPddObject->LogicalAddress, pPddObject->pvVirtualAddress, FALSE);­

图片 ­

图片     pPddObject->lpvMemoryObject = NULL;­

图片     pPddObject->lpvUhcdMddObject = NULL;­

图片     pPddObject->pvVirtualAddress = NULL;­

图片     if ( hKey!=NULL)­

图片         RegCloseKey(hKey);­

图片 ­

图片     return FALSE;­

图片

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值