感谢兄弟的帮助,邮件已收到,我试一下,稍后回复你
点赞  2010-1-11 16:05
晕死,对比了一下,兄弟的源码与我BSP中的是一模一样的,呵呵

我这现在的问题是插入USB线,中断没有触发
点赞  2010-1-11 16:09
fuction client的组件和mass storage的组件我都试过了,注册表也做了相应的修改

郁闷,都是中断不触发,至少中断应该触发才是啊,我一会再多输出些调试信息看看吧

这份驱动中没有看到任何使能ep中断的代码,xuefeng_baggio兄弟的驱动在自己的BPS中好使?
点赞  2010-1-11 16:23
我问你的bsp是动态中断申请还是静态??你要好好看看!我的肯定是行的!我移植的是2440官方的bsp!
点赞  2010-1-11 16:48
动态和静态结合的,像网卡声音的驱动就是静态申请的,USBD是动态的,我用4.2移植的驱动已经跑通了
点赞  2010-1-11 21:59
不管动态还是静态,OEMInterruptHandle里面应该都能看到USBD被触发的,我现在就是OEMInterruptHandle函数里都没有反应

麻烦把你注册表的设置也发给我可以吗?谢谢
点赞  2010-1-11 22:01
Active下也有UFN1 和COM5了,就是插上USB线没有中断触发,这是为什么呢
点赞  2010-1-12 11:18
Function驱动的ISTMain函数里使能了EP0的中断

但是我系统启动没插USB线中断就触发了两次,之后再插上USB线中断也不来了

我再看看HandleUSBEvent里究竟走到哪去了,上午把USB Client和Controller整个看了一遍,大概知道驱动是什么结构了

xuefeng_baggio兄弟怎么不来了?帮人帮到底吧,呵,谢谢啦
点赞  2010-1-12 16:41
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
点赞  2010-1-13 11:42
快沉底了,顶起来,大家帮帮忙吧
点赞  2010-1-13 11:48
现在是系统启动,插不插USB线USB_SUSPEND_INTR都会触发两次
启动之后插入USB线,中断就是没任何反应,ep0中断不触发
点赞  2010-1-13 11:50
不好意思!最近忙自己的驱动没时间看!你问题解决了吗?现在什么问题呢??
点赞  2010-1-13 19:13
邦顶一下.
点赞  2010-1-13 19:15
现在还是系统启动,插不插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线反而不来中断

可把我郁闷坏了,不知道从哪下手了,寄存器我用应用程序读取了,配置也都是正确的
点赞  2010-1-14 14:19
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都是这么写的,问题调了好几天了,还是没搞定
点赞  2010-1-19 14:29
问题解决了,BSP在一个很隐蔽的地方改动了MISCCR寄存器的配置,导致了一系列的奇怪问题

如果同步中发生619错误,把下面那两项加上就行了
[HKEY_LOCAL_MACHINE\Drivers\USB\FunctionDrivers\Serial_Class]
   "idVendor"=dword:0547
   "idProduct"=dword:2720
或者改pc端的inf文件

连不上也有可能是设备方的时间不对,pc端activesync又选择了同步时间

结贴

点赞  2010-1-20 13:13
12
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复