免费注册 查看新帖 |

Chinaunix

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

熟悉linux下USB部分的请进 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-24 21:39 |只看该作者 |倒序浏览
向大家请教一个问题:我在一个普通的字符设备驱动中要关闭一个usb的hub应该调用usb驱动中的哪些函数?用usb_disconnect还是hub_disconnect,或者其他函数?在调用这些函数之前,是否还需要做些其他事情?我的具体问题如下:
         我们的板子是用powerpc405ex作cpu,其USB控制器下挂的是一个phy芯片:usb3300,usb3300下接了一个hub芯片,扩展出4个usb口。由于cpu的外部数据总线的高16位管脚和其usb控制器管脚是复用的,我们需要在使用外部数据总线高16位时断开cpu和usb3300的连接,在硬件上我们是在cpu和usb3300之间有一个开关芯片,用cpu的io管脚控制开关芯片,使cpu的usb脚与usb3300连通或阻隔。我们写了个简单的驱动控制这个io管脚,在上电后第一次连通,usb功能可用,并可以识别U盘,但是,当直接控制开关芯片阻隔时,linux内核的usb驱动探测到硬件(hub)由连接变成不连接,调用相应函数(usb_disconnect)处理,却出现了内存错误。我想解决这个问题是不是我的字符设备驱动应该在控制开关芯片阻隔之前调用usb驱动的相关函数把hub先disconnect掉,我试了一下usb_disconnect函数,但还是出现内存错误,我的usb_disconnect代码如下:udev = usb_find_device(id_vendor, id_product);    //id_vendor, id_product是在第一次连通时读取到的
                usb_lock_device(udev->parent);
                usb_disconnect(&udev);
                usb_unlock_device(udev->parent);
不知道这段代码有什么问题。(望高手能帮帮我,已经弄了好几天也解决不了)

内存错误的Oops如下:(最终是在drivers/usb/gadget/dwc_otg/dwc_otg_hcd.c的dwc_otg_hcd_urb_dequeue函数的qh = (dwc_otg_qh_t *) _ep->hcpriv;行出错)
<3>  Disconnect Detected Interrupt++ (Host) a_host
hub port connect change!!!!!!!!!!!
usb 1-1: USB disconnect, address 2
Unable to handle kernel paging request for data at address 0x00000014
Faulting instruction address: 0xc01b4224
Oops: Kernel access of bad area, sig: 11 [#1]
Kilauea
Modules linked in:
NIP: c01b4224 LR: c01b421c CTR: c01489b8
REGS: ce4cddd0 TRAP: 0300   Not tainted  (2.6.25)
MSR: 00021030 <ME,IR,DR>  CR: 24044022  XER: 00000000
DEAR: 00000014, ESR: 00000000
TASK = ce4ae7e0[53] 'khubd' THREAD: ce4cc000
GPR00: c01b421c ce4cde80 ce4ae7e0 c02cdb60 00000001 00000001 00000000 0000000b
GPR08: 00000001 c0336254 00002a03 c0330000 05ec2047 00000000 00000800 ce4a4940
GPR16: 00000000 ce4a4938 ccdb2000 ce4a4900 c0330000 ccdb2000 cccf3820 00000003
GPR24: ccdb2108 ffffff94 ccd10e00 ccd10e00 cd8ab280 ccc9c74c 00000000 00000000
NIP [c01b4224] dwc_otg_hcd_urb_dequeue+0x60/0x1e8
LR [c01b421c] dwc_otg_hcd_urb_dequeue+0x58/0x1e8
Call Trace:
[ce4cde80] [c01b421c] dwc_otg_hcd_urb_dequeue+0x58/0x1e8 (unreliable)     //在此函数中出现内存错误
[ce4cdeb0] [c0182aa4] unlink1+0x54/0x128
[ce4cded0] [c0182ce4] usb_hcd_flush_endpoint+0x16c/0x190
[ce4cdef0] [c01846ec] usb_disable_endpoint+0x70/0xb8
[ce4cdf00] [c0184cc4] usb_disable_device+0xec/0x1e4
[ce4cdf20] [c017ed14] usb_disconnect+0xcc/0x19c
[ce4cdf50] [c0181214] hub_thread+0x31c/0xc64
[ce4cdfd0] [c003535c] kthread+0x84/0x8c
[ce4cdff0] [c000db9c] kernel_thread+0x44/0x60
Instruction dump:
5409103a 7d295a14 83e90194 3c60c02d 3863db20 4be6c161 3c60c02d 3863db40
83dc0004 4be6c151 3c60c02d 3863db60 <83bf0014> 4be6c141 7f6000a6 5760045e
---[ end trace d61f0a3c62a70be5 ]---
  Disconnect Detected Interrupt++ (Host) a_host

论坛徽章:
0
2 [报告]
发表于 2009-08-25 11:10 |只看该作者
没人回答?先自己顶一下,请高手不吝赐教!!!!!!!!!!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP