Емельянов Эдуард Владимирович (eddy_em) wrote in ru_radio_electr,
Емельянов Эдуард Владимирович
eddy_em
ru_radio_electr

Непонятки с USB-CDC

Пытаюсь реализовать USB-CDC на STM32F042. Завел, как и положено, помимо нулевой еще три контрольных точки: 0x81, 0x83 и 0x02. Прием данных на 0x83 идет превосходно, а вот отправка — никак. Кроме того, непонятно: а) зачем нужна EP1, если она вообще никакого участия в работе не принимает, б) как работать с "vendor" запросами (ни на какую точку не приходят прерывания от них!)?

В качестве копируемого устройства выбрал PL2303, который везде работает и точно поддерживает аппаратное управление потоком. При подключении dmesg ругается лишь на "vendor" запросы:
[4667079.284993] usb 1-2: USB disconnect, device number 80
[4667079.685834] usb 1-2: new full-speed USB device number 82 using xhci_hcd
[4667079.812097] usb 1-2: config index 0 descriptor too short (expected 53, got 39)
[4667079.813425] usb 1-2: New USB device found, idVendor=067b, idProduct=2303
[4667079.813426] usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[4667079.813951] pl2303 1-2:1.0: pl2303 converter detected
[4667079.814076] pl2303 1-2:1.0: pl2303_vendor_read - failed to read [8484]: -71
[4667079.814168] pl2303 1-2:1.0: pl2303_vendor_write - failed to write [0404]: -71
[4667079.814262] pl2303 1-2:1.0: pl2303_vendor_read - failed to read [8484]: -71
[4667079.814354] pl2303 1-2:1.0: pl2303_vendor_read - failed to read [8383]: -71
[4667079.814448] pl2303 1-2:1.0: pl2303_vendor_read - failed to read [8484]: -71
[4667079.814542] pl2303 1-2:1.0: pl2303_vendor_write - failed to write [0404]: -71
[4667079.814637] pl2303 1-2:1.0: pl2303_vendor_read - failed to read [8484]: -71
[4667079.814733] pl2303 1-2:1.0: pl2303_vendor_read - failed to read [8383]: -71
[4667079.814860] pl2303 1-2:1.0: pl2303_vendor_write - failed to write [0000]: -71
[4667079.814944] pl2303 1-2:1.0: pl2303_vendor_write - failed to write [0001]: -71
[4667079.815027] pl2303 1-2:1.0: pl2303_vendor_write - failed to write [0002]: -71
[4667079.815073] usb 1-2: pl2303 converter now attached to ttyUSB1

И действительно, в коде модуля ядра есть:
...
pl2303_vendor_read(serial, 0x8484, buf);
pl2303_vendor_write(serial, 0x0404, 0);
pl2303_vendor_read(serial, 0x8484, buf);
...

В обработчике каждой точки я поставил диагностический асинхронный вывод (через DMA) на UART (понятно, что скорости UART не хватает, но все-таки, ни разу не проскочило ни одного запроса на EP1, а с EP0 хост общается лишь на стадии конфигурирования. Дальше при отправке данных вижу постоянные ругательства:
[4667301.263763] pl2303 ttyUSB1: usb_serial_generic_read_bulk_callback - urb stopped: -32
[4667304.808223] pl2303 ttyUSB1: pl2303_set_control_lines - failed: -71
[4667313.021714] pl2303 ttyUSB1: pl2303_set_control_lines - failed: -71
[4667313.021946] pl2303 ttyUSB1: error sending break = -71

Но не вижу запросов на EP0!!! (в самом ее начале стоит диагностический выхлоп, так что, если бы что-то и было, то наверняка хоть раз да проскочило)
Обработчик EP2 и EP3 такой:
static uint16_t EP2_Handler(ep_t ep){
    if (ep.rx_flag){
MSG("read ");
printu(ep.rx_cnt);
newline();
        if(ep.rx_cnt > 2){
            len = ep.rx_cnt;
            rcvflag = 1;
            EP_Read(2, buffer);
        }else{
            uint8_t buf[2];
            EP_Read(2, buf);
        }
        ep.status = SET_VALID_RX(ep.status);
    } else
    if (ep.tx_flag){
        MSG("write\n");
        ep.status = SET_STALL_TX(ep.status);
    }
    return ep.status;
}

На чтение /dev/ttyUSB1 dmesg ругается, что "vendor" запросы не проходят (это и понятно), на запись все ОК, но почему-то самый первый раз отправляемый в /dev/ttyUSB1 текст читается дважды!
При чтении тоже загадки какие-то: иногда текст считывается целиком (пишу в устройство при помощи `echo "..." > /dev/ttyUSB1`), а иногда кусками и дважды!
Tags: usb
Subscribe

  • покритикуйте схему и исполнение

    приехала с ебая из израиля плата. генератор стабилизированного напряжения примерно 1-1.5кВ для питания оптоумножителей. цена кусачая на фоне…

  • Почему IR дист. управление плохо стало работать?

    Пульт был плохой, замусоленный, каждое нажатие надо несколько раз делать, иначе не реагирует. Вчера купил новенький пульт, но всё то же самое:…

  • не сжечь показометр

    кривой вопрос. 1. есть блокинг-генератор с ебая, обещают "1..3 киловольт при питании от 4.7 вольт". по схеме - блокинг плюс учетверитель.…

  • Post a new comment

    Error

    Comments allowed for members only

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 11 comments

  • покритикуйте схему и исполнение

    приехала с ебая из израиля плата. генератор стабилизированного напряжения примерно 1-1.5кВ для питания оптоумножителей. цена кусачая на фоне…

  • Почему IR дист. управление плохо стало работать?

    Пульт был плохой, замусоленный, каждое нажатие надо несколько раз делать, иначе не реагирует. Вчера купил новенький пульт, но всё то же самое:…

  • не сжечь показометр

    кривой вопрос. 1. есть блокинг-генератор с ебая, обещают "1..3 киловольт при питании от 4.7 вольт". по схеме - блокинг плюс учетверитель.…