Статус термопринтера с libusb на Linux ARM

Я знаю, что есть много вопросов о принтере статуса ...

У меня Citizen CT-S310 II, я управлял всем кодом для записи символа на USB без проблем с libusb_bulk_transfer (текст, полужирный, центр, CR, CUT_PAPER и т. д.):

#define ENDPOINT_OUT    0x02
#define ENDPOINT_IN     0x81

struct libusb_device_handle *_handle;

[detach kernel driver...]
[claim interface...]
[etc ...]

r = libusb_bulk_transfer(device_handle, ENDPOINT_OUT, Mydata, out_len, &transferred, 1000);

Теперь мне нужно получить данные с принтера, чтобы проверить статус, моя первая идея заключалась в том, чтобы отправить команду POS с тем же "bulk_transfer" документа:

1D (шестнадцатеричный) 72 (шестнадцатеричный) n n => 1 (отправить статус датчика бумаги)

и получить значение с помощью "bulk_transfer" с конечной точкой "ENDPOINT_IN", в документе говорится, что есть 8 байтов для приема:

bit 0,1 => paper found by paper near-end sensor 00H
bit 0,1 => paper not found by paper near-end sensor 03H
bit 1,2 => paper found by paper-end sensor 00H
bit 1,2 => paper not found by paper-end sensor 0CH
[...]

так что два "bulk_transfer", один для статуса отправки команды (ENDPOINT_OUT) и один для получения результата (ENDPOINT_IN), но у меня всегда есть ОШИБКА USB ("bulk_transfer" в read = -1)

Может USB так не работает? Итак, моя вторая идея состояла в том, чтобы использовать реализованную функцию в PrinterClass USB с командой "control_transfer":

int r = 0;
    int out_len = 1;
    unsigned char* _udata = NULL;

    uint8_t bmRequestType = LIBUSB_ENDPOINT_IN | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE;
    uint8_t bRequest = LIBUSB_REQUEST_GET_STATUS;
    uint16_t wValue = 0; // the value field for the setup packet (?????)
    uint16_t wIndex = 0; // N° interface printer (the index field for the setup packet)

    r = libusb_control_transfer(device_handle, bmRequestType,bRequest,wValue, wIndex,_udata,out_len, USB_TIMEOUT);

Я точно не знаю, как заполнить все параметры, я знаю, что это зависит от моего устройства, но документ libsub не очень явный.

Что такое wValue?

Что такое «wIndex»? номер интерфейса ??

параметр LIBUSB_ENDPOINT_IN по умолчанию равен 0x80, но мой принтер использует 0x81, я должен изменить эту конечную точку по умолчанию?

Bus 001 Device 004: ID 1d90:2060
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0        64
  idVendor           0x1d90
  idProduct          0x2060
  bcdDevice            0.02
  iManufacturer           1 CITIZEN
  iProduct                2 Thermal Printer
  iSerial                 3 00000000
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           32
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0xc0
      Self Powered
    MaxPower                0mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass         7 Printer
      bInterfaceSubClass      1 Printer
      bInterfaceProtocol      2 Bidirectional
      iInterface              0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x02  EP 2 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
Device Status:     0x0001
  Self Powered

Ответ «control_transfer» в моем случае всегда равен 0 :( с бумагой или без. Как отправить хороший «control_transfer» для запроса статуса моего принтера ??

Вся помощь в решении моей проблемы приветствуется !!!


person Gilles Grandguillaume    schedule 12.04.2015    source источник


Ответы (1)


наконец решено!

Значение LIBUSB_REQUEST_GET_STATUS - 0x00, но для принтера статус запроса - 0x01.

для проверки статуса принтера с помощью libusb-1.0:

uint8_t bmRequestType = LIBUSB_ENDPOINT_IN | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE;
    uint8_t bRequest = 0x01; // Here not LIBUSB_REQUEST_GET_STATUS
    uint16_t wValue = 0;
    uint16_t wIndex = 0;

    r = libusb_control_transfer(device_handle, bmRequestType,bRequest,wValue, wIndex,&_udata,out_len, USB_TIMEOUT);
person Gilles Grandguillaume    schedule 13.04.2015