2016-05-07 6 views
2

Ich bin auf der Suche nach einer Möglichkeit, power aus (und wieder an) für einen USB-Anschluss. Die Lösung kann in C, bash usw. sein. Ich benutze einen BeagleBone mit 32-bit Ubuntu 16.04 für armhf.Schalten Sie die Stromversorgung zu einem USB-Port

> uname -srvm 
Linux 4.4.6-ti-r15 #1 SMP Tue Apr 5 12:32:22 UTC 2016 armv7l 

Ich habe auf Stackoverflow und AskUbuntu diskutiert viele Dinge ausprobiert, darunter:

#include <linux/usbdevice_fs.h> 

int main(void) 
{ 
    int fd = open("/dev/bus/usb/001/002", O_WRONLY); 
    if (fd < 0) return 1; 

    int rc = ioctl(fd, USBDEVFS_RESET, 0); 
    if (rc < 0) return 2; 

    close(fd); 
    return 0; 
} 

Das USB-Gerät muss ich (wieder auf und schließlich) auszuschalten ist ein Champtek FS310 Barcode-Leser, die zeigt, up als Leser Magnetkartenstreifen, wenn ich laufen lsusb:

> lsusb 
Bus 001 Device 002: ID 040b:6543 Weltrend Semiconductor Manhattan Magnetic Card Strip Reader 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub 

> lsusb -t 
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=musb-hdrc/1p, 480M 
    |__ Port 1: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M 
    |__ Port 1: Dev 2, If 1, Class=Human Interface Device, Driver=usbhid, 1.5M 

ich habe festgestellt, dass diese beiden Befehle Ergebnisse in dem Gerät ausgeführt wird ausgeschaltet:

echo "1-1" > /sys/bus/usb/drivers/usb/unbind 
echo "1-1" > /sys/bus/usb/drivers/usb/bind 

Merkwürdigerweise schaltet es nur während "binden" aus, nicht "unbind". Aber sobald es auf diese Weise ausgeschaltet wird, ist der einzige Weg, den ich gefunden habe, es wieder einzuschalten, den Computer neu zu starten, was keine brauchbare Lösung ist.

+2

Mögliches Duplikat [USB- Gerät ausschalten/auf mit BeagleBone Schwarz kernel> = 3.8] (http://stackoverflow.com/questions/24039420/turn-usb-power-off-on-with-beaglebone-black-kernel-3-8) – duskwuff

Antwort

1

Tatsächlich hatte diese andere Frage eine Technik, die für das, was ich versuchte, funktionierte. Beachten Sie, dass dies keine generische Linux-Antwort ist, sondern nur auf BeagleBone Black und ähnlichen Geräten. (. Getestet habe ich auf einem BeagleBone Grün) Arbeiten nach hinten aus dem devmem2 Beispiel dieser Block von C++ Code schaltet das USB-Gerät aus und dann auf der Rückseite:

const size_t page_size_in_bytes = getpagesize(); 
const size_t address_gpio3_13 = 0x47401c60; // see comment below 
const size_t address_start  = address_gpio3_13/page_size_in_bytes * page_size_in_bytes; 
const size_t address_offset  = address_gpio3_13 - address_start; 

int fd = open("/dev/mem", O_RDWR); 
void *addr = mmap(0, page_size_in_bytes, PROT_READ | PROT_WRITE, MAP_SHARED, fd, address_start); 

uint8_t *byte_ptr = reinterpret_cast<uint8_t*>(addr); 

byte_ptr[address_offset] = 0x00; // turn off USB 
std::this_thread::sleep_for(std::chrono::milliseconds(500)); 
byte_ptr[address_offset] = 0x01; // turn on USB 

munmap(addr, page_size_in_bytes); 

close(fd); 

(Fehler nicht enthält Handhabung.)

Die magische Zahl 0x47401c60 ist wirklich eine magische Zahl. Laut einigen Beiträgen sieht es so aus, als müsste eine NDA unterzeichnet werden, um Zugriff auf einige der USB-bezogenen Dokumente zu erhalten. Im ARM335X Handbuch Technical Reference, die einzige Erwähnung des Raumes 0x47401Cxx Adresse ist die folgende auf Seite 156:

Block Name Start Address End Address 
USB1 Core  0x4740_1C00  0x4740_1FFF 
+1

Beachten Sie, dass dies bei dem Modell BBGW mit 4 USB-Ports nicht funktioniert. Ich habe mehrmals versucht, Texas Instrument dazu zu bringen, mir mehr über diese "USB Core" -Adressen zu erzählen, aber nach einem Jahr habe ich es aufgegeben, irgendetwas zu dokumentieren. –

Verwandte Themen