LINUX.ORG.RU

V-USB прошивка vs USB->UART переходник

 , , , ,


0

1

Короче, здравсте. В недавних темах я поднимал вопросы по поводу железа, как присобачить мою прелестную ATmega8A-PU к компуктеру.
И ураааа, прошил, подключил, определилось. Я безмерно рад. Попробовал все примеры, всё работает. Сразу побежал шить то что я хотел, а именно GPIO вот эт вот прошилось, лампочки подсоединил, мигаютс. Ну и читаются конечно с ножек значения. Всё хорошо.

И вот я такой думаю, для самоделки я буду слать на AVR данные с управляющей программы, сама AVR будет дёргать драйвер L293D (который мне по ошибке сунули в посылку лет 7 тому назад гыгы), также AVR будет считывать значения с двух эмм оптопар, ну типа как в мышке между колёсиком, и слать эти данные обратно на компуктер, тот в свою очередь по состоянию этих оптопар будет узнавать что действие выполнено или нет решая тем самым продолжать слать те или иные команды к AVR GPIO.

Прежде чем собирать самоделку решил побенчить скорость передачи данных, мудрить не стал взял пример называющийся hid-data внутри управляющей программы внёс небольшие изменения, так что-бы avr передавала данные на компьютер 1000 раз подряд по 128 байт.

...
    if(strcasecmp(argv[1], "read") == 0)
    {
        //тут не было цикла 
        for (int i = 0; i < 1000; ++i)
        {
          int len = sizeof(buffer);
          if((err = usbhidGetReport(dev, 0, buffer, &len)) != 0)
          {
            fprintf(stderr, "error reading data: %s\n", usbErrorMessage(err));
          }else{
            hexdump(buffer + 1, sizeof(buffer) - 1);
          }
        }

    }
....

На стороне прошивки микроконтроллера я убрал запись в EEPROM и навесил цикл как имитацию некой работы, тупо в данные счётчик писал.

uchar   usbFunctionRead(uchar *data, uchar len)
{
    if(len > bytesRemaining)
        len = bytesRemaining;
    /*eeprom_read_block(data, (uchar *)0 + currentAddress, len);*/
    for (int i = 0; i < len; ++i)
    {
        data[i]=i;/*тупо вот так*/
    }
    currentAddress += len;
    bytesRemaining -= len;
    return len;
}

Всё пересобрал и прошил. Вариант передачи данных с ПК на МК проверять не стал +/- одно и тоже должно быть.

Замерял в лоб по времени отрабатывания управляющей программы. Ну как бы реальные условия гыгы. И воть чъво получилося…

Кварц 12Mhz

dron@gnu:~/hid-data-speed-test/commandline$ time sudo ./hidtool read > /dev/null

real	0m8,360s
user	0m0,008s
sys	0m0,011s

Кварц 16Mhz

dron@gnu:~/hid-data-speed-test/commandline$ time sudo ./hidtool read > /dev/null

real	0m7,261s
user	0m0,007s
sys	0m0,011s

Ну ок, считаем Это только читаем из контроллёра

  • 12Mhz -> (1000 * (128 * 8)) / 8.360 = 122488 бит в секунду
  • 16Mhz -> (1000 * (128 * 8)) / 7,261 = 141027 бит в секунду

Важно что в примере было вот это

    0x75, 0x08,                    //   REPORT_SIZE (8)
    0x95, 0x80,                    //   REPORT_COUNT (128)

Я ещё не очень разобрался, но вроде понял что данные передаются по 8 байт за раз. Что собна видно было по счётчику который я писал в данные, если не отправлять в /dev/null то всё видно.

Ну вроде не шибко много, но вроде и не мало. В байт можно сунуть 8 разных значений и получается 141 тысяча значений в секунду. Для GPIO это значит что я могу дрыгать быстро ножками и читать ножки в принципе довольно быстро. Я такой весь довольный лезу в даташит поглазеть на всякие приколюхи, заинтересовал UART и вижу в Table 20-12 для 16Mhz скорость передачи данных от 1Mbit/s или 2Mbit/s Это же в 7 и 14 раз быстрее чем через V-USB соответственно. Ну ладно два мегабита это фиг с ним, но один это уже круть.

И вот после этого коротенького вступления вопрос или даже скорее приём советов по поводу что лучше использовать в самоделках для коммуникации с ПК.

Пока что переходника USB-UART у меня нету и опыта работы с UART в виде написания для него программ тоже нету, переходник надо заказывать.

  • 0 - Хочется простоты и надёжности (ну относительной для самоделок)
  • 1 - Хочется делать штуки разные (есть 5 микроконтролелров)
  • 2 - Хочется для каждой штуки написать утилиту для работы с нею
  • 3 - Хочется что-бы утилиты могли сами определять с каким конкретно контроллером работать даже если их воткнуто все 5 штук

