Ізолятор USB

Раптом знадобилося аж три ізолятори USB.

Ну як сказати «знадобилося». От так щоб треба, так два.
Один для адаптера SWD на FT2232D, який підключався до мікроконтролера за гальванорозв’язкою, другий для клона Saleale logic analyzer, від якого декілька ліній туди ж.
Мікроконтролер на цій стороні, його virtual com port, я теж підключив через ізолятор про всік випадок. Бо вдома таки знайшлося три 🙂

Ізолятори USB

Ліворуч і в центрі з алі-експреса, були приблизно в одну ціну.
Той, що у центрі — з танталовими конденсаторами 22 мкФ і феритовими фільтрами. І з перемикачам режиму 1.5Mbps/12Mbps. І був без корпуса, у трубку я його сам затягнув.
Той, що ліворуч — без феритових фільтрів, зі звичайними електролітами, але із захистом від статики на вході і виході.
Ну а праворуч — зроблений самостійно кількома роками раніше. І з фільтрами, і з захистом від статики 🙂

Saleale logic через ізолятор працював, але чомусь верхню межу частоти семплів відразу поставив 500 кГц, я все ж таки очікував 1 МГц. А взагалі требе зробити нормальну розв’язку до аналізатора, можливо відразу на швидкому ADuM1400C чи подібному, бо часом і десять мегагерц мало. Хоча в цій задачі і один було б з головою.

Та й розв’язаний SWD не завадить, причому швидкий, але це вже складніше/дорожче.

Патч клона ST-Link

Колись я вже жалівся, що китайський клон ST-Link v2 не має виходу RESET для STM32.

Дещо пізніше від автора цього чудового перехідника між клоном ST-Link, стандартним 20-контактним з’єднувачем JTAG, однорядними штирями STM32FxDiscovery і платкою BluePill (+ ще щось, що мене наразі не цікавить), я дізнався, що клон ST-Link можна підправити.

Потрібні сигнали проcто не виведені на штирі. Якщо підтримка STM8 непотрібна, можна штирі SWIM і RESET (STM8) відрізати від сигналів, а туди вивести SWO і RESET (STM32). На сторінці проекту написано, які виводи мікроконтролера слід під’єднати до штирів.

Після ознайомлення я навіть знаходив якийсь допис з рекомендаціями-фотографіями по такому виправленню. Після відрізання доріжок від штирів RESET і SWO автор на їхні кінчики напаяв 22-омні резистори, а вже до них припаяв дротики.

Коли я зрештою сів паяти, я помітив, що можна все зробити простіше. На нижній стороні плати зняти резистори R7 і R8, які приєднують до штирів виходи, перерізати доріжки, що йдуть до ближніх до резисторної збірки кінців цих резисторів (червоні позначки на фото), а тоді припаяти дротики до контактних майданчиків цих резисторів. На штирі сигнали потраплять через резистори зі збірки.

Модифікація клона ST-Link v2, нижня сторона

Модифікація клона ST-Link v2, верхня сторона

CLRS

Ми це зробили. «Вступ до алгоритмів» Кормена та компанії, відомий як CLRS, вийшов друком українською мовою.

Перекласти ці 1200 сторінок, вичитати, висперечатися щодо формулювань — вечорами та на вихідних — було непросто і робилося це довго.
Але книжку вже надрукували.
Докладніше на сторінці у Facebook facebook.com/clrs.uk

Обкладинка українського видання Вступ до алгоритмів / Томас Кормен, Чарльз Лейзерсон, Рональд Рівест і Кліфорд Стайн

patch зі сторінки github

Може вже всі це знають, але для мене було новиною.

Маючи посилання на diff-сторінку на github-і, можна легко отримати format-patch цих змін.
Досить лише додати .patch в кінці посилання.

Наприклад, така сторінка перегляду змін
https://github.com/ivkos/hostap-force-ht40/commit/004876e562b310d85ffab0f1d671b7a51ff0ce51
І отак отримуємо format-patch
https://github.com/ivkos/hostap-force-ht40/commit/004876e562b310d85ffab0f1d671b7a51ff0ce51.patch

p.s. Вже не можу знову знайти сторінку, де про це прочитав, тому без посилання.

OpenOCD — виправлено помилку в команді stm32f1x unlock

Щось останнім часом я практично лише про помилки і пишу. Але тут поруч з поганою новиною є і хороша.

Ще десь перед новим роком виявив біду — у найсвіжішому на той час OpenOCD команда stm32f1x unlock захист зчитування наче знімає, але по тому записати у мікроконтролер нічого не вдається.

