Pull to refresh

Comments 11

Было бы просто замечательно указать на мои косяки, чтобы я их исправил!
P.S. Подобия моего монстра, который был на спор сделан за один вечер (семь независимых CDC на одном STM32F103) я еще не встречал.
P.P.S. Не стоит озираться на мух! Пусть сидят на своих форточках, зачем гробиться и разрабатывать что-то под эту прошивку игровых приставок, которую даже ОСью язык не поворачивается назвать? Я уже как минимум 15 лет вообще ничего не разрабатываю с тестированием, чтобы оно и в мастдайке работало. И ничего: все довольны! Все-таки, разрабатываю не игры, так что и потребителями являются не геймеры.
P.P.P.S. Подобные вещи надо публиковать и в приличных местах: хоть на той же ЖЖшке и всяких блогах изиэлектроникса. Потому что здесь они просто будут похоронены (а то и заминусованы и спущены в /dev/null).

Что до модернизации «синей таблетки», советую сразу же сделать так: выпаять 10-килоомный резистор подтяжки DP (странно, как оно вообще работает с 10кОм вместо 1.5кОм?) и вместо него впаять 0603 между лапами PA12 (USB DP) и PA15. Ногу PA15 настраиваем на пуш-пулл и для временного отключения от хоста подтягиваем ее к нулю. Хост рассматривает это как отключение устройства. Далее настраиваем USB и подтягиваем PA15 к единице — хост рассматривает это как подключение устройства. Ток через PA15 при этом течет не больше 2.2мА, что вполне в рамках допустимых нагрузок. Зато получается совершенно косметически незаметная переделка (не то, что некоторые, ваяющие уродства в виде висящих на соплях транзисторов).
Было бы просто замечательно указать на мои косяки, чтобы я их исправил!
Для меня была очень неочевидна ваша работа с EPnR, точнее, тамошними наркоманскими битами. Думаю, у меня все же сделано более наглядно.
P.P.S. Не стоит озираться на мух! Пусть сидят на своих форточках
Тут вопрос не только в форточках, но и в следовании стандарту. Сегодня линукс косяки прощает, а потом придет обновление и все. Тем более что это почти ничего не стоит.
P.P.P.S. Подобные вещи надо публиковать и в приличных местах: хоть на той же ЖЖшке и всяких блогах изиэлектроникса.
Если хотите, скопируйте, мне не жалко. Кому будет интересно найдут. Для меня же это скорее конспект, чтобы через полгода не забыть как оно работает.
Что до модернизации «синей таблетки»
Может, кому и пригодится. У меня-то самодельная плата, которой почти не пользуюсь (l151 удобнее). Тут было бы интереснее подсмотреть как vusb умудряется отключать себя от хоста и адаптировать под stm. Но поскольку я ей толком не пользуюсь, заниматься этим лень.
было бы интереснее подсмотреть как vusb умудряется отключать себя от хоста и адаптировать под stm

Оказалось, все довольно просто: надо было отключить модуль USB и подтянуть D+ к земле:


USB->CNTR = USB_CNTR_FRES; // Force USB Reset
USB->CNTR = USB_CNTR_PDWN;
GPIO_manual( USB_DP, GPIO_OD50 );
GPO_OFF(USB_DP);
for(uint32_t ctr = 0; ctr < 100000; ++ctr) asm volatile("nop"); // wait >1ms
GPIO_manual( USB_DP, GPIO_HIZ );

Таким образом, можно подтяжку сделать прямо на питание, и никаких проблем с реконнектом не будет.

Если вы считаете извращением USB стек от ST, то это вы еще BLE от ST не видели, особенно что касается их последней двухядерной поделки STM32WB…
Ох, как я понимаю всю боль автора по поводу нестандартной организации буфера и регистров USB_EPnR. Я через эти аццкие муки прошёл пару лет назад, пытаясь написать свой велосипед. В итоге я застрял на второй фазе идентификации, плюнул на это дело и заюзал библиотеку от ST.
Я в свое время в итоге смог разобраться, но регистры с toggle-режимом доступом мозги поели изрядно. Поэтому если кто-то вдруг будет повторять мой опыт настоятельно рекомендую начать с этого чтобы не попасться :)
Как раз логика у них простая — XOR. Самое бесячее в USB_EPnR, то что они смешали в одном регистре вообще все способы доступа, которые смогли найти. В результате одни биты надо сохранить, другие обнулить, третьи выставить в 1, четвертые инвертировать а на пятые наплевать. А потом непонятно как все это тестировать. То есть оно не работает потому что ты лишний бит задел или потому что где-то в другом месте косяк.
Скажите мне, какой наркоман додумался в одном регистре

Это оставшиеся недокуренными остатки травы от писателей USB спецификации. Которая написана таким образом, что ее можно трактовать как угодно. Майкрософт прочитал и реализовал как понял. Или не понял. Я без анализатора разобраться не смог. Впрочем и с анализатором — тоже не очень.
ЗЫ спасибо за статью, оценки — они безликие… Может теперь напишу кейлоггер, с Вашим и своим кодом.
COKPOWEHEU
А отчего не использовали дма для обновления массивов? Только-что проверил, он прекрасно работает в этом режиме.
Не те задачи. На пересылке десятка байтов выигрыша от DMA почти не будет. Все равно ждать завершения. А ведь он тоже не на максимальной частоте камня работает, так что как бы хуже не стало.
Ну и не хотелось перегружать пример дополнительной логикой.
Вот доберусь до полноценного MSD, тогда может и займусь.
UPD: буферы конечных точек располагаются не в общей памяти, а в персональной размером всего 512 байт. Писатели даташита ST, вам что, лень было упомянуть об этом в соответствующем разделе?! Вам лень было добавить соответствующую константу в заголовочный файл?!
Sign up to leave a comment.

Articles