免费注册 查看新帖 |

Chinaunix

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

请教linux下USB操作的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-17 18:22 |只看该作者 |倒序浏览
5可用积分
各位大侠,小弟现在遇到一个问题,需要在应用程序中断开USB设备的连接,请大家不吝赐教,具体问题如下:
      我是在做PowerPc405ex嵌入式板子的linux系统,我们使用32位外围数据总线传输图像数据,但cpu(PowerPc405ex)的USB的管脚和外围数据总线的高16位是复用的,我们用了一个连接芯片来隔断USB芯片和CPU:当使用USB时,隔断芯片将USB芯片和CPU连通,图像数据使用16位宽传输;当不使用USB时,隔断芯片将USB芯片和CPU隔断,图像数据使用32位宽传输。这样就存在一个问题,我们的隔断芯片在硬件上将USB芯片和CPU隔断时,必须现在软件上将USB disconnect掉(也就是调用内核的函数remove USB设备),但是查了很久也没查到该怎么弄,请大家赐教。

论坛徽章:
0
2 [报告]
发表于 2009-08-17 19:14 |只看该作者
我是新手,全部分数只有5分,谢谢大家。

论坛徽章:
0
3 [报告]
发表于 2009-08-18 05:27 |只看该作者
你是想让user space的code直接调用kernel的function, 然后remove USB 设备吗?

论坛徽章:
0
4 [报告]
发表于 2009-08-18 09:13 |只看该作者
和mount有关系么

论坛徽章:
0
5 [报告]
发表于 2009-08-18 11:39 |只看该作者

回复3楼

对,我是想在应用程序中能把USB芯片在内核里的注册的东西都移除掉,当然,如果通过写一个驱动能把它移除掉也可以。我现在的情况是我写了一个驱动通过IO口去控制隔离芯片隔离或连通CPU和USB芯片,现在内核启动时,默认是隔离的,当驱动控制隔离芯片连通时,USB的驱动通过probe能很好的探测到USB芯片,并向内核注册,但是此时再直接隔离时(没有对USB作处理),出现了内存错误,当再次连通时,USB芯片就不被probe和注册了。本以为直接断开,USB驱动会自动探测到芯片已经没有连接在上面,会自动把USB芯片在内核的注册给注销掉,按现在情况看来,是不是内核没有注销USB芯片的注册,导致内核再访问芯片时就访问到了错误的内存,或者内核去注销USB芯片出现了错误。
当第一次连通时,出现的注册信息如下(这应该是正确的,插上U盘后可以用):
<6>dwc_otg: SRP: Host mode
dwc_otg: Init: Port Power? op_state=1
dwc_otg: Init: Power Port (1)
usb 1-1: new high speed USB device using dwc_otg and address 2
usb 1-1: configuration #1 chosen from 1 choice
hub 1-1:1.0: USB hub found
hub 1-1:1.0: 4 ports detected
usb 1-1: New USB device found, idVendor=0424, idProduct=2514
usb 1-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0

断开时,出错信息如下:
hub 1-0:1.0: port 1 disabled by hub (EMI?), re-enabling...
usb 1-1: USB disconnect, address 2
Unable to handle kernel paging request for data at address 0x00000014
Faulting instruction address: 0xc01b2db0
Oops: Kernel access of bad area, sig: 11 [#1]
Kilauea
Modules linked in:
NIP: c01b2db0 LR: c0194aa0 CTR: c01b2d70
REGS: ce4e9dd0 TRAP: 0300   Not tainted  (2.6.25)
MSR: 00021030 <ME,IR,DR>  CR: 44000028  XER: 00000000
DEAR: 00000014, ESR: 00000000
TASK = ce4d5000[61] 'khubd' THREAD: ce4e8000
GPR00: 00000001 ce4e9e80 ce4d5000 ccde2000 00000000 ffffff94 00000000 00000013
GPR08: 00029030 cb4d1804 c038c000 cb4d1800 17583c80 00000000 00000800 ccd87580
GPR16: 00000000 ccda0000 ccd87578 ccd87540 c0360000 ccde2a20 ccda0000 00000002
GPR24: ccda0108 ffffff94 cb4d1860 ccde2000 ced07900 cf5fe300 cf5fe314 ced07080
NIP [c01b2db0] dwc_otg_hcd_urb_dequeue+0x40/0x1b0
LR [c0194aa0] unlink1+0x3c/0xe0
Call Trace:
[ce4e9e80] [ccda0244] 0xccda0244 (unreliable)
[ce4e9eb0] [c0194aa0] unlink1+0x3c/0xe0
[ce4e9ed0] [c0194c48] usb_hcd_flush_endpoint+0x104/0x110
[ce4e9ef0] [c019662c] usb_disable_endpoint+0x64/0x94
[ce4e9f00] [c0196c4c] usb_disable_device+0x14c/0x15c
[ce4e9f20] [c0190db4] usb_disconnect+0xa8/0x124
[ce4e9f50] [c0193228] hub_thread+0x310/0xc58
[ce4e9fd0] [c003535c] kthread+0x84/0x8c
[ce4e9ff0] [c000db9c] kernel_thread+0x44/0x60
Instruction dump:
80040030 7c9d2378 70090080 7c7b1b78 7cb92b78 81640028 54008f3e 41820054
5409103a 7d295a14 80890194 83fd0004 <83c40014> 7f8000a6 5780045e 7c000124
---[ end trace efe052f890b93a93 ]---

论坛徽章:
0
6 [报告]
发表于 2009-08-18 11:46 |只看该作者

回复4楼

和U盘的mount和unmount应该是同一个道理,只是这里USB芯片好像不能直接用命令行去unmount

论坛徽章:
0
7 [报告]
发表于 2009-08-18 23:05 |只看该作者

回复 #6 driversun 的帖子

u盘的mount 和 umount 会断开USB 连接吗?会注销驱动?没明白。

论坛徽章:
0
8 [报告]
发表于 2009-08-18 23:12 |只看该作者

回复 #5 driversun 的帖子

建议,追踪一下USB core driver.c,看看那里是如何调用disconnect函数的。然后在你的控制断开连接的驱动中调用相应的函数,从而完成注销USB驱动的动作。需要的时候在调用prob 函数(调用core里的相应函数,不只是usb device driver的函数)。

论坛徽章:
0
9 [报告]
发表于 2009-08-19 14:55 |只看该作者

回复8楼

跟踪了一下内核代码,发现其实在硬件断开时,系统自己探测到了硬件的断开,并自动调用了usb_disconnect函数,只是在执行usb_disconnect过程中,在执行host方面的usb_disable_endpoint中的usb_hcd_flush_endpoint时出现错误。
实际上usb_disconnect在host方面和device方面都会执行usb_disable_endpoint16次(估计是一个设备最多会有16个endpoint),出错是在第2个endpoint被disable时发生的。不知道大侠对此有何见解。

论坛徽章:
0
10 [报告]
发表于 2009-08-19 15:01 |只看该作者

回复7楼

umount应该是注销设备,即把设备在内核中的记录释放掉,驱动是对同一类设备通用的,是不会注销的。其实umount就相当于widows的安全删除U盘的作用。我的usb芯片就是在umount的过程中出错了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP