- 论坛徽章:
- 0
|
回复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 ]--- |
|