Linux:复位USB设备

文章目录

  • Linux:复位USB设备
  • 前言
  • 一、基本原理
  • 二、代码实例
  • 总结

前言

在Ubuntu16.04下开发SDR设备数据处理程序时,msi.sdr设备有时运行几个小时后就会出现获取数据失败的情况,猜测是设备本身的问题。问题的处理方式是需要重新插拔一下设备,这样十分麻烦。
要解决此问题,要么就找出sdr设备出现此问题的原因,或者采用复位USB的方式解决此问题。
本文主要介绍采用复位USB的方式解决此问题。


提示:以下是本篇文章正文内容,下面案例可供参考

一、基本原理

复位指定USB需要知道指定USB设备属于哪个主设备控制器,对应的设备号是多少。获取这两个关键参数后利用ioctl函数以文件io的形式实现USB复位操作。 在终端键入 lsusb 命令,可以看到msi.sdr在系统中的idProduct为2500,对应的USB主控制器为001,设备名为008。 可知msi.sdr设备在Linux系统中设备名是:/dev/bus/usb/001/008.

cs@cs:~$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
Bus 001 Device 008: ID 1df7:2500
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
cs@cs:~$

当然,不同的Linux机器的主控制器与设备名并不一致,因此可以设计一个以idProduct为关键字,自动获取主控制器与对应设备号的复位USB小程序。

二、代码实例

