Chinaunix
标题:
请教一点关于USB HOST轮询的小问题 ~~
[打印本页]
作者:
约修亚
时间:
2010-05-27 14:57
标题:
请教一点关于USB HOST轮询的小问题 ~~
目前我已经驱动起来了usb host,它执行完整个probe,然后定时轮询,轮询也就是不断的读取host port寄存器的值,但是此时我插进U盘等设备,polling却没法检测到这一端口变化,于是我想搞清楚,这个host port状态寄存器的值是怎么来的?是由host主控制自己来置位的,还是必须要我们自己写中断函数来置位的? 还有个问题,我插入U盘的时候,D+线也的确被拉高,为什么无法触发中断呢??
作者:
8516947
时间:
2010-05-27 16:21
提示:
作者被禁止或删除 内容自动屏蔽
作者:
T-Bagwell
时间:
2010-05-27 16:32
代码方便贴出来看一下吗?
作者:
superfight
时间:
2010-05-27 16:35
我觉得这要看你使用的USB控制器的规格书~
记得是不同的USB控制器有不同的USB设备插入检测方法~
作者:
约修亚
时间:
2010-05-27 21:05
最后会调用usb_hcd_poll_rh_status(hcd)这个函数定时轮询port,这个函数会调用我的代码 代码如下
顺便说一下 ,我目前移植的是isp1362,有谁做过这个芯片的驱动,指点一下,多谢,卡在这里很多天了没有丝毫进展
static int isp1362_hub_status_data(struct usb_hcd *hcd, char *buf)
{
struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd);
int ports, i, changed = 0;
unsigned long flags;
if (!HC_IS_RUNNING(hcd->state))
return -ESHUTDOWN;
/* Report no status change now, if we are scheduled to be
called later */
if (timer_pending(&hcd->rh_timer))
return 0;
ports = isp1362_hcd->rhdesca & RH_A_NDP; //获取端口号 只有2个
BUG_ON(ports > 2);
spin_lock_irqsave(&isp1362_hcd->lock, flags);
if (isp1362_hcd->rhstatus & (RH_HS_LPSC | RH_HS_OCIC))
buf[0] = changed = 1;
else
buf[0] = 0;
//read每个端口的状态
for (i = 0; i < ports; i++) {
u32 status = isp1362_hcd->rhport[i];
if (status & (RH_PS_CSC | RH_PS_PESC | RH_PS_PSSC |
RH_PS_OCIC | RH_PS_PRSC)) {
changed = 1;
buf[0] |= 1 << (i + 1);
continue;
}
if (!(status & RH_PS_CCS)) //连接状态
continue;
}
spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
return changed;
}
复制代码
作者:
snail_314
时间:
2010-05-28 09:51
此轮询非彼轮询
D+拉高就是促发中断,probe的只是知道这个设备是干什么的?地址?端口?有没有子设备?而非probe有没有设备。
作者:
约修亚
时间:
2010-06-02 09:38
回复
6#
snail_314
D+ 被拉高促发中断,此中断是否可以捕捉到?是不是触发HC芯片的中断线的中断?
我目前可以触发D+中断 但是没法捕捉到这个中断 很郁闷,不知道怎么中断的
还有个问题就是 我第一次插入设备 可以捕捉到中断 来触发枚举行为 ,但是当我拔掉 在此插设备就没法再次枚举设备动作了 不解 望指教
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2