stm32 USB host

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
HardWareMan
Мучитель микросхем
Сообщения: 429
Зарегистрирован: Ср сен 02, 2015 07:47:20

Re: stm32 USB host

Сообщение HardWareMan »

[uquote="danone78",url="/forum/viewtopic.php?p=4658686#p4658686"]Получается что раз в милисеунду обязательно на SOF прерывание залетать?[/uquote]
Конечно! SOF выдаёт хост каждое нормированное стабильное время (для USB1/USB2 это 1мс). Это базовая синхронизация шины. А ещё некоторые устройства используют его для определения спячки: если питание есть а SOFы пропали - можно спать, пока не прилетит новый SOF. Ну и для HID устройств SOF можно использовать как маркер обновления состояний кнопок, причём в некоторых мышах можно задавать количество SOF через которое происходит обновление: те самые игровые FS/HS мышки настраиваются на частоту опроса до 1000/секунду это оно и есть.
Изображение
Репозиторий STM32: https://cloud.mail.ru/public/2i19/Y4w8kKEiZ
Актуальность репозитория: 22 апреля 2026 года
Если чего-то не хватает с сайта st.com - пишите, докачаю.
/!\ Обновлений для STM32PowerMon и STM32PowerMon-UCPD временно не будет.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: stm32 USB host

Сообщение COKPOWEHEU »

[uquote="danone78",url="/forum/viewtopic.php?p=4658686#p4658686"]Разобрался что надо PID чередовать, вот только черный нечетный кадр пробовал менять и разницы не увидел. Получается что раз в милисеунду обязательно на SOF прерывание залетать? И.. я не понял где кнопки? Смещения координат я получаю, а кнопки то куда? Жму кнопку, прилетает пакет с нулями.[/uquote]
DATA1/DATA0 девайсы могут и не проверять. Хотя те, что я видел (кроме vusb) проверяли.
Кнопки должны быть в том же репорте. Но точнее стоит проверить по HID-дескриптору.
Возможно, поможет моя статья: https://habr.com/ru/articles/551720/
jcxz писал(а):Если все биты описаны в мануале, то нормально.
Это вы, видать, забыли насколько криво они описаны.
jcxz писал(а):Значит у вас размер точек был маленький.
Вроде почти до максимума тестировал. Там же 512-байтный кусок памяти, минус 64 байта на таблицу размещения, минус 8-64 байта на EP0, да пополам ради двойной буферизации. 220 байт за раз получается. Кажется, изохронные точки - единственные в USB-FS, на которые не распространяется ограничение 64 байта.
jcxz писал(а):А значит - и максимальная скорость изохронной передачи ограничена - менее 1/4 от максимально возможной для USB-FS.
Только на прием ("микрофон"). На передачу ("динамик") хост шлет несколько запросов.
jcxz писал(а):Получается - STM32L не соответствует даже требованиям USB-FS. Или не полностью соответствует.
Отчего же не соответствует. Аудиоустройства на нем делать можно? Можно. Даже скорость обмена вполне приемлемая получается. Этого с запасом хватит на два канала 16 бит 48 кГц.
HardWareMan писал(а):Конечно! SOF выдаёт хост каждое нормированное стабильное время
Вроде бы это начиная с USB-2. Для LS посылать SOF обязательно только если нет обычного обмена. Потому что активность на шине - признак ухода в сон.
HardWareMan писал(а):количество SOF через которое происходит обновление: те самые игровые FS/HS мышки настраиваются на частоту опроса до 1000/секунду это оно и есть.
Чего?!
Скорость обновления interrupt точки прописана в ней самой, и ни к каким SOF не привязана.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: stm32 USB host

Сообщение VladislavS »