代码如下(示例):

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/ioctl.h>#include <linux/usbdevice_fs.h>int execute_cmd(const char *cmd, char *dest_buf)
{FILE *fp = NULL;char temp_buf[1024] = {0};if((fp = popen(cmd, "r")) == NULL){fprintf(stderr, "Command failed to execute:%s", strerror(errno));return -1;}while(1){if (fgets(temp_buf, sizeof(temp_buf), fp) != NULL){strcat(dest_buf, temp_buf);if(strlen(dest_buf) > 1024)break;}else //读取完毕退出循环{break;}}pclose(fp);return 0;}void find_Bus_Device(char *src, const char * idProduct, char *file_path)
{char *str = NULL;while((str = strsep(&src, "\r\n")) != NULL){if(strstr(str, idProduct)!= NULL) //找出包含指定idProduct的那一行数据{printf("%s\n", str);char Bus[4] = {0};char Device[4] = {0};memcpy(Bus, &str[4], sizeof(Bus));memcpy(Device, &str[15], sizeof(Device));Bus[3] = '\0';Device[3] = '\0';printf("Bus = %s Device = %s\n", Bus, Device);sprintf(file_path, "/dev/bus/usb/%s/%s", Bus, Device);printf("file path = %s\n", file_path);}}
} int reset_sdr(const char *file_path)
{int fd = 0;int ret = 0;fd = open(file_path, O_WRONLY);if (fd < 0) {perror("Failed to open file");return -1;}printf("Resetting USB device %s\n", file_path);ret = ioctl(fd, USBDEVFS_RESET, 0);if (ret < 0){perror("The ioctl operation failed");return -1;}close(fd);return 0;
}int main()
{int ret = 0;const char *cmd = "lsusb";const char *idProduct = "2500";char dest_buf[1024] = {0};char *ptr = dest_buf;char file_path[32] = {0};//1.获取命令在终端的打印输出execute_cmd(cmd, dest_buf);//2.找出包含指定idProduct的Bus与Devicefind_Bus_Device(ptr, idProduct, file_path);//3.复位指定的usb设备ret = reset_sdr(file_path);if(ret == 0){printf("Reset successful\n");}return 0;
}

总结

实测在msi.sdr设备运行异常时,使用此程序能正常复位USB设备。举一反三,复位其它USB设备也可以参考此程序实现。

Linux:复位USB设备相关推荐

  1. linux配置usb主从_一种Linux下USB设备主从切换的实现

    龙源期刊网 http://www.qikan.com.cn 一种 Linux 下 USB 设备主从切换的实现 作者:侯景昆 来源:<电子技术与软件工程> 2013 年第 22 期 摘 要 ...

  2. linux下usb设备节点名不固定,解决Linux下USB设备节点ttyUSB名不固定的问题,生成固定USB转串口设备节点...

    解决Linux下USB设备节点ttyUSB名不固定的问题,生成固定USB转串口设备节点 2018-09-19 http://blog.sina.com.cn/s/blog_8b58097f0102wx ...

  3. usb设备检测linux,Linux下USB设备检测全教程(转)

    Linux下USB设备检测全教程(转)[@more@] USB设备检测也是通过/proc目录下的USB文件系统进行的.为了使一个USB设备能够正常工作,必须要现在系统中插入USB桥接器模块.在检测开始 ...

  4. Linux 系统USB设备检测

    Linux 系统USB设备检测 Linux下查看USB设备命令: 参考链接: https://wenku.baidu.com/view/a33c0d616aeae009581b6bd97f192279 ...

  5. Linux 绑定USB设备端口

    Linux 绑定USB设备端口 1 根据设备ID绑定 2 根据电脑USB硬件端口绑定,只要插入该USB端口即为设定设备名 1 根据设备ID绑定 方法特点:按照ID绑定的话不需要固定USB接口,它是根据 ...

  6. Linux下USB设备自动复位的软件实现

    背景 在做SDR项目的时候由于固件版本原因,每次使用完之后都需要重新插拔一下usb接口才能恢复正常.实际生成环境中肯定不能容忍这种情况发生,所以需要实现一种检测到usb设备异常后能够自动复位的功能 思 ...

  7. 嵌入式linux查看usb设备驱动程序,嵌入式Linux下USB驱动程序的设计

    嵌入式Linux下USB驱动程序的设计 usb概念:  USB(Universal Serial Bus)即通用串行总线,是一种全新的双向同步传输的支持热插拔的数据传输总线,其目的是为了提供一种兼容不 ...

  8. linux查看usb设备文件,linux – 确定USB设备文件路径

    So which device file is used for USB? How can i indentify it? 您在/ sys /后面看到的主要是有关设备的配置/信息. / dev / b ...

  9. linux查看usb设备名称,Linux系统下查看USB设备名及使用USB设备

    1.系统插入USB设备后,从控制台界面有如下提示: 从控制台信息可以看出插入的USB设备名. 从上图可以看出,插入的USB设备为sde4. 但是,如果是CRT工具远程连接过去,可以使用下面的命令来查看 ...

最新文章

  1. php 删除xls文件,使用PHPExcel将xls文件转换为xlsx时出错
  2. 实现CheckboxGroup的全部选中
  3. 怎么提高es服务器的性能,es集群服务器配置规则是怎样的?什么是es集群
  4. 联想笔记本电脑无法在编码中直接使用Home和End快捷键需要+fn解决方案
  5. RISC与CISC比较
  6. oneplus 手机kali linux,OnePlus 2(一加2)刷入Kali Nethunter教程
  7. 记录一次nginx配置vhost的小bug
  8. duilib中的添加自定义控件
  9. pptv多屏互动服务怎么删除
  10. Nginx学习总结(3)——Nginx配置及应用场景之高级配置
  11. 【百度echarts】实现圆环进度条-代码示例代码demo
  12. 教你如何认识各种光纤接口类型
  13. 安卓玩机之xposed框架安装
  14. python图片验证码解决方案
  15. Windows系统中常见的文件后缀名有哪些
  16. 申请公网IP实战 #华北天津联通
  17. 基于蒙特卡洛方法的机器人工作空间MATLAB仿真
  18. 阻止冒泡事件(兼容大部分浏览器)
  19. C#学习纪要(8):7月17日
  20. 算法的五大要素 学计算机必备

热门文章

  1. JVM C1 编译优化:空检查擦除
  2. 四川高中计算机考试操作题,2017年excel考试操作题目「附答案」
  3. 程序猿的怎么软件园蹦出来
  4. 华清远见重庆—JAVA WEB后端技术总结
  5. 使用cmake安装nuget
  6. 用nginx搭建视频链接
  7. VFP视频教程计划启动
  8. python抓取dblp网站的arXiv论文,下载保存成pdf
  9. Python数据分析学习系列 十一 时间序列
  10. linux 如何下运行exe文件