WinCE PXA270 下USB驱动的修改
一 硬件
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;
XllpGpioSetAlternateFn( m_pDCGPIOReg, ulPinArrayParms, ulAlternateFunctionParms );
ulPinArrayParms[0] = 1;
ulPinArrayParms[1] = 34;
XllpGpioSetOutput0( m_pDCGPIOReg, ulPinArrayParms );
XllpGpioSetDirectionOut( m_pDCGPIOReg, ulPinArrayParms );
ulAlternateFunctionParms[0] = 1;
ulAlternateFunctionParms[1] = XLLP_GPIO_ALT_FN_1;
XllpGpioSetAlternateFn( m_pDCGPIOReg, ulPinArrayParms, ulAlternateFunctionParms );
ulPinArrayParms[0] = 1;
ulPinArrayParms[1] = 36;
XllpGpioSetOutput0( m_pDCGPIOReg, ulPinArrayParms );
XllpGpioSetDirectionOut( m_pDCGPIOReg, ulPinArrayParms );
ulAlternateFunctionParms[0] = 1;
ulAlternateFunctionParms[1] = XLLP_GPIO_ALT_FN_1;
XllpGpioSetAlternateFn( m_pDCGPIOReg, ulPinArrayParms, ulAlternateFunctionParms );
ulPinArrayParms[0] = 1;
ulPinArrayParms[1] = 37;
XllpGpioSetOutput0( m_pDCGPIOReg, ulPinArrayParms );
XllpGpioSetDirectionOut( m_pDCGPIOReg, ulPinArrayParms );
ulAlternateFunctionParms[0] = 1;
ulAlternateFunctionParms[1] = XLLP_GPIO_ALT_FN_1;
XllpGpioSetAlternateFn( m_pDCGPIOReg, ulPinArrayParms, ulAlternateFunctionParms );
ulPinArrayParms[0] = 1;
ulPinArrayParms[1] = 39;
XllpGpioSetOutput0( m_pDCGPIOReg, ulPinArrayParms );
XllpGpioSetDirectionOut( m_pDCGPIOReg, ulPinArrayParms );
ulAlternateFunctionParms[0] = 1;
ulAlternateFunctionParms[1] = XLLP_GPIO_ALT_FN_1;
XllpGpioSetAlternateFn( m_pDCGPIOReg, ulPinArrayParms, ulAlternateFunctionParms );
PHYSICAL_ADDRESS ioPhysicalBase = { 0x40600000, 0};
volatile XLLP_UDC_T *udc=(volatile XLLP_UDC_T*)MmMapIoSpace(ioPhysicalBase, sizeof(XLLP_UDC_T),FALSE);
//SEOS=26:24 0b011 = Host controller single-ended operation using GPIO pads with an
// // external transceiver.
// //HXOE=17:17 0 = On-chip host controller transceiver disabled.
// //HXS =16:16 0 = Output signals from USB device controller.
udc->UP2OCR=0x03020000;
PXA270主机驱动器类的实现在目录"PUBLIC"COMMON"OAK" CSP"ARM"INTEL"PXA27X"HCD。在USB测试的过程中,我们发现最多只能插2个U盘,更不能同时接U盘和打印机,为此修改如下变量:
PUBLIC"COMMON"OAK"CSP"ARM"INTEL"PXA27X"HCD"bul_ohci.cpp
// Constant
static const DWORD gcTotalAvailablePhysicalMemory = 65536*3; // 64K
static const DWORD gcHighPriorityPhysicalMemory = 0x4000*3; // 16K
USB主机系统的各种协议驱动在PUBLIC"COMMON"OAK"DRIVERS"USB目录下。
2 Client软件
没有做任何修改,有关文件分布在以下目录:
端口,数据地址,注册表的配置在PLATFORM"Mtct_smt_2700g"Src "Drivers"USBFN
PXA270的硬件驱动类在PUBLIC"COMMON"OAK"CSP"ARM"INTEL"
PXA27X"USBFN
各种协议驱动在PUBLIC"COMMON"OAK"DRIVERS"USBFN目录下。
posted on 2009-07-03 10:45 常州市润邦电子科技 阅读(1153) 评论(0) 编辑 收藏 举报