Ну по первому, делаешь и делай. Ок.
По второму с USB я так понял что могу взять халявный VID/PID Vendor Class и фигачить на них вообще всё что угодно, различая устройства по строковому описанию устройства, таким образом «драйвером» устройства будет программа. Даже свою клавиатуру могу забабахать и продавать её, хотя с этим вроде как проблемы и геморой с этими VID/PID ну да ладно. Третье, ну третье вытекает из второго 5 юсб устройств с одинаковыми VID/PID, но разными строками описания не будут конфликтовать.

Это я всё понял для USB, а вот теперь USB-UART 3 преимущества которое я вижу это

  • не надо никакой обвязки втыкнул в контроллер 4 провода и всё
  • скорость, гораздо большая скорость передачи данных
  • не будут заняты ~2 килобайта флеша и оперативки ~100 байт.
  • может ещё чего, но в голову ничего не лезет

А вот теперь вопрос, могу ли я забабахать клавиатуру на AVR через USB-UART =))) Я так понимаю нет, немогу. Это и ещё кучка других подобных случаев идут в минус, а вот GPIO могу ибо «драйвер» это управляющая программа обычная.

Могу ли я впихнуть 5 штук USB-UART переходников и работать с каждым устройством отдельно? Будет какой то геморой, конфлиткты этих переходников и вообще?

Могу ли я при воткнутых 5 штуках USB-UART при этом на каждом из них будет висеть по AVR микроконтроллеру из пяти программ сделать так что-бы каждая программа присобачилась к нужному переходнику? Будет ли тут геморой?

Будет ли внезапная необходимость накатывать модули ядра аля блоб для USB-UART переходников?

Могут ли они честно вытягивать мегабит? Например PL2303HX USB to TTL он со шнурком сразу идёт, удобно, практично.

Короче, я всё это только пока-что палочкой тыкаю. Буду рад услышать советы, V-USB не шутсро, но работает уже сейчас, а вот огребу ли я гемороя от переходников, как в железной части, так и в последующем программном взаимодействии? Или же годно для устройств всяких (очень разнообраных) использовать переходничик? Софтовый USB vs Аппаратный USB и UART.

Дискас.

Возьми МК с настоящим USB и не занимайся этой дурью.

alexru ★★★★ ()

забабахать клавиатуру на AVR через USB-UART

Работающую в linux-е? См. man inputattach.

P.S. Делай лучше PS/2 + USB-PS/2. Примеры для AVR в интернете есть.

arson ★★★★★ ()

Хочется что-бы утилиты могли сами определять с каким конкретно контроллером работать даже если их воткнуто все 5 штук

Бери USB-UART в котором можно менять VID/PID/SerialN.
Например CP2102 + тулза cp210x-cfg.

arson ★★★★★ ()

Могут ли они честно вытягивать мегабит? Например PL2303HX

Из него 6Mbit (ну минус старт/стоп биты) можно вытянуть, это если просто связать две штуки.

arson ★★★★★ ()

Зачем так много? Пока дочитаешь, уже забудешь начало.

К удобствам uart можно добавить, что там дёшево реализуется опторазвязка, особенно если скорость не нужна. Или беспроводной канал (продаются всякие платки с распаяными чипами, на 433 МГц или 2.4 ГГц).

Касательно клавиатуры на uart, вроде, нужно ковырять inputattach.

Блобы для usb-uart, не нужны, вроде, все распространённые чипы поддерживаются штатными драйверами ядра. С идентификацией сложнее. По хорошему usb-uart должен иметь возможность задать ему уникальное число (серийный номер), тогда в правиле udev можно задать название этому переходнику. И под каждый чип своя отдельная программа, зашивающая серийник. Я прошил в CP2102 (не помню чем) и пробовал в FTDI FT232BL, но так и не доковырял. Ещё прочитал в даташите, что CH340B подходит (именно B), но на неё переходников как-то не продают. Поэтому смотрите на каком чипе покупаете USB-UART.

Не все AVR имеют аппаратный UART, если есть 16 бит таймер, то можно библиотеку AltSoftSerial, остальные софтовые эмуляторы uart вобще фигня. Это я касательно 5 устройств, если будете выбират на каком МК делать. Ну, и может действительно лучше искать с аппаратным USB.

Из минусов VUSB V-USB для AVR микроконтроллеров. Насколько стабильно для продакшена? (комментарий) , актуально для собственного кода, а не для готовой прошивки, как у вас.

Вашей гонки за скорость я не понял, ИМХО, если МК дожен ногами точные таймиги выдавать, то это должна делать его прошивка, а не демон на компе, подключенном через usb.

