一 硬件
USB主机控制器分类
USB Hoster Controller: OHCI vs.UHCI
-OHCI=Open Host Controller Interface.是一种标准的USB主控制器接口,由Compaq,Microsoft 及National Semiconductor Corp.提出,目前已被25个上的公司支持。。大多数便携式计算机使用 OHCI标准芯片,台式PC目前的熟练也成增长趋势。
-UHCI=Universal Host Controller Interface.是一种标准的USB主控制器接口,该版本由Intel. 公司开发。大多数台式PC使用这种接口标准,便携式PC很少使用。
WinCE对2种都支持,但对于我们的PXA270,进行代码跟踪以后发现,使用的是OHCI
PXA270的USB接口
1 USB Host接口
共2个,他们公用一个OHCI 内核,共同使用大部分USB寄存器。
USB1已经有硬件驱动,DP1和DM1可以直接接USB设备或者USB Hub。我们用的是1扩7的HUB,TUSB2077,接鼠标,键盘,显示器和U盘等。
USB2没有硬件驱动,必须外扩驱动芯片。我们的系统用的是USB1T11,专门接打印机。
逻辑框图如下:
OHCI root驱动器
USB PORT1
USB PORT2
USB PORT1 DRIVER
TUSB2077
USB1T11
PXA270
Peripheral
2 USB Client接口
就一个USB接口,在我们系统中,USBC_P和USBC_N直接接主机,软件中配制为系统同步口。
二 软件
总的框图如下图,左边是USB Client,右边是USB Host,其对应的软件分别分布在Drivers"USBFN和Drivers"HCD目录中。
1 Host软件
根据USB主机控制器的不同,软件也分为OHCI和UHCI,但对于我们的系统,只要关注OHCI
在PLATFORM中,USB Controller配置信息在文件Src"Drivers"HCD" ms2_ohci2.cpp中, 用于配制多功能脚和电源使能等。
由于标准的WinCE5.0并不支持PXA270的USB PORT2,在此文件(或者init.c)中加入了相关代码:
//SEOS=3. Host controller single-ended operation using GPIO pads with an
// external transceiver.
//HEOX=1 On-chip host controller transceiver enabled.
//HXS=1 Output signals from USB host controller.
//DMPDE=1 Host Port 2 Transceiver D– Pull Down Enable
//DPPDE=1 Host Port 2 Transceiver D+ Pull Down Enable
//Add by Bruce 2008-5-22 9:23
//for 2nd USB HOST
//GPIO34 USBH_P22 AF1/O
//GPIO35 USBH_P21 AF2/I
//GPIO36 USBH_P24 AF1/O
//GPIO37 USBH_P28 AF1/O
//GPIO38 USBH_P23 AF3/I
//GPIO39 USBH_P26 AF1/O
//GPIO40 USBH_P25 AF3/I
//GPIO41 USBH_P27 AF0/O
ulPinArrayParms[0] = 1;
ulPinArrayParms[1] = 35;
XllpGpioSetDirectionIn( m_pDCGPIOReg, ulPinArrayParms );
ulAlternateFunctionParms[0] = 1;
ulAlternateFunctionParms[1] = XLLP_GPIO_ALT_FN_2;
XllpGpioSetAlternateFn( m_pDCGPIOReg, ulPinArrayParms, ulAlternateFunctionParms );
ulPinArrayParms[0] = 1;
ulPinArrayParms[1] = 38;
XllpGpioSetDirectionIn( m_pDCGPIOReg, ulPinArrayParms );
ulAlternateFunctionParms[0] = 1;
ulAlternateFunctionParms[1] = XLLP_GPIO_ALT_FN_3;
XllpGpioSetAlternateFn( m_pDCGPIOReg, ulPinArrayParms, ulAlternateFunctionParms );
ulPinArrayParms[0] = 1;
ulPinArrayParms[1] = 40;
XllpGpioSetDirectionIn( m_pDCGPIOReg, ulPinArrayParms );
ulAlternateFunctionParms[0] = 1;
ulAlternateFunctionParms[1] = XLLP_GPIO_ALT_FN_3;
XllpGpioSetAlternateFn( m_pDCGPIOReg, ulPinArrayParms, ulAlternateFunctionParms );
ulPinArrayParms[0] = 1;
ulPinArrayParms[1] = 41;
XllpGpioSetDirectionIn( m_pDCGPIOReg, ulPinArrayParms );
ulAlternateFunctionParms[0] = 1;
ulAlternateFunctionParms[1] = XLLP_GPIO_ALT_FN_2;
XllpGpi