<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="lt">
	<id>https://wiki.eofnet.lt/w//index.php?action=history&amp;feed=atom&amp;title=Raspberry_usb_reset</id>
	<title>Raspberry usb reset - Versijų istorija</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.eofnet.lt/w//index.php?action=history&amp;feed=atom&amp;title=Raspberry_usb_reset"/>
	<link rel="alternate" type="text/html" href="https://wiki.eofnet.lt/w//index.php?title=Raspberry_usb_reset&amp;action=history"/>
	<updated>2026-04-23T15:00:26Z</updated>
	<subtitle>Šio puslapio versijų istorija projekte</subtitle>
	<generator>MediaWiki 1.35.1</generator>
	<entry>
		<id>https://wiki.eofnet.lt/w//index.php?title=Raspberry_usb_reset&amp;diff=8866&amp;oldid=prev</id>
		<title>\dev\null 14:23, 2 gegužės 2019</title>
		<link rel="alternate" type="text/html" href="https://wiki.eofnet.lt/w//index.php?title=Raspberry_usb_reset&amp;diff=8866&amp;oldid=prev"/>
		<updated>2019-05-02T14:23:32Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Naujas puslapis&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
==  Problema ==&lt;br /&gt;
&lt;br /&gt;
RaspberrPI nenori draugauti su daugeliu webcam'ų pigių ir brangių variantų, lūžta USB stack'as ar pačios kameros nesusikalba. Reikia perkrovinėti patį Raspberrį kartais tai net nepadeda ir reikia išjungti ir vėl įjungti maitinimą, kad būtų kažkoks rezultatas.&lt;br /&gt;
&lt;br /&gt;
== Sprendimas ==  &lt;br /&gt;
&lt;br /&gt;
Reikia padaryti device'ui &amp;quot;resetą&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== usbreset.c ===&lt;br /&gt;
Įrankis skirtas resetinti USB device'us ar jų HUB'us.&lt;br /&gt;
&amp;lt;syntaxhighlight LANG=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/* usbreset -- send a USB port reset to a USB device */&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/ioctl.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;linux/usbdevice_fs.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char **argv)&lt;br /&gt;
{&lt;br /&gt;
    const char *filename;&lt;br /&gt;
    int fd;&lt;br /&gt;
    int rc;&lt;br /&gt;
&lt;br /&gt;
    if (argc != 2) {&lt;br /&gt;
        fprintf(stderr, &amp;quot;Usage: usbreset device-filename\n&amp;quot;);&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
    filename = argv[1];&lt;br /&gt;
&lt;br /&gt;
    fd = open(filename, O_WRONLY);&lt;br /&gt;
    if (fd &amp;lt; 0) {&lt;br /&gt;
        perror(&amp;quot;Error opening output file&amp;quot;);&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Resetting USB device %s\n&amp;quot;, filename);&lt;br /&gt;
    rc = ioctl(fd, USBDEVFS_RESET, 0);&lt;br /&gt;
    if (rc &amp;lt; 0) {&lt;br /&gt;
        perror(&amp;quot;Error in ioctl&amp;quot;);&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
    printf(&amp;quot;Reset successful\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    close(fd);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 gcc -o usbreset usbreset.c&lt;br /&gt;
&lt;br /&gt;
=== /boot/config.txt ===&lt;br /&gt;
 sdhci-bcm2708.missing_status=0 sdhci-bcm2708.sync_after_dma=0&lt;br /&gt;
 max_usb_current=1&lt;br /&gt;
&lt;br /&gt;
== Motion ==  &lt;br /&gt;
Jeigu naudojame kartu su motion programine įranga, tam yra parašytas motion log'o parseris, kuris tik aptikęs sujungimo su webcam klaidą tuojau pat perkrauna USB&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/perl -w&lt;br /&gt;
# Handle motion errors on the fly on PI devices&lt;br /&gt;
# This tool will parse the motion log file and if it detects the usb problems it will reset the usb cameras or hubs&lt;br /&gt;
use strict;&lt;br /&gt;
use warnings;&lt;br /&gt;
use Time::localtime qw( localtime );&lt;br /&gt;
use IO::Handle;&lt;br /&gt;
use POSIX;&lt;br /&gt;
use File::Basename;&lt;br /&gt;
 my $script_dir = undef;&lt;br /&gt;
  if(-l __FILE__) {&lt;br /&gt;
    $script_dir = dirname(readlink(__FILE__));&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    $script_dir = dirname(__FILE__);&lt;br /&gt;
  }&lt;br /&gt;
# dynamic variables&lt;br /&gt;
my $log;&lt;br /&gt;
sysopen($log, $script_dir.&amp;quot;/motion-handler.log&amp;quot;, O_APPEND | O_CREAT | O_RDWR) or die;&lt;br /&gt;
$log-&amp;gt;autoflush(1);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub write_log {&lt;br /&gt;
 my ($text) = @_;&lt;br /&gt;
 # one trully method, that actually works!&lt;br /&gt;
 my $t = localtime;&lt;br /&gt;
 printf $log (&amp;quot;%04d.%02d.%02d %02d:%02d:%02d -&amp;gt; %s\n&amp;quot;, $t-&amp;gt;year + 1900, $t-&amp;gt;mon + 1, $t-&amp;gt;mday, $t-&amp;gt;hour, $t-&amp;gt;min, $t-&amp;gt;sec, $text);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub reset_usb {&lt;br /&gt;
system(&amp;quot;/root/usbreset /dev/bus/usb/001/002&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
                chomp;&lt;br /&gt;
if ($_ =~ /.*Error selecting input.*Device or resource busy.*/gs) {&lt;br /&gt;
write_log(&amp;quot;Error detected, resetting the usb devices...&amp;quot;);&lt;br /&gt;
reset_usb();&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nepamirštame pakeisti '''/dev/bus/usb/001/002''' sau reikiamu adresu. Kaip aptikti koks irenginys priklauso konkreciam device node'ui.&lt;br /&gt;
 lsbusb&lt;br /&gt;
[[Vaizdas:Screenshot 2019-05-02 at 17.17.43.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
USB irenginiu failus galima paziureti taip:&lt;br /&gt;
&lt;br /&gt;
[[Vaizdas:Screenshot 2019-05-02 at 17.18.03.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kameru irenginiu failai yra:&lt;br /&gt;
 /dev/bus/usb/001/050&lt;br /&gt;
 /dev/bus/usb/001/051&lt;br /&gt;
&lt;br /&gt;
Scripte pakeiciam eiliute:&lt;br /&gt;
 system(&amp;quot;/root/usbreset /dev/bus/usb/001/050;/root/usbreset /dev/bus/usb/001/051&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Naudojimas:&lt;br /&gt;
 tail -f /var/log/motion/motion.log | ./motion-handler.pl&lt;br /&gt;
&lt;br /&gt;
[[Category:RaspberryPI]]&lt;/div&gt;</summary>
		<author><name>\dev\null</name></author>
	</entry>
</feed>