[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4658814#p4658814"]Это вы, видать, забыли насколько криво они описаны.[/uquote]Нормально всё описано. Непонятно, как может вызвать проблемы прямое указание на правила работы с битами? Операция "исключающее ИЛИ" с битами это так сложно?
Изображение
изображение_2024-12-10_112447943.png
(53.31 КБ) 370 скачиваний
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: stm32 USB host

Сообщение COKPOWEHEU »

Все возможные способы доступа это сложно. Извратные маски, которые вследствие этого приходится накладывать, это сложно. Что им мешало не по 1 инвертировать, а по 0? Или наоборот, по 1 сбрасывать бит в 0?
Аватара пользователя
smacorp
Друг Кота
Сообщения: 3472
Зарегистрирован: Вт окт 22, 2013 04:37:23
Откуда: Казань

Re: stm32 USB host

Сообщение smacorp »

Что мешало, что мешало... Я давно считаю, что спецификацию USB наркоманы писали, причём не абы какие, а в самый забористый приход или в период жуткой ломки, иначе непонятно за что они так подгадили человечеству.
Платы для HLDI - установки лазерной засветки фоторезиста.
Фоторезист Ordyl Alpha 350
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльные маски XV501T-4 и KSM-S6189 (5 цветов).
Заказ печатных плат - pcbsmac@gmail.com
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: stm32 USB host

Сообщение COKPOWEHEU »

[uquote="smacorp",url="/forum/viewtopic.php?p=4658859#p4658859"]Я давно считаю, что спецификацию USB наркоманы писали[/uquote]
Полностью согласен! 16-битные VID:PID. Хранение адреса на устройстве (при том, что реальная топология - дерево, а вовсе не шина). utf-16 для строк. Отсутствие прерываний (из-за чего пришлось вводить костыль с interrupt-точкой). Засовывание в диф пару не диф состояний. Манипулирование измерением напряжения вместо логических уровней (кажется, USB-HS так отличает себя от FS. Ну и PD, куда ж без него). 3.3 В на сигнальных линиях при 5 В на питании.
Это что с ходу вспомнилось.
Аватара пользователя
HardWareMan
Мучитель микросхем
Сообщения: 429
Зарегистрирован: Ср сен 02, 2015 07:47:20

Re: stm32 USB host

Сообщение HardWareMan »

[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4658814#p4658814"]
HardWareMan писал(а):количество SOF через которое происходит обновление: те самые игровые FS/HS мышки настраиваются на частоту опроса до 1000/секунду это оно и есть.
Чего?!
Скорость обновления interrupt точки прописана в ней самой, и ни к каким SOF не привязана.[/uquote]
Того!
Это Vendor-Specific реализация. Даже если заставить систему опрашивать мышь быстрее (вплоть до каждого SOF), это ещё не означает, что сам сенсор будет опрощен с такой же частотой. Поэтому, если опрашивать мышку чаще, чем она опрашивает свой сенсор, то мы просто получаем дублированные репорты либо NAK (смотря опять же как реализовал производитель). И это всё было разобрано чуть более полугода назад в этом треде: https://habr.com/ru/articles/811435/com ... t_26786417
Репозиторий STM32: https://cloud.mail.ru/public/2i19/Y4w8kKEiZ
Актуальность репозитория: 22 апреля 2026 года
Если чего-то не хватает с сайта st.com - пишите, докачаю.
/!\ Обновлений для STM32PowerMon и STM32PowerMon-UCPD временно не будет.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: stm32 USB host

Сообщение COKPOWEHEU »

[uquote="HardWareMan",url="/forum/viewtopic.php?p=4658887#p4658887"]Даже если заставить систему опрашивать мышь быстрее (вплоть до каждого SOF), это ещё не означает, что сам сенсор будет опрощен с такой же частотой.[/uquote]
Это означает, что максимальная частота опроса ограничена настройками эндпоинта. А внутри себя устройство может хоть миллион раз в секунду опрашивать (мало ли - усреднять, искать максимум), и это никак не привязано к протоколу обмена.
Аватара пользователя
HardWareMan
Мучитель микросхем
Сообщения: 429
Зарегистрирован: Ср сен 02, 2015 07:47:20

Re: stm32 USB host

Сообщение HardWareMan »

[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4658888#p4658888"][uquote="HardWareMan",url="/forum/viewtopic.php?p=4658887#p4658887"]Даже если заставить систему опрашивать мышь быстрее (вплоть до каждого SOF), это ещё не означает, что сам сенсор будет опрощен с такой же частотой.[/uquote]
Это означает, что максимальная частота опроса ограничена настройками эндпоинта. А внутри себя устройство может хоть миллион раз в секунду опрашивать (мало ли - усреднять, искать максимум), и это никак не привязано к протоколу обмена.[/uquote]
bInterval в мс (считай - в SOFах). В дорогих игровых мышах он минимален, но это не воспрещает опрашивать их медленнее. Настройкой такого опроса занимается софт от этих мышей.
Репозиторий STM32: https://cloud.mail.ru/public/2i19/Y4w8kKEiZ
Актуальность репозитория: 22 апреля 2026 года
Если чего-то не хватает с сайта st.com - пишите, докачаю.
/!\ Обновлений для STM32PowerMon и STM32PowerMon-UCPD временно не будет.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: stm32 USB host

Сообщение COKPOWEHEU »

[uquote="HardWareMan",url="/forum/viewtopic.php?p=4658895#p4658895"]bInterval в мс (считай - в SOFах). В дорогих игровых мышах он минимален, но это не воспрещает опрашивать их медленнее. Настройкой такого опроса занимается софт от этих мышей.[/uquote]
Еще раз. SOF-то тут при чем? bInterval задается в миллисекундах. Частота опроса сенсора вообще внутреннее дело самой мыши. SOF вообще может не посылаться, для LS-устройств.
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: stm32 USB host

Сообщение jcxz »

[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4658814#p4658814"]Вроде почти до максимума тестировал. Там же 512-байтный кусок памяти, минус 64 байта на таблицу размещения, минус 8-64 байта на EP0, да пополам ради двойной буферизации. 220 байт за раз получается. Кажется, изохронные точки - единственные в USB-FS, на которые не распространяется ограничение 64 байта.[/uquote]Открыл тот свой проект на STM32L с изохронными USB. Вот так у меня распределена USB-ОЗУ:

Код: Выделить всё

#define USB_EP_NUM       2  //макс.кол-во эндпоинтов одновременно используемых в программе (не включая ep0)
#define USB_MAX_PACKET0  8  //Max Endpoint 0 Packet Size [8/16/32/64]
#define OFS2ADDR(ofs) ((u32 *)((char *)&usbMem + ((ofs) << 1 & ~3) + ((ofs) & 1)))

__packed union UsbBufDescTbl {
  struct {
    u16 addrTx, gap0;
    u16 countTx, gap1;
    u16 addrRx, gap2;
    u16 countRx, gap3;
  };
  struct {
    u16 addr, gap0;
    u16 count, gap1;
  } txrx[2];
};

__no_init struct UsbMem {
  u16 ep0[2][USB_MAX_PACKET0];
  union {
    u16 epStream1[2][epSize_ASET1]; //alt.set1
    u16 epStream2[2][epSize_ASET2]; //alt.set2
  };
  UsbBufDescTbl desc[2 + USB_EP_NUM];
} usbMem @ ".usb";
Получается - максимальный размер эндпоинта == (512-2*4*4-8*2)/2 = 232 байта. Если ничего не напутал.
Таблица размещения у меня = 2*4*4 = 32 байта (64 - это занимает в адресном пространстве).

[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4658814#p4658814"]Только на прием ("микрофон"). На передачу ("динамик") хост шлет несколько запросов.[/uquote]Для изохронных точек в USB-FS это невозможно. Там только один кадр на каждую точку за один фрейм (1 мсек).
В STM32L даже переключение буферов происходит аппаратно. По SOF-у.

[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4658814#p4658814"]
jcxz писал(а):Получается - STM32L не соответствует даже требованиям USB-FS. Или не полностью соответствует.
Отчего же не соответствует. Аудиоустройства на нем делать можно? Можно. Даже скорость обмена вполне приемлемая получается. Этого с запасом хватит на два канала 16 бит 48 кГц.[/uquote]Изохронные - это не только для аудио. Нам например нужно было более 600 КБ/сек (размер точки более 600 байт). С гарантированной полосой пропускания. И пролетели. :(
В результате - заменили STM32L на дедушку LPC1758 и получили вплоть до 1023 байт/мсек как с куста. Так как NXP не пожалел ОЗУ под USB-RAM.

[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4658814#p4658814"]Скорость обновления interrupt точки прописана в ней самой, и ни к каким SOF не привязана.[/uquote]Она же кратна целому количеству SOF. А значит логично её стартовать от счётчика, декрементируемого по SOF.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: stm32 USB host

Сообщение COKPOWEHEU »

[uquote="jcxz",url="/forum/viewtopic.php?p=4658953#p4658953"]} usbMem @ ".usb";[/code]Получается - максимальный размер эндпоинта == (512-2*4*4-8*2)/2 = 232 байта. Если ничего не напутал.
Таблица размещения у меня = 2*4*4 = 32 байта (64 - это занимает в адресном пространстве).[/uquote]
Да, пожалуй, соглашусь. У меня структура сделана непрерывной - похоже, нечетные полуслова и правда игнорируются.
Плюс, наверное, если используются не все точки, можно пару байтов сэкономить.
[uquote="jcxz",url="/forum/viewtopic.php?p=4658953#p4658953"]Для изохронных точек в USB-FS это невозможно. Там только один кадр на каждую точку за один фрейм (1 мсек).
В STM32L даже переключение буферов происходит аппаратно. По SOF-у.[/uquote]
Не по SOF, а по запросам хоста, как и любые другие точки. На IN он посылает единственный запрос на фрейм. А на OUT - может несколько. Если настроить битрейт динамика так, чтобы не помещался в одну точку, хост прекрасно разбивает поток на несколько транзакций. wireshark-ом это прекрасно видно. Я пытался и на IN что-то сделать (размер точки, скорость опроса, даже в сторону синхронизации смотрел) но, похоже, не выйдет.
[uquote="jcxz",url="/forum/viewtopic.php?p=4658953#p4658953"]Изохронные - это не только для аудио. Нам например нужно было более 600 КБ/сек (размер точки более 600 байт). С гарантированной полосой пропускания.[/uquote]
Тут да, ограничение. Хотя я бы поставил какой-нибудь CDC-ACM и не мучился. Полоса пропускания современных хостов настолько больше предела USB-FS, что уж с этим проблем быть не должно.
jcxz писал(а):Она же кратна целому количеству SOF. А значит логично её стартовать от счётчика, декрементируемого по SOF.
Всего лишь "совпадает". А начинать новое преобразование логично когда завершилось предыдущее. Или когда предыдущее послано. Интервал между interrupt-IN и interrupt-IN кажется более стабильным, чем между SOF и interrupt-IN.
Не надо лепить SOF куда попало.
danone78
Встал на лапы
Сообщения: 82
Зарегистрирован: Вт фев 15, 2022 21:28:35

Re: stm32 USB host

Сообщение danone78 »

Аватара пользователя
HardWareMan
Мучитель микросхем
Сообщения: 429
Зарегистрирован: Ср сен 02, 2015 07:47:20

Re: stm32 USB host

Сообщение HardWareMan »

[uquote="danone78",url="/forum/viewtopic.php?p=4660136#p4660136"]https://cloud.mail.ru/public/8wGW/YGCiX9YTp[/uquote]
Изображение
Победа?
Репозиторий STM32: https://cloud.mail.ru/public/2i19/Y4w8kKEiZ
Актуальность репозитория: 22 апреля 2026 года
Если чего-то не хватает с сайта st.com - пишите, докачаю.
/!\ Обновлений для STM32PowerMon и STM32PowerMon-UCPD временно не будет.
danone78
Встал на лапы
Сообщения: 82
Зарегистрирован: Вт фев 15, 2022 21:28:35

Re: stm32 USB host

Сообщение danone78 »

Если не менять DATA 0/1 , то через кадр сыпятся Toggle error. Все отлично, но прилетает TXERR (Transaction error) в одной SUTUP транзакции. Ну мой драйвер любые повторы делает по событиям от прерывания канала не дожидаясь СОФ, все равно со второй попытки все проталкивается дальше. Если каждый пакетик слать в начале фрейма, то даже NACK-ов нету, а так мышь не успевает что-ли, или как-то надо мониторить конец кадра.
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: stm32 USB host

Сообщение jcxz »

[uquote="danone78",url="/forum/viewtopic.php?p=4660649#p4660649"]Если не менять DATA 0/1 , то через кадр сыпятся Toggle error. Все отлично, но прилетает TXERR (Transaction error) в одной SUTUP транзакции. Ну мой драйвер любые повторы делает по событиям от прерывания канала не дожидаясь СОФ, все равно со второй попытки все проталкивается дальше. Если каждый пакетик слать в начале фрейма, то даже NACK-ов нету, а так мышь не успевает что-ли, или как-то надо мониторить конец кадра.[/uquote]Т.е. - так толком и не заработало и причины ошибок не найдены...
danone78
Встал на лапы
Сообщения: 82
Зарегистрирован: Вт фев 15, 2022 21:28:35

Re: stm32 USB host

Сообщение danone78 »

Все, разобрался, работает отлично, без ошибок, даже без NACK-ов и на одном канале. То есть я вообще не задействую второй канал, просто переключаю канал после инициализации мышки под другой тип передач.
Весь обработчик прерывания от мышки уместился в 400 строк. Хрю :?
Ответить

Вернуться в «ARM»