在ce上使用了hub集线器之后,USB驱动要注意几点:
1、传输buffer要确定足够大才行。
2、如果设置了USB休眠模式,那么在休眠的时候,要确保能够进入到休眠的处理中。
修改buffer:
E:\WINCE600\PLATFORM\SMDK6410\src\drivers\USB\hcd\s3c6410_ohci.c
// Amount of memory to use for HCD buffer
static const DWORD gcTotalAvailablePhysicalMemory = 64*1024; // 64K
static const DWORD gcHighPriorityPhysicalMemory = 16*1024; // 16K
这个是原代码中定义的buffer,如果使用hub扩展为两个USB,则改大一倍
休眠处理:
看InitializeOHCI()函数中的:
// 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(pobOhcd, dwCapability);
USBH_INF((_T("[USBH:INF] InitializeOHCI() : USB Host Cap : 0x%08x\n"), dwCapability));
}
RegCloseKey(hKey);
}
修改为:
// 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)
{
dwCapability |= 0x01;
HcdMdd_SetCapability(pobOhcd, dwCapability);
USBH_INF((_T("[USBH:INF] InitializeOHCI() : USB Host Cap : 0x%08x\n"), dwCapability));
}
RegCloseKey(hKey);
}
上述情况在使用HUB接3G模块调试的时候出现的,现在已基本修正,特此记录一下。
如果不改大那个buffer,接上3G模块后会出现USB虚拟出来的串口中,有一个串口无法正常进行AT指令交互(正常的情况应该有两个串口可以进行AT指令,一个用于拨号上网,一个用于通话短信等的AT指令交互)。
如果不确保USB在系统休眠的时候进入到对应的休眠处理的话,会出现USB挂掉的问题,导致主U口都用不了的问题。