На щастя, у мене десь лежала перевірена версія, зібрав її, встановив і все пішло. Вже десь у січні підключився до OpenOCD через telnet, потикався різними командами і з’ясував, що в усі option bytes (окрім readout protection) записані випадкові значення, тобто на довільні сектори flash-пам’яті було встановлено захист від запису, а також попсовано опції SW/HW WDT і інші.

І оце лише на минулому тижні розібрався. Драйвер stm32f1x використовується для роботи з stm32f10x, stm32f0xx, stm32f3xx, але біда лише з stm32f10x. З’ясувалося, що в них захист від зчитування поширюється і на область флеш-пам’яті для блоку опцій. Для двох інших згаданих лінійок цього нема, у документації в табличках окремо відзначено можливість такого зчитування (при захисті з рівнем L1). Можливо, саме тому в коді зчитування опцій з регістрів FLASH_OBR і FLASH_WRPR замінили зчитуванням безпосередньо з адрес 0x1ffff800..0x1ffff80f.

Процедура unlock перед стиранням опцій зчитує їхні значення, щоб під час запису коду дозволу зчитування відновити те, що було. Але ж доступу нема, OpenOCD доповідав, що прочитати не може і йшов далі. Тобто записував випадкові значення, які на той час були у неініціалізованій структурі.

Відповідно, ремонт простий — повернутися до зчитування з регістрів. Зараз патч лежить на узгодженні в їхньому gerrit-і, а я вже користуюся виправленим 🙂

20 років avreal

Отак багато часу пройшло. Весь 2018 рік — рік 20-річчя програми avreal, назва якої утворена дуже просто, як комбінація AVR і ReAl. І деякий час пошук по слову avreal видавав лише обговорення на інтернет-форумах або мій сайт, і лише потім почав вважати це помилкою набору і видавати «якусь співачку» 🙂

Писати я його почав влітку 1998 року, під час роботи над реальним проектом з AT90S8515.
До того лише трохи «грався для себе» і для того мені вистачало PIP04, був для Windows такий попередник PonyProg-а. Але для реальної щоденної роботи возити мишкою мені було незручно, хотілося інструмента, якого можна запхати у makefile і викликати з редактора. Тобто потрібна була утилітка командного рядка. Здається, тоді вже існував лінуксовий uisp, але на лінукс я перейшов кількома роками пізніше. Для MS DOS знайшлася лише (підказали в RU.EMBEDDED) програма fbprg. Та з’ясувалося, що вона хоч і «command line», але страшенно незручна.

От тоді й всівся за своє. Паралельно із робочим проектом, продовжуючи в ньому використовувати fbprg. Саме тому перший адаптер, який підтримував avreal, був той fbprg, а LPT за умовачанням використовувався другий, бо на першому був принтер.

Зрештою, воно більш-менш впевнено запрацювало, хтось із знайомих (Євген Краштан?) перевірив на 90s1200 і 90s2313, знайшов декілька помилок, надав парочку 90s1200 із запоротим DevID для експериментів. Таке ж саме запитання — «де знайти програматор AVR, який добре вбудовується в ланцюжок make і компіляторів командного рядка» — виникало в RU.EMBBEDED і SU.HARDW.SCHEMES, на початку вересня 1998 року я запропонував свою програму.

Так і пішло. Фактично, навіть сайт я завів, ще на LuckyNet, для розміщення нових версій та опису, у щось блогоподібне воно перетворилося набагато пізніше, десь ближче до 10-річчя програми.

З часом додавалися інші адаптери (спочатку Altera ByteBlaster, бо працював тоді з альтерівськими PLD і цей адаптер був і вдома, і на кожному столі на роботі, затим за компанію Xilinx Download Cable, а тоді просто можливість задати довільну конфігурацію).
З Win98 на роботі перейшли на WinNT — з’явилася win-версія (через DLPortIO, який на роботі ж використовувався для іншого). Сам я перейшов на Linux — от вам лінуксова версія. Попросили FreeBSD — зробив, але реально його окрім прохача майже ніхто не використовував, та й для нього з часом стало неактуально. Тому ця версія трохи «недорізаною» тяглася, туди нові можливості додавалися лише ті, які «само собою» починали працювати. Пізніше я зовсім відмовився від підтримки.

З’явилися мікросхеми FTDI з MPSSE, тобто апаратним JTAG/SPI, відповідно, в avreal з’явилася можливість працювати через USB. Для USB були ще геть недорогі адаптери з soft-USB, зокрема, з емуляцією COM-порта і AVR910. Але вони були повільні, відчутно повільніші за PCI-LPT карту, не набагато швидші за звичайний LPT. Згодом і звичайні, і PCI-LPT почали уповільнюватися, але то інша історія.

І от так потихеньку і пройшло 20 років.

