gpt4 book ai didi

C - 如何在 Linux 下重置 USB 总线?

转载 作者:太空狗 更新时间:2023-10-29 12:33:53 28 4
gpt4 key购买 nike

每天——大约 5 到 10 次——我的 USB 摄像头从系统中消失。它从第一天开始就发生了,因为制造商驱动程序与 Linux 不兼容。 lsusbdmesg 一开始正确显示,但在较长时间后有时会消失。修复它的最佳解决方案是重置该相机的 USB 接口(interface)以将其取回。我使用 C 源代码手动完成了几次并且它有效,但是当我在 Bash 循环中执行它时,它似乎一遍又一遍地失败。有什么想法吗?

我怎样才能让这两个程序都工作,以便我的 /dev/video012 始终可用?

第 1 步: 使用此代码在 Linux 下重置 USB 总线:

/* few times it's resetting but when I use it in a Bash loop it's not doing it */
#include <stdio.h>
#include <usb.h>

int main(int argc, char *argv[]) {
struct usb_bus *busses;
usb_init();
usb_find_busses();
usb_find_devices();
busses = usb_get_busses();
struct usb_bus *bus;
int c, i, a;
for (bus = busses; bus; bus = bus->next) {
struct usb_device *dev;
int val;
usb_dev_handle *junk;
for (dev = bus->devices; dev; dev = dev->next) {
char buf[1024];
junk = usb_open ( dev );
usb_get_string_simple(junk,2,buf,1023);

switch(argc) {
case 1:
if ( junk == NULL ) {
printf("Can't open %p (%s)\n", dev, buf );
} else if (strcmp(buf,"HD Pro Webcam C920")==0) {
val = usb_reset(junk);
printf( "reset %p %d (%s)\n", dev, val, buf );
}
break;

default:
if ( junk == NULL ){
printf("Can't open %p (%s)\n", dev, buf );
} else {
val = usb_reset(junk);
printf( "reset %p %d (%s)\n", dev, val, buf );
}
}

usb_close(junk);
}
}
}

第 2 步: 作为扫描仪运行 - 确保视频 0 或 1 或 2 可用,如果不可用则重置 USB 总线

#!/bin/bash
j=true
while $j
do
for i in 0 1 2
do
tmp="/dev/video$i"
if [ -e $tmp ]
then
echo "/dev/video$i"
j=false
else
echo "NO - camera found - restarting the USB $i"
echo ROOT_PASSWORD_TO_EXECUTE | sudo -S /var/tmp/c-restartusb/restartusb
fi
done
done
echo "Camera - logic ended, expecting the camera is available now"

第 3 步:仍然不可用?

NO - camera found - restart the USB 0
NO - camera found - restart the USB 1
NO - camera found - restart the USB 2
NO - camera found - restart the USB 0
NO - camera found - restart the USB 1
NO - camera found - restart the USB 2
NO - camera found - restart the USB 0
NO - camera found - restart the USB 1
NO - camera found - restart the USB 2
NO - camera found - restart the USB 0
NO - camera found - restart the USB 1
NO - camera found - restart the USB 2
NO - camera found - restart the USB 0
NO - camera found - restart the USB 1
NO - camera found - restart the USB 2
NO - camera found - restart the USB 0
NO - camera found - restart the USB 1
NO - camera found - restart the USB 2
NO - camera found - restart the USB 0
NO - camera found - restart the USB 1
NO - camera found - restart the USB 2
NO - camera found - restart the USB 0
NO - camera found - restart the USB 1
NO - camera found - restart the USB 2
NO - camera found - restart the USB 0
NO - camera found - restart the USB 1
NO - camera found - restart the USB 2
NO - camera found - restart the USB 0
NO - camera found - restart the USB 1
NO - camera found - restart the USB 2
NO - camera found - restart the USB 0
NO - camera found - restart the USB 1
NO - camera found - restart the USB 2
NO - camera found - restart the USB 0
NO - camera found - restart the USB 1
NO - camera found - restart the USB 2
NO - camera found - restart the USB 0
NO - camera found - restart the USB 1
NO - camera found - restart the USB 2
NO - camera found - restart the USB 0
NO - camera found - restart the USB 1
NO - camera found - restart the USB 2
NO - camera found - restart the USB 0
NO - camera found - restart the USB 1
NO - camera found - restart the USB 2
NO - camera found - restart the USB 0
NO - camera found - restart the USB 1
NO - camera found - restart the USB 2
NO - camera found - restart the USB 0
NO - camera found - restart the USB 1
NO - camera found - restart the USB 2
NO - camera found - restart the USB 0
NO - camera found - restart the USB 1
NO - camera found - restart the USB 2
NO - camera found - restart the USB 0
NO - camera found - restart the USB 1
NO - camera found - restart the USB 2
NO - camera found - restart the USB 0
NO - camera found - restart the USB 1
NO - camera found - restart the USB 2
NO - camera found - restart the USB 0
NO - camera found - restart the USB 1
NO - camera found - restart the USB 2
NO - camera found - restart the USB 0
NO - camera found - restart the USB 1
NO - camera found - restart the USB 2
NO - camera found - restart the USB 0
NO - camera found - restart the USB 1
NO - camera found - restart the USB 2
NO - camera found - restart the USB 0
NO - camera found - restart the USB 1
NO - camera found - restart the USB 2
NO - camera found - restart the USB 0
NO - camera found - restart the USB 1
NO - camera found - restart the USB 2
NO - camera found - restart the USB 0
NO - camera found - restart the USB 1

最佳答案

不确定您的重置 usb 代码是否正确...

你能找到USB设备吗?

如果可以,请尝试以下操作:

顺便说一句,这段代码来自here .如果你能找到 USB 节点,应该可以工作:

/* usbreset -- send a USB port reset to a USB device */

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/ioctl.h>

#include <linux/usbdevice_fs.h>


int main(int argc, char **argv)
{
const char *filename;
int fd;
int rc;

if (argc != 2) {
fprintf(stderr, "Usage: usbreset device-filename\n");
return 1;
}
filename = argv[1];

fd = open(filename, O_WRONLY);
if (fd < 0) {
perror("Error opening output file");
return 1;
}

printf("Resetting USB device %s\n", filename);
rc = ioctl(fd, USBDEVFS_RESET, 0);
if (rc < 0) {
perror("Error in ioctl");
return 1;
}
printf("Reset successful\n");

close(fd);
return 0;
}

如果不能,您可能需要像这样重新扫描以找到 USB 设备:

echo 1 > /sys/dev/block/8:16/device/rescan

关于C - 如何在 Linux 下重置 USB 总线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18195237/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com