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, и я застрял здесь. Может кто-нибудь помочь, пожалуйста?

0 ответов

Другие вопросы по тегам