А в целом usb это тот ещё геморой, если будет какой-то источник помех (допустим реле) будете радоваться сообщениям в логах:

usb usb5-port1: disabled by hub (EMI?), re-enabling...

mky ★★★★★ ()

Я V-USB не пользовался, но на мой взгляд программная реализация USB – достаточно сомнительная тема. Аппаратные-то реализации при недостаточно стабильном тактовом сигнале или не очень хорошем соединении могут подглючивать.

Хочешь простоты и надёжности для разных штук – бери USB-UART.

А вот теперь вопрос, могу ли я забабахать клавиатуру на AVR через USB-UART

В общем случае нет. Это минус.

Могу ли я при воткнутых 5 штуках Будет ли тут геморой?

Особо не будет. Пропиши им разные айдишники, либо на уровне логики твоей программы реализуй нумерацию.

Будет ли внезапная необходимость накатывать модули ядра аля блоб для USB-UART переходников?

Не встречал такого.

Могут ли они честно вытягивать мегабит?

Тут надо внимательно читать даташит на приобретаемый чип.

Или же годно для устройств всяких (очень разнообраных) использовать переходничик?

Да, годно. Этим массово пользуются, если такой скорости хватает. Когда становится надо хотя бы Full Speed USB, тут уже ничего не поделаешь.

apt_install_lrzsz ()

FT232RL

Это не только годный быстрый USB-UART с выбором напряжения логики но и 8 бит GPIO. Я через него на пк с простыми железками работаю. SPI гонять, и просто разный ногодрыг.

Есть еще FT232H. Подороже но там аппаратный SPI, I2C и JTAG. Тоже удобно i2c железки тестировать прямо с компа.

bga_ ★★★ ()

Всё зависит от твоих задач. 1 Мбит это дофига. Твоя AVR сможет генерировать столько данных? Если ты не приставку-осциллограф делаешь (то есть просто считал сырые данные с АЦП и без обработки отправил на комп), то обычно МК немало времени проводит в различной обработке сигналов и даже выдаче обратной связи без участия ПК (а ПК только задаёт настройки и получает инфу о состоянии системы). И в этом случае часто ты упираешься не в канал связи, а в вычислительную мощность МК. А когда берёшь жирный МК, то у него внезапно обнаруживается аппаратный USB и там уже до 12 МБит.

Осциллографы и модемы (а также другие преобразователи интерфейсов) это лишь малая часть встраиваемых систем.

Определись с задачей, которую ты собираешься решать. Если просто мигать светодиодами с максимально возможной частотой, то можно вообще выкинуть МК из схемы и использовать какую-нибудь FT232RL в режиме bitbang. Скорость будет высокая и не надо писать 2 программы, а хватит одной программы на компьютер. Если же МК будет управлять какой-то железкой, то, наверное, ПК будет лишь передавать настройки и принимать телеметрию и очень часто на это и скорости 9600 хватит. А где не хватит (железка требует очень быстрых управляющих воздействий), там обычно и AVR не хватает (так как не успеет рассчитать управляющее воздействие, а управляющей программе на ПК сложно обеспечить риалтайм, так как Windows/Linux не являются RTOS).

KivApple ★★★★★ ()
Последнее исправление: KivApple (всего исправлений: 2)
Ответ на: комментарий от apt_install_lrzsz

В том то и дело что есть полно нормального, кроме этого фуфла.

James_Holden ★★ ()

скорость передачи данных от 1Mbit/s или 2Mbit/s

могу ли я забабахать клавиатуру

Будешь быстро вводить буквы вяленый упадет (точнее вяленые приложения) ;)

Я правда тренировался на виртуальной клаве (без ограничения по скорости), типа:

socat PTY,link=./kbd PTY,link=./kbd_ctrl
inputattach --ps2serkbd ./kbd_ctrl # от root-а

Ввод букв:

sleep 3 ; for i in {1..10} ; do echo -ne '\x1C\xF0\x1C' > ./kbd_ctrl ; done

При 1000 букав упал Xwayland, при 10000 - weston-terminal.
Падение правда не 100% (чем больше тестишь, тем меньше падают), но при 100000 - 100%.

P.S. Консолька и Xorg не падают.

arson ★★★★★ ()
Ответ на: комментарий от arson

inputattach –ps2serkbd ./kbd_ctrl # от root-а

FIX:

inputattach --ps2serkbd ./kbd # от root-а
arson ★★★★★ ()
Ответ на: комментарий от arson

inputattach –ps2serkbd

Обломали, на реальном устройстве быстро вводить буквы не получается.
Cкорость для ps/2 по умолчанию 1200 и с командной строки невозможно выставить больше 38400 (хотя сам inputattach для некоторых устройств выставляет до 115200).
Надо inputattach править.

arson ★★★★★ ()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.