晕死,对比了一下,兄弟的源码与我BSP中的是一模一样的,呵呵
我这现在的问题是插入USB线,中断没有触发
fuction client的组件和mass storage的组件我都试过了,注册表也做了相应的修改
郁闷,都是中断不触发,至少中断应该触发才是啊,我一会再多输出些调试信息看看吧
这份驱动中没有看到任何使能ep中断的代码,xuefeng_baggio兄弟的驱动在自己的BPS中好使?
我问你的bsp是动态中断申请还是静态??你要好好看看!我的肯定是行的!我移植的是2440官方的bsp!
动态和静态结合的,像网卡声音的驱动就是静态申请的,USBD是动态的,我用4.2移植的驱动已经跑通了
不管动态还是静态,OEMInterruptHandle里面应该都能看到USBD被触发的,我现在就是OEMInterruptHandle函数里都没有反应
麻烦把你注册表的设置也发给我可以吗?谢谢
Active下也有UFN1 和COM5了,就是插上USB线没有中断触发,这是为什么呢
Function驱动的ISTMain函数里使能了EP0的中断
但是我系统启动没插USB线中断就触发了两次,之后再插上USB线中断也不来了
我再看看HandleUSBEvent里究竟走到哪去了,上午把USB Client和Controller整个看了一遍,大概知道驱动是什么结构了
xuefeng_baggio兄弟怎么不来了?帮人帮到底吧,呵,谢谢啦
UFN_Init
pContext->pUfnBus = new CUfnBus(pszContext, pContext);
pContext->pUfnBus->Init
//这里不知道总线驱动如何调用的BusIoControl
"BusIoctl"=dword:2a0048
CUfnBus::PostInit
dwRet = GetDefaultClientName(szClientName, dim(szClientName));
dwRet = CreateChild(szClientName, &pDevice);
CUfnBusDevice *pDevice = new CUfnBusDevice
pDevice->Init
DeviceFolder::Init()
//编译SerialUSBFn的时候使用了-DUSE_NEW_SERIAL_MODEL定义
//SerialUSBFn导出了一堆COM_XXX函数
源码Cserpdd.cpp (e:\ce60\public\common\oak\drivers\serial\serpddcm)
COM_INIT
SerInit
CSerialPDD * CreateSerialObject
pSerialPDD = new USBSerialFn(lpActivePath,pMdd, pHwObj);
pSerialPDD->Init()
CUsbFn::Init()
UfnInitializeInterface
fSuccess = BusChildIoControl(hBusAccess, IOCTL_UFN_GET_CLIENT_DATA_EX, &ucd, sizeof(ucd));
GetClientFunctions
UfnMdd_RegisterDevice
pdescClient = new CDescriptors;
CDescriptors::RegisterDevice
dwRet = pContext->PddInfo.pfnRegisterDevice(
UfnPdd_RegisterDevice
fErr = ActivateChild(m_szClientBusName);
UFN_MDD_INTERFACE_INFO MddInterfaceInfo = {
UFN_PDD_INTERFACE_VERSION, &UfnMdd_Notify
};
dwErr = UfnPdd_Init(pszContext, pContext, &MddInterfaceInfo, &pContext->PddInfo);
在CUsbFn::Init()已经调用
StartUSBFunction
******dwRet = m_pUfnFuncs->lpStart(m_hDevice, DeviceNotifyStub, this, &m_hDefaultPipe);
UfnMdd_Start
dwRet = pContext->PddInfo.pfnStart(pContext->PddInfo.pvPddContext);
UfnPdd_Start
启动IST_MAIN
初始化之后插入USB线之前,只有IST_MAIN中使能了SusPend Mode 和 EP0的中断
系统启动,插不插USB线USB_SUSPEND_INTR都会触发两次
插入USB线,中断就是没反应,ep0中断不触发
HandleUSBEvent
UfnMdd_Notify
UFN_MSG_SETUP_PACKET:
UFN_MSG_PREPROCESSED_SETUP_PACKET:
ProcessRequest
//整个USBFN代码里只有ProcessSetConfiguration函数发出了UFN_MSG_CONFIGURED的通知
//而pdd的driver里没有发现设置udr为USB_REQUEST_SET_CONFIGURATION的位置
//不清楚如何才能触发CableAttached
//如果有通知了,应该走下面
USB_REQUEST_SET_CONFIGURATION
ProcessSetConfiguration
SendDeviceNotification(pContext->lpDeviceNotify, pContext->pvDeviceNotifyParameter, dwMsg, dwParam);
DeviceNotifyStub
CUsbFn::DeviceNotify
UFN_MSG_CONFIGURED
CableAttached
OpenBulkIn
OpenBulkOut
OpenInterruptIn
CUsbFuncPipe::OpenPipe
m_pUfnFuncs->lpOpenPipe
UfnMdd_OpenPipe pPipe = FindPipe(pContext, dwEndpointAddress);
dwRet = pPipe->Open(pContext->Speed, NULL);
CPipeBase::Open
UfnPdd_InitEndpoint
现在是系统启动,插不插USB线USB_SUSPEND_INTR都会触发两次
启动之后插入USB线,中断就是没任何反应,ep0中断不触发
不好意思!最近忙自己的驱动没时间看!你问题解决了吗?现在什么问题呢??
现在还是系统启动,插不插USB线USB_SUSPEND_INTR都会触发两次
启动之后插入USB线,中断就是没任何反应,ep0中断不触发
昨天我在ISTMain里面屏蔽了USB_SUSPEND_INTR模式的中断使能
结果系统启动时插不插USB线都仍然会自动触发一次中断,此时返回的
BYTE bEpIrqStat = ReadReg(pContext, EP_INT_REG_OFFSET);
BYTE bUSBBusIrqStat = ReadReg(pContext, USB_INT_REG_OFFSET);
bEpIrqStat和bUSBBusIrqStat 都是0 ,我就纳闷了,为啥中断来了它俩还都是0呢
而且是系统启动还没插usb线就来中断了,启动之后插入usb线反而不来中断
可把我郁闷坏了,不知道从哪下手了,寄存器我用应用程序读取了,配置也都是正确的
pVMem = (BYTE *)pVMem;
pHWHead->pUSBCtrlAddr=(volatile struct udcreg *)((BYTE *)pVMem + 0x140); // offset
bMapReturn = VirtualCopy( pVMem+PAGE_SIZE,
(LPVOID)IOP_BASE,
PAGE_SIZE,
PAGE_READWRITE | PAGE_NOCACHE );
if (!bMapReturn)
{
err = GetLastError();
DEBUGMSG(1, (TEXT("Virtual Copy: IOP SPACE FAILED\r\n")));
}
pHWHead->pIrqCtrlAddr=(volatile IOPreg *)(pVMem+PAGE_SIZE);
bMapReturn = VirtualCopy( pVMem+PAGE_SIZE,
(LPVOID)CLKPWR_BASE,
PAGE_SIZE,
PAGE_READWRITE | PAGE_NOCACHE );
if (!bMapReturn)
{
err = GetLastError();
DEBUGMSG(1, (TEXT("Virtual Copy: CLKPWR SPACE FAILED\r\n")));
}
pHWHead->pCLKPWR = (volatile CLKPWRreg *)(pVMem+PAGE_SIZE);
4.2的usbdevice驱动力的这段代码是不是写得有问题啊,我这两份BSP都是这么写的,问题调了好几天了,还是没搞定
问题解决了,BSP在一个很隐蔽的地方改动了MISCCR寄存器的配置,导致了一系列的奇怪问题
如果同步中发生619错误,把下面那两项加上就行了
[HKEY_LOCAL_MACHINE\Drivers\USB\FunctionDrivers\Serial_Class]
"idVendor"=dword:0547
"idProduct"=dword:2720
或者改pc端的inf文件
连不上也有可能是设备方的时间不对,pc端activesync又选择了同步时间
结贴