usb.core.USBError: [Errno 32] Ошибка канала
Я пытаюсь читать / писать, используя порт USB-OTG в Altera De0 Nano SoC. У меня установлен Atlas SoC на SD-карту для использования Arm Linux https://rocketboards.org/foswiki/view/Documentation/AtlasSoCDevelopmentPlatform.
CONFIGURATION 1: 2 mA ====================================
bLength : 0x9 (9 bytes)
bDescriptorType : 0x2 Configuration
wTotalLength : 0xa4 (164 bytes)
bNumInterfaces : 0x5
bConfigurationValue : 0x1
iConfiguration : 0x6 Multifunction with RNDIS
bmAttributes : 0xc0 Self Powered
bMaxPower : 0x1 (2 mA)
INTERFACE 0: CDC Communication =========================
bLength : 0x9 (9 bytes)
bDescriptorType : 0x4 Interface
bInterfaceNumber : 0x0
bAlternateSetting : 0x0
bNumEndpoints : 0x1
bInterfaceClass : 0x2 CDC Communication
bInterfaceSubClass : 0x2
bInterfaceProtocol : 0xff
iInterface : 0x8 RNDIS Communications Control
ENDPOINT 0x82: Interrupt IN ==========================
bLength : 0x7 (7 bytes)
bDescriptorType : 0x5 Endpoint
bEndpointAddress : 0x82 IN
bmAttributes : 0x3 Interrupt
wMaxPacketSize : 0x8 (8 bytes)
bInterval : 0x9
INTERFACE 1: CDC Data ==================================
bLength : 0x9 (9 bytes)
bDescriptorType : 0x4 Interface
bInterfaceNumber : 0x1
bAlternateSetting : 0x0
bNumEndpoints : 0x2
bInterfaceClass : 0xa CDC Data
bInterfaceSubClass : 0x0
bInterfaceProtocol : 0x0
iInterface : 0x9 RNDIS Ethernet Data
ENDPOINT 0x81: Bulk IN ===============================
bLength : 0x7 (7 bytes)
bDescriptorType : 0x5 Endpoint
bEndpointAddress : 0x81 IN
bmAttributes : 0x2 Bulk
wMaxPacketSize : 0x200 (512 bytes)
bInterval : 0x0
ENDPOINT 0x1: Bulk OUT ===============================
bLength : 0x7 (7 bytes)
bDescriptorType : 0x5 Endpoint
bEndpointAddress : 0x1 OUT
bmAttributes : 0x2 Bulk
wMaxPacketSize : 0x200 (512 bytes)
bInterval : 0x0
INTERFACE 2: CDC Communication =========================
bLength : 0x9 (9 bytes)
bDescriptorType : 0x4 Interface
bInterfaceNumber : 0x2
bAlternateSetting : 0x0
bNumEndpoints : 0x1
bInterfaceClass : 0x2 CDC Communication
bInterfaceSubClass : 0x2
bInterfaceProtocol : 0x1
iInterface : 0xc CDC Abstract Control Model (ACM)
ENDPOINT 0x84: Interrupt IN ==========================
bLength : 0x7 (7 bytes)
bDescriptorType : 0x5 Endpoint
bEndpointAddress : 0x84 IN
bmAttributes : 0x3 Interrupt
wMaxPacketSize : 0xa (10 bytes)
bInterval : 0x9
INTERFACE 3: CDC Data ==================================
bLength : 0x9 (9 bytes)
bDescriptorType : 0x4 Interface
bInterfaceNumber : 0x3
bAlternateSetting : 0x0
bNumEndpoints : 0x2
bInterfaceClass : 0xa CDC Data
bInterfaceSubClass : 0x0
bInterfaceProtocol : 0x0
iInterface : 0xd CDC ACM Data
ENDPOINT 0x83: Bulk IN ===============================
bLength : 0x7 (7 bytes)
bDescriptorType : 0x5 Endpoint
bEndpointAddress : 0x83 IN
bmAttributes : 0x2 Bulk
wMaxPacketSize : 0x200 (512 bytes)
bInterval : 0x0
ENDPOINT 0x2: Bulk OUT ===============================
bLength : 0x7 (7 bytes)
bDescriptorType : 0x5 Endpoint
bEndpointAddress : 0x2 OUT
bmAttributes : 0x2 Bulk
wMaxPacketSize : 0x200 (512 bytes)
bInterval : 0x0
INTERFACE 4: Mass Storage ==============================
bLength : 0x9 (9 bytes)
bDescriptorType : 0x4 Interface
bInterfaceNumber : 0x4
bAlternateSetting : 0x0
bNumEndpoints : 0x2
bInterfaceClass : 0x8 Mass Storage
bInterfaceSubClass : 0x6
bInterfaceProtocol : 0x50
iInterface : 0x1 Mass Storage
ENDPOINT 0x85: Bulk IN ===============================
bLength : 0x7 (7 bytes)
bDescriptorType : 0x5 Endpoint
bEndpointAddress : 0x85 IN
bmAttributes : 0x2 Bulk
wMaxPacketSize : 0x200 (512 bytes)
bInterval : 0x0
ENDPOINT 0x3: Bulk OUT ===============================
bLength : 0x7 (7 bytes)
bDescriptorType : 0x5 Endpoint
bEndpointAddress : 0x3 OUT
bmAttributes : 0x2 Bulk
wMaxPacketSize : 0x200 (512 bytes)
bInterval : 0x1
Я удалил драйверы по умолчанию, которые загружаются устройством с помощью команды sudo rmmod. Удаленные мной драйверы: cdc_acm, rndis_wlan, rndis_host. Это было сделано для того, чтобы драйверы по умолчанию не мешали обмену данными с использованием кода pysub. Я использую устройство в качестве запоминающего устройства USB для массовой передачи данных (интерфейс 4). Я запускаю следующий код Python:
import sys, usb.core, time
#For USB OTG Hexadecimal VendorID=0x1d6b & ProductID=0x104
dev = usb.core.find(idVendor=0x1d6b, idProduct=0x104)
interface=4
if dev is None:
sys.exit("No Panic button found in the system");
try:
if dev.is_kernel_driver_active(4) is True:
dev.detach_kernel_driver(4)
except usb.core.USBError as e:
sys.exit("Kernel driver won't give up control over device: %s" % str(e))
try:
dev.set_configuration()
dev.reset()
except usb.core.USBError as e:
sys.exit("Cannot set configuration the device: %s" % str(e))
print dev
endpoint_in = dev[0][(interface,0)][0]
endpoint_out = dev[0][(interface,0)][1]
print endpoint_in
print endpoint_out
msg = 'test123'
data1 = dev.write(endpoint_out, msg,100)
print data1
data = dev.read(endpoint_in, len(msg),100)
sret = ''.join([chr(x) for x in data])
print sret
print repr(data.tostring())
usb.util.dispose_resources(dev)
Я могу записать на устройство, используя "data1 = dev.write(endpoint_out, msg,100)", но когда я пытаюсь прочитать с устройства "data = dev.read(endpoint_in, len(msg),100)", я получаю следующую ошибку:
usb.core.USBError: [Errno 32] Pipe error
Я пытался найти эту проблему, но не смог найти много. В http://christopherpeplin.com/2012/02/bulk-usb-throughput упоминается следующее:
Полное исправление для варианта использования OpenXC состоит в том, чтобы убедиться, что каждое сообщение дополняется до 64 байтов, и запросить объемные объемы передачи, которые достаточно велики, чтобы получить хорошую пропускную способность, но достаточно малы, чтобы не слишком задерживаться. Я еще не подтвердил, но, насколько я понимаю, если мы запрашиваем чтение 4 КБ и не помечаем конец передачи пакетом, длина которого меньше максимальной, хост-устройство будет блокировать ожидание оставшихся запрошенных данных.,
Я попытался отправить 64-байтовые данные, используя следующую строку: abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd.
Команда write показывает записанные 64 байта, но та же самая ошибка 32 возникает, когда я пытаюсь прочитать с устройства. Я новичок в программировании USB, и я застрял здесь. Может кто-нибудь помочь, пожалуйста?