Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5394383
  • 博文数量: 1271
  • 博客积分: 12961
  • 博客等级: 上将
  • 技术积分: 15141
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-09 11:25
个人简介

偷得浮生半桶水(半日闲), 好记性不如抄下来(烂笔头). 信息爆炸的时代, 学习是一项持续的工作.

文章分类

全部博文(1271)

文章存档

2020年(55)

2019年(193)

2018年(81)

2017年(80)

2016年(70)

2015年(52)

2014年(41)

2013年(51)

2012年(85)

2011年(45)

2010年(231)

2009年(287)

分类: 其他平台

2019-10-28 16:17:06

    USB设备无处不在,很多嵌入式设备都用USB设备取代了传统的串行设备, 例如现在我想找以前串口控制的modem都找不到了, 只有USB口的, 而且还没有模拟成USB转串口, 只能通过libusb进行AT操作.。
    然而,实际上USB设备有时会挂起。在大多数情况下,手动拔下replug就可以解决这个问题。实际上,usb复位可以模拟拔插和replug操作

    首先确定那个usb设备需要被控制.

点击(此处)折叠或打开

  1. #lsusb

  2. Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
  3. Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
  4. Bus 006 Device 002: ID 04b3:310c IBM Corp. Wheel Mouse
  5. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
  6. Bus 004 Device 002: ID 0a5c:2145 Broadcom Corp.
  7. Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
以 Wheel Mouse 举例, 设备为 /dev/bus/usb/006/002   006为总线号,  002为设备号.
那么模拟其拔插的C代码.

点击(此处)折叠或打开

  1. /* reset.c */
  2. #include <stdio.h>
  3. #include <fcntl.h>
  4. #include <errno.h>
  5. #include <sys/ioctl.h>
  6. #include <linux/usbdevice_fs.h>

  7. void main(int argc, char **argv)
  8. {
  9.     const char *filename;
  10.     int fd;
  11.     filename = argv[1];  //argv[1] = /dev/bus/usb/006/002
  12.     fd = open(filename, O_WRONLY);
  13.     ioctl(fd, USBDEVFS_RESET, 0);
  14.     close(fd);
  15.     return;
  16. }
测试

点击(此处)折叠或打开

  1. 编译
  2. #gcc -o reset reset.c
  3. 执行
  4. #sudo ./reset /dev/bus/usb/006/002
  5. 查看系统日志
  6. #tail -f /var/log/messages

  7. May 4 16:09:17 roman10 kernel: [ 1663.013118] usb 6-2:
  8. reset low speed USB device using uhci_hcd and address 2

  9. 基本上手动拔插得到的日志内容相同.
也可以通过libusb来进行设备的复位操作.


阅读(2910) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~