【问题标题】:How to stop/restart USB device (Linux embedded system)如何停止/重启 USB 设备(Linux 嵌入式系统)
【发布时间】:2015-12-27 07:55:17
【问题描述】:

你好 USB / Linux 大师!

我有一个基于 Atmel ARM Cortex-A5 CPU 的嵌入式系统。它运行嵌入式 Linux 内核 V3.10,将其高速 USB 端口配置为 USB 设备。

USB 设备配置为由 HID、NDIS 以太网和 MTP 组成的 USB 组合。一切正常。

但是,当将此嵌入式系统插入 Windows 等主机操作系统时,会出现一种情况,即我必须通知 Window 新的 MTP 设备。目前我知道如何做到这一点的唯一方法是从嵌入式系统中物理拔出 USB 电缆并将其重新插入。Windows 然后会注意到“新”MTP 连接,打开一个指向我设备上文件的文件夹,一切正常太好了!

我想找到一种以编程方式执行完全相同的操作的方法...换句话说,将我的 USB 设备端口上下移动,就像我在以太网中使用“ifconfig”一样。

我可以使用一些命令来暂停和恢复 USB 设备端口吗?

非常感谢!

让-皮埃尔

附:我正在使用的 USB 驱动程序名为“atmel_usba_udc.c”,其中包含我想从用户空间调用的“atmel_usba_stop()”和“atmel_usba_start()”等函数。

【问题讨论】:

  • stop()start() 函数最有可能在内核模块加载和卸载时被调用。你试过rmmod / insmod 吗?
  • 嗨,Ben,非常感谢您的及时回复。在 Atmel 驱动程序代码中,我看到一个“usb_gadget_ops”类型的结构,它(可能)具有公开导出的函数 .udc_start、.udc_stop、.wakeup 和其他几个函数。不幸的是,由于一些较早的问题(我可能能够解决),我没有将它们编译为内核对象。做我想做的最简单的方法是再次尝试将 USB 驱动程序功能编译为内核对象吗?谢谢!! :)
  • 嗯,这不应该是唯一的方法,应该有一些ioctl 来触发总线重新连接。但是对于只有一个 USB 设备端口的情况,重新加载内核驱动模块可能是一条更短的成功之路。
  • 嗨,本,再次感谢。不幸的是,ioctl 没有出现在 atmel_usba_udc 驱动程序中,但也许 udc 或其他一些 USB 机制具有 ioctl 访问权限,但我还没有找到如何访问正确的 /sys 节点以及 ioctl 可以进行总线重置的方法。问:您认为一旦调用 insmod,卸载/重新加载 USB 物理驱动程序可能会恢复我们的逻辑 USB 复合配置吗?
  • 如果你有一个测试系统,试一试可能是最容易找到答案的方法。

标签: linux embedded usb embedded-linux sysfs


【解决方案1】:

'atmel_usba_stop()' 和 'atmel_usba_start()' 似乎与引用用于访问硬件特定操作的函数指针的操作有关。您可以使用它通过适当地与 ioctl 链接来从用户空间指示内核。

【讨论】:

  • 嗨 Karthik,感谢您的提示。实际上,当我使用内核对象加载/卸载 USB 驱动程序但 USB 不起作用时,会调用这些函数。起作用的是上面的评论(复制到这里)-------- 经过几天的处理这个问题,结果证明将 USB 驱动程序本身编译为内核对象并加载/卸载它不起作用(USB 不起作用)。然而,什么起作用(并且非常有用)是将我的 USB 复合驱动程序编译为 ko 并加载/卸载它
猜你喜欢
  • 2022-11-28
  • 1970-01-01
  • 2018-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多