April 3rd, 2015

круть



Понравилось. Не то, чтоб совсем как-то оригинально, просто вполне добротно и в духе CBL, JMJ эпохи "Oxygen" и вообще.

worklog: немного злит

Копаясь в тыщах строк магического кода, должного реализовать USB Mass Storage класс, пытаюсь не впасть в уныние от его мутной сложности. Нагромождение функций, которые что-то делают. Что, зачем, почему так - х.з.

В общем, решил идти "снизу вверх" - не пришивать готовый пример, отказывающийся работать... лучшее, чем добился: дивайс распознаётся виндой, она видит ДВА накопителя (не два тома на одном контроллере, а как бы два отдельных контроллера), оба нулевого объёма и при попытке считать их параметры контроллер виснет в неизвестной точке - поймать её не удаётся ни отладчиком, ни вываливанием в консоль каких-либо диагностических сообщений (ибо непонятно, куда их надо вписать в этой лапше).

Попутно наталкиваюсь на интересные конструкции типа
(uint32_t)((uint32_t)~(RegisterContent))
Либо писал конченый параноик, ещё более параноидальный, чем я... либо кто-то, страдающий жесточайшей амнезией. Или одновременно.

Так вот, я решил сделать так: изучить этот грёбаный USB-модуль, чтобы иметь представление о том, как им управлять. Я не люблю "чёрные ящики", которые что-то делают...

Поэтому сижу и пишу, пишу, читаю, пишу снова. Там немного регистров, но нагромождение логики (аппаратной - под ними - и программной сверху) осознать очень нелегко - всё-таки я не програмер.

Официальная документация ;)

Столкнулся с тем, что "штатный" вариант описания регистров модуля FSMC не слишком-то удобен - он рассчитан под библиотечные функции, оборачивающие доступ к этим регистрам в свои вызовы... мне проще как-то напрямую биты выставлять, тем более что я уже знаю, чё да где.

Переписываю по-своему, унылая рутина. Читаю доку на чип, чтоб ни один бит конфигурации не пропустить. Вижу буквально следующее:
Bit 10 WRAPMOD: Wrapped burst mode support.
Defines whether the controller will or not split an AHB burst wrap access into two linear
accesses. Valid only when accessing memories in burst mode
0: Direct wrapped burst is not enabled (default after reset),
1: Direct wrapped burst is enabled.
Note: This bit has no effect as the CPU and DMA cannot generate wrapping burst
transfers
.


По-моему, это прекрасно. Не ошибка, не фича, а просто хорошо описанный бит, который никакого функционала не несёт... зато его можно переключить!

Collapse )