免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4223 | 回复: 6
打印 上一主题 下一主题

请教一点关于USB HOST轮询的小问题 ~~ [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-27 14:57 |只看该作者 |倒序浏览
目前我已经驱动起来了usb host,它执行完整个probe,然后定时轮询,轮询也就是不断的读取host port寄存器的值,但是此时我插进U盘等设备,polling却没法检测到这一端口变化,于是我想搞清楚,这个host port状态寄存器的值是怎么来的?是由host主控制自己来置位的,还是必须要我们自己写中断函数来置位的?   还有个问题,我插入U盘的时候,D+线也的确被拉高,为什么无法触发中断呢??

论坛徽章:
0
2 [报告]
发表于 2010-05-27 16:21 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
3 [报告]
发表于 2010-05-27 16:32 |只看该作者
代码方便贴出来看一下吗?

论坛徽章:
0
4 [报告]
发表于 2010-05-27 16:35 |只看该作者
我觉得这要看你使用的USB控制器的规格书~
记得是不同的USB控制器有不同的USB设备插入检测方法~

论坛徽章:
0
5 [报告]
发表于 2010-05-27 21:05 |只看该作者
最后会调用usb_hcd_poll_rh_status(hcd)这个函数定时轮询port,这个函数会调用我的代码  代码如下

顺便说一下 ,我目前移植的是isp1362,有谁做过这个芯片的驱动,指点一下,多谢,卡在这里很多天了没有丝毫进展


  1. static int isp1362_hub_status_data(struct usb_hcd *hcd, char *buf)
  2. {
  3.         struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd);
  4.         int ports, i, changed = 0;
  5.         unsigned long flags;

  6.         if (!HC_IS_RUNNING(hcd->state))
  7.                 return -ESHUTDOWN;

  8.         /* Report no status change now, if we are scheduled to be
  9.            called later */
  10.         if (timer_pending(&hcd->rh_timer))  
  11.                 return 0;

  12.         ports = isp1362_hcd->rhdesca & RH_A_NDP;   //获取端口号  只有2个
  13.         BUG_ON(ports > 2);

  14.         spin_lock_irqsave(&isp1362_hcd->lock, flags);
  15.         if (isp1362_hcd->rhstatus & (RH_HS_LPSC | RH_HS_OCIC))
  16.                 buf[0] = changed = 1;
  17.         else
  18.                 buf[0] = 0;
  19. //read每个端口的状态
  20.         for (i = 0; i < ports; i++) {
  21.                 u32 status = isp1362_hcd->rhport[i];

  22.                 if (status & (RH_PS_CSC | RH_PS_PESC | RH_PS_PSSC |
  23.                               RH_PS_OCIC | RH_PS_PRSC)) {
  24.                         changed = 1;
  25.                         buf[0] |= 1 << (i + 1);
  26.                         continue;
  27.                 }

  28.                 if (!(status & RH_PS_CCS))   //连接状态
  29.                         continue;
  30.         }
  31.         spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
  32.         return changed;
  33. }
复制代码

论坛徽章:
0
6 [报告]
发表于 2010-05-28 09:51 |只看该作者
此轮询非彼轮询

D+拉高就是促发中断,probe的只是知道这个设备是干什么的?地址?端口?有没有子设备?而非probe有没有设备。

论坛徽章:
0
7 [报告]
发表于 2010-06-02 09:38 |只看该作者
回复 6# snail_314


    D+ 被拉高促发中断,此中断是否可以捕捉到?是不是触发HC芯片的中断线的中断?
我目前可以触发D+中断  但是没法捕捉到这个中断 很郁闷,不知道怎么中断的
还有个问题就是 我第一次插入设备 可以捕捉到中断 来触发枚举行为 ,但是当我拔掉 在此插设备就没法再次枚举设备动作了  不解   望指教
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP