2016-05-07 6 views
2

Я ищу способ превратить питание выключено (и обратно) для USB-порта. Решение может быть в C, bash и т. Д. Я использую BeagleBone с 32-разрядным Ubuntu 16.04 для armhf.Отключите питание USB-порта

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

Я пробовал много вещей, обсуждавшиеся на StackOverflow и AskUbuntu, в том числе:

#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; 
} 

USB-устройство мне нужно отключить (и в конечном итоге обратно) является сканер штрих-кодов Champtek FS310, который показывает до как считыватель магнитных карт полосы, когда я бегу 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 

Я обнаружил, что эти две команды результатов в устройстве выключения:

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

Как ни странно, он отключается только во время «связывания», а не «развязывает». Но как только он отключится таким образом, единственный способ, по которому я вернул его, - перезагрузить компьютер, который не является полезным решением.

+2

Возможный дубликат [Включите питание USB/выключают с BeagleBone Черного ядра> = 3,8] (HTTP://stackoverflow.com/questions/24039420/turn-usb-power-off-on-with-beaglebone-black-kernel-3-8) – duskwuff

ответ

1

Действительно, у этого другого вопроса был метод, который работал на то, что я пытался сделать. Обратите внимание, что это не общий ответ Linux, он будет работать только на BeagleBone Black и подобных устройствах. (. Я проверил на BeagleBone зеленый) Работа в обратном направлении от devmem2 Например, этот блок кода C++ отключает питание USB, затем снова на:

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); 

(Обработка ошибок не включена.)

магическое число 0x47401c60 действительно волшебное число. По некоторым сообщениям, похоже, что NDA необходимо подписать, чтобы получить доступ к некоторым документам, связанным с USB. В ARM335X Technical Reference Manual, единственное упоминание о 0x47401Cxx адресное пространство следующее на странице 156:

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

Обратите внимание, что это не работает на модели BBGW с 4 портами USB. Я много раз пытался получить Texas Instrument, чтобы рассказать мне больше об этих адресах «USB Core», но через год я отказался от них документировать что-либо. –

Смежные вопросы