Ще наприкінці минулого року я згадав про дату, чесно 🙂 тоді хотів щось дописати в avreal. Але трапилася одна справа, в яку я вклав весь свій вільний час. У травні цього року звільнився з роботи. Не заради дописування avreal, звісно, але початково були плани протягом літа завершити свою частину тієї справи, роззирнутися, відіспатися, почитати чогось корисного, а восени шукати нову роботу. Та не так сталося, як гадалося — в кінці липня вже була нова робота з купою нової інформації, яку слід перетравити і засвоїти.
Навіть згадана справа пригальмувалася, все інше відклалося.

Тому, на жаль, на рік 20-річчя сам avreal не отримав ніяких подарунків у вигляді якихось нових можливостей, але в результаті змін у житті я познайомився з кількома чудовими людьми, які «в молодості» використовували avreal 🙂 І відновив контакт з кількома такими ж, яких знав раніше.

p.s. Мене заспокоюють, що «справжня зрілість» це 21 рік. І що до наступної осені я ще можу щось встигнути.

cstdint, arm-none-eabi- та Ubuntu

Міняв диск, заразом поміняв і Убунту 16.04 на 18.10. Як і минулого разу на шістнадцятій, поставив «рідний» для системи пакет arm-none-eabi-. Мабуть, пора закінчувати з такою практикою, всістися на якусь іншу збірку компілятора, ту ж linaro. Бо проекти перестали збиратися. І на чому, на рівному місці! Компілятор не знаходить файл cstdint.

Короткий пошук показав, що версія компілятора 6.3.1, include-файли лежать в /usr/lib/gcc/arm-none-eabi/6.3.1/include та в /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/include, який, зрештою, вказує на /usr/include/newlib.

А от заголовочні файли C++ лежать в /usr/include/newlib/с++/7.3.1. Звідки взялася сімка — важко сказати. Може це одрук, може дійсно поклали іншу версію, але жодного файлу від C++ cpp не знаходить. Назву 7.3.1 вирішив не чіпати, просто поруч додав лінк 6.3.1->7.3.1. Після цього cpp по -v показав додаткові шляхи до файлів і все стало збиратися.

A Programmer’s Love Song

Неприємна помилка в Doxygen 1.8.11

Зазвичай я не поспішаю переповзати на нову версію Ubuntu і досі сиджу в Ubuntu Mate 16.04. І я не один такий, на роботі також 16.04 (тільки не Mate, а «звичайна», зі стільницею Unity).
І от на роботі ж і виловив помилку в Doxygen, який в убунті 16.04 стоїть версії 1.8.11. Заманулося отримати для перегляду дерева викликів, CALL_GRAPH і CALLER_GRAPH, щоб швидше ознайомитися зі структурою чужого коду. А отримав страшну кашу з довгими циклічними петлями викликів. Виявилося, що всі функції, прототипи яких описано в .h-файлі безпосередньо під inline-функцією, вважаються такими, що викликані з цієї inline-функції.
Мінімальний приклад, doxy-bug.{h,c}:

static inline foo(void) { }

void moo(void);
#include <doxy-bug.h>

void moo(void)
{
    foo();
}

Doxygen 1.8.11 генерує для inline-функції foo() такий граф викликів

Wrong call graph (doxygen 1.8.11)

а для moo() взагалі отакий:
Wrong call graph (doxygen 1.8.11)

Уявляєте, що я отримав на дереві з кількох каталогів і сотень функцій, а в h-файлах під inline-функцією може бути описано декілька прототипів, всі з яких стають «викликаними» з неї? Оскільки всі ці функції викликали ще у глибину на декілька рівнів статичні функції всередині своїх файлів, а вже ті викликали ці inline-операції, утворювалося багато довгих петель.

На щастя, у свіжій версії Doxygen 1.8.15 цю помилку виправлено. Все красиво:
Correct call graph (doxygen 1.8.15)

Переставлю тепер doxygen і на роботі, буде легше.

Linux Kernel під Creedence Clearwater Revival

Сьогодні над CLRS сиділося під Creedence Clearwater Revival.
Але ж у голові паралельно й інше крутиться, то вийшло:

Oh Working Queue, oh Waiting Queue
And IRQ, how I love you, all IRQ
I like the way you walk
I like the way you talk
I like all your spinlocks
 but hate if you deadlock, All Linux *Q*

Well, say that you’ll be hard
Well, say that you’ll be soft
Well, say that you’ll work fine
 and never give me pain, oh IRQ

Well, say that you’ll be mine
Well, say that you’ll be mine,
Well, say that you’ll works fine,
 works all the time, my Working Queue

Oh Working Queue, oh Waiting Queue
And IRQ, how I love you, all IRQ

I like the fast top half
I like the bottom half
I like the user space
I like the user space, oh Working Queue

Oh Working Queue, oh Waiting Queue
And IRQ, how I love you, all IRQ

© моє

[flagcounter image]