Ninebot – цепляемся к камню! Т.е. внутрисхемно прошиваем Ninebot One S2 и не только ;-)

Штатная клиентская софтина (взаимодействующая с моноколесом по  Bluetooth LE) позволяет обновлять программное обеспечение («прошивку») контроллера моноколеса Ninebot S2 лишь в сторону повышения версии и лишь на ту, которая является в настоящий момент последней. В идеальном случае этого, вроде бы как и достаточно для неискушенного пользователя ... И обновление с версии 1.0.1 до 1.0.4 было весьма полезным (о чем я когда-то писал). Но понимая безвозвратную систему обновлений, и будучи в целом довольным работой колеса с прошивкой 1.0.4 обновляться без вразумительного понимания цели на вышедшую после значительного перерыва 1.0.5 не хотелось … А после 1.0.6 – я даже и перестал обращать внимание на содержимое предложений об обновлении – просто машинально отклоняю их до сих пор. Известно, что от добра – добра не ищут, а на просторах сети я так и не увидел вразумительного обоснования радужных перспектив дальнейшего (после 1.0.4) обновления. Понятно, что небольшой анонс новшеств к новой версии пишет сам производитель – но там ничего революционного или полезного. О том что порог остатка заряда аккумулятора при котором начинает существенно лимитироваться скорость расширен в новых версиях – читал. Интересно? Да. Но интересно и другое – с обновлением клиентской версии софтины на смартфоне этот лимит также может меняться (факт) – и в прошивке ли дело по данной части? Порог и без прошивки в последний год «возрос» (с 28% - где-то до 20%) ... Короче мной уже давно было принято решение не обновляться, пока не будет решен вопрос с откатом прошивки на предыдущую версию, а стало быть, и с предварительным резервным копированием текущей.

Когда занимался капремонтом моноколеса (еще осенью 2016-ого), необходимость в котором возникла по результатам эксперимента «на выносливость» (о чем отдельный материал) – обратил внимание и на модель контроллера (STM32F103RCT6 в корпусе LQFP64; документация на камень - cd00191185.pdf) и на не распаянные коннекторы в составе платы … Бегло ознакомился с дата-шитом, сфоткал плату и распаял один из них – а именно тот, на который выведен UART (читай COM-порт aka RS-232, разумеется низковольтный).

Почему его? – по не очень богатой, но все же, практике работы с контроллерами STM знаю, что в данных контроллерах присутствует «нестираемый» загрузчик, который позволяет шить контроллер «вдоль и поперек» именно через UART-интерфейс. Лишь позже обнаруживаю (изучая плату по фоткам) – что распаян контроллер на моноколесе так, что в режим загрузчика вогнать его не получится … Тема снова отложилась, ибо перспектива вновь разбирать моноколесо во время сезона (2017 года) – «так себе», а для распайки чего-нибудь еще, без этого было не обойтись.

В очередной раз вернулся мыслёй к дампингу и откату прошивки на моноколесе, в том числе, в свете практического «знакомства» с программаторами работающими с интерфейсами JTAG и SWD (на примере разных иных проектов). В очередной раз поднял прошлогодние  фотки «потрохов» найнбота и с радостью обнаружил, что не распаянным остался как раз нужный мне для решения поставленной задачи интерфейс SWD. Да, здорово что разработчик так дружественно по отношению к пользователю (или к себе?) развел на плате интерфейсы для внутрисхемного программирования контроллера (SWD) и мониторинга его работы (UART, т.к. больше в рамках реализованной распайки заюзать его не для чего). Но даже такое радостное открытие во время очередного сезона (2018 года) …

И вот сейчас в межсезонье мой Ninebot S2 заслужил не только чистку и обследование степени износа после более чем 1000км пробега с момента капремонта – но и … короче покопаться с прошивкой как нельзя кстати.

Распаиваем интерфейс SWD.

Все вполне штатно – по аналогии с опытом распайки UART: впаиваем коннектор, отрываем нужное количество проводов (3шт.) от «косы» (аксессуар к ардуине), обрезаем и обжимаем их под соответствующую ответную часть к впаянному коннектору (разъем аналогичен применяемым в компьютерных пропеллерах – был выбран благодаря наличию фиксатора).

Распиновка для SWD получается такая:

T26 - GND
T25 – Pin49 – PA14 - JTCK-SWCLK
T24 – Pin46 – PA13 - JTMS-SWDIO

Для UART получается такая:

T29 - GND
T6 TX – Pin29 - I2C2_SCL/USART3_TX
T5 RX – Pin30 - I2C2_SDA/USART3_RX

Впоследствии будет выведен наружу (в батарейный отсек, свободный от проводки двигателя) …

Пока же юзабельность получившегося решения можно проверить и в «наколенном» варианте.

Считываем прошивку Ninebot S2 через SWD.

Интерфейс SWD (Serial Wire Debug) – интерфейс внутрисхемного программирования, соответственно запитываться целевое устройство должно штатным образом, т.е. в нашем случае от аккумулятора. И вовсе ничего критичного в том, что к плате у нас не подключены ни двигатель, ни датчики, ни светодиоды, ни прочие … Включить устройство (вместо кнопки) поможет кратковременно замыкание ее контактов (2pin с узкой стороны, где транзисторные ключи).

В качестве программатора (донгла интерфейса USB-SWD) используем специально приобретенный китайский совместимый клон … вобщем не суть чего «клон» – главное, что он совместим с софтиной J-Link/J-Flash (разумеется, не последней версии, а немножко древней 4.86).

Софтина J-Flash предлагает обновить в программаторе прошивку: делать это как минимум бесполезно, как максимум вредно, а в целом без необходимости (отказываться придется впоследствии неоднократно). Переходим к активным действиям. Выставляем конфигурацию (многое менять не требуется) – основное: выбираем наш трехпроводный интерфейс SWD и модель контроллера (справочно – см. скриншоты).

Коннектимся к контролеру (Target -> Connect) и сливаем дамп прошивки (Target -> Read back -> Entire chip) с последующим сохранением ее в файл (File -> Save data file as). Формат файла *.bin

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

Все просто? Более чем! Был удивлен, что некоторые перцы на просторах сети в порыве творческих изысканий просто адово-варварским способом тянут и распаивают на плате найбота лишние провода, городят не нужный огород – наверное, от «богатства» своих познаний. А фантазировать ничего не нужно! Нужно просто заюзать то, что заложено разработчиками найбота!

Возврат к сохранённой резервной копии происходит аналогично, можно что-нибудь подправить прямо в окне дампа J-Flash (например, километраж пробега). Пункт меню Target -> Program (F5) - записывает содержимое активного окна в контроллер, предварительно очистив его.

Не забываем возвращать контроллер после работы с ним через SWD в режим функционирования, а для этого вовсе не обязательно его ребутать передергиванием питания ;-))  В J-Flash выбираем Target -> Start application (F9) – запустить приложение. Интересно, что при описанном алгоритме прошивки связь через BLE с мобильным телефоном, на время прошивки и после, не теряется.

MiGeRA (январь 2019)

Дополнение: Прошиваем Ninebot Z10 (бэкапим, патчим или откатываем прошивку).

В новой «Z»-серии Найнбов все настолько идентично и аналогично описанному выше, что смысла делать отдельный материал нет. Недавно, наконец-таки появилась новая прошивка к моей Зетке – 1.0.7 (вместо заводской 1.0.5). Зетка очень «френдли» к разборке: все на болтах, никаких защелок – более того требуется всего лишь одна отвертка-звездочка T10. Ninebot Z10 построен на таком же контроллере как и Ninebot S2 - STM32F103RCT6 (разработчики не стали фантазировать), также как и прежде присутствует разведенный интерфейс SWD – вобщем смотришь на плату нового колеса – и все до такой степени знакомо … Думаю фотка излишня, но тем кто еще не открывал свое моноколесо, возможно пригодится (чтоб убедиться что все не просто «просто», а очень «просто»).

Для разовой операции чтения-записи можно не запаивать никакой разъем, просто вставить штыревой коннектор в отверстия. В этом случае правую сторону моноколеса открывать (чтоб отключить аккумуляторную батарею) не потребуется. Коннектим донгл j-link к выключенному моноколесу, включаем штатной кнопкой и работаем (см. выше, даже профиль настроек подходит), по завершении работы не забываем выполнить: «Target -> Start application (F9)» (без этого нужно передергивать питание).

PS В Зетке потрясающе много внутри места, есть куда разместить дополнительную электронику, так что j-link + банана ждут моего свободного времени …

MiGeRA (май 2019)

Заглавная » Разное » Прошиваем Ninebot One S2 и Ninebot One Z10