Локализация прошивки Anycubic Photon S

259

Русифицированная прошивка для Anycubic Photon S. Неофициальная!

Если Вы хотели, чтобы Ваш Фотон-С заговорил по-русски, то теперь Вы можете заставить его сделать это 🙂 В конце статьи — ссылка на русскую прошивку.

Я буду очень благодарен любым отзывам от тех кто прошьет и попробует ее 🙂 Так же с удовольствием обсужу любые разумные предложения по изменению прошивки 🙂

Две недели назад я от нечего делать подумал о том, чтобы было бы неплохо перевести на русский язык фоновые картинки, на которых нарисованы все меню. А может быть и вообще изменить дизайн интерфейса (хотя меня и оригинальный устраивает). Посмотрел внимательнее те два файла, что идут в составе прошивки (которые нужно поочередно прошивать, запуская их на принтере «в печать»). Оказалось, что один из них — это и есть сборник изображений и чего-то еще. Большую часть объема его почти 8 мегабайт занимают фоновые картинки, на которых изображены рабочие экраны для разных ситуаций. На них прямо нарисованы все меню и статичные надписи. Причем они там в двух экземплярах — с английскими надписями и с китайскими. Еще немалую часть файла занимают изображения нескольких тысяч китайских иероглифов. И около полутора мегабайт там отводится под какие-то непонятные данные.

Формат и положение картинок я выяснил сначала опытным путем, а позже подтвердил его с помощью графического редактора GIMP. Ну и раз все оказалось так просто, то я начал делать утилитку для извлечения картинок из этого файла ресурсов и заливки их обратно после изменений:

Однако, в процессе захотелось попробовать русифицировать еще и все сообщения, появляющиеся в процессе работы принтера. Идея изначально была в том, чтобы найти латинский шрифт и заменить в нем латинницу на кириллицу. Однако в этом файле ресурсов я такой шрифт не нашел, и тогда решил внимательнее взглянуть на второй файл прошивки, в котором хранится код для микроконтроллера. К моему (небольшому) удивлению, этот файл не был ни зашифрован, ни хоть как-то защищен от повреждений — никакой контрольной суммы или чего-то в этом роде. Обычный бинарник, который напрямую прошивается в микроконтроллер 🙂

И в этом файле я нашел нужный шрифт. А еще я нашел там опять несколько тысяч китайских иероглифов. Это просто мрак — они занимают в прошивке 270 кб из общих 400! Ну ок, раз все опять так просто, то через час у меня уже был набросок кириллического шрифта, который я, не долго думая, и вставил в прошивку вместо английского. Меня в первую очередь интересовало что будет вообще — выведет ли принтер хоть что-то в надписях, и если да, что что именно 🙂

Однако… После прошивки этого измененного варианта принтер не ожил. Вообще никаких признаков жизни. Я почти сразу нашел причину — в прошивку вместе с новым шрифтом вставился лишний байт и все относительные ссылки на функции и константы внутри прошивки полетели к чертям.

Ну что делать, остается только разобрать его и попробовать подключить внутрисхемный отладчик и программатор. Но если производитель лочит микроконтроллер от чтения, то ничего уже не сделать даже с программатором. Объясню почему. Это вот обновление прошивки записывается в часть памяти микроконтроллера, а еще часть его памяти содержит в себе бутлоадер, который, собственно, и занимается записью обновления внутрь микроконтроллера. А кроме того, с него еще и происходит старт всей прошивки. Если микроконтроллер залочен от чтения, то с ним ничего нельзя сделать (ни прочесть, ни записать) пока не будет выполнено полное стирание всей памяти. То есть при этом грохнется и бутлоадер, а его у меня нет и восстановить его я не смогу. Принтер останется кирпичом.

В общем, разобрал, взял плату с дисплеем и подключил к отладчику:

Добрые китайцы даже любезно оставили разъем для отладчика 🙂 Правда, поленились надписать назначение выводов на нем…

К счастью, оказалось, что китайцы контроллер не лочат и он замечательно читается и пишется отладчиком 🙂 Я этим сразу же воспользовался и первым делом слил с него полный образ, включая бутлоадер. Так что теперь мне не грозила потеря работоспособности принтера ни при каком раскладе, я всегда мог восстановить его в изначальное состояние 🙂

Ну а раз плата на столе, подключена к отладчику, а прошивка в открытом виде, то почему бы не попробовать поковырять ее дизассемблером и не попытаться сделать перевод более цивилизованными методами? 🙂

Заодно решил посмотреть как покажет себя дизассемблер от американских спецслужб — программа Ghidra, разработанная в АНБ. Не так давно их заставили раскулачиться и выложить исходники многих внутренних инструментов, в том числе и этого дизассемблера. Оказалось, что программа выше всяческих похвал, работает прекрасно 🙂

Вообще, я уже лет 20-25 как отошел от ассемблеров, а дизассемблерами и вообще пользовался всего несколько раз. Но помогло не до конца забытое знание основ ассемблера и знание архитектуры этих микроконтроллеров. Процесс со скрежетом, но пошел. Начал потихоньку опознавать отдельные участки кода как имеющие определенный смысл. Ну, к примеру «О, это же отправка данных через SPI». Или «А это похоже на копирование строки». И т.д. Вообще, это похоже на распутывание клубка — главное найти кончик нити, зацепиться за что-то. Опознав назначение одной функции уже можно с довольно большой вероятностью предположить назначение тех функций, которые ее вызывают. И так, цепляясь за эти «нити», можно продолжать распутывать код 🙂 Но все равно это довольно сложно и утомительно, особенно не имея никакого опыта в таком деле.

Однако, в конечном итоге, у меня оказалась уже достаточно распутанная прошивка, чтобы я начал понимать как текст выводится на экран, откуда берутся шрифты, как обрабатываются нажатия на экран и т.д. То есть у меня было уже более чем достаточно информации, чтобы сделать нормальный перевод. Хотелок уже было гораздо больше, чем изначально, и была возможность воплотить их в рабочий вариант 🙂

Примерный список хотелок стал таким:

1) Поддержка нескольких языков, а не только двух.

2) Тексты в кодировке UTF-8.

3) Простота добавления и изменения текстов.

4) Простота добавления переводов на новые языки.

5) Корректное отображение файлов с названиями на кириллице.

6) Простота внедрения всех этих хотелок в прошивку.

7) Использование пропорциональных шрифтов (в которых, например, буква «т» занимает меньше места, чем «щ»). Желательно с полупрозрачным сглаживанием.

Кстати, многие из этих пунктов были подсказаны SergeyR7 в комментариях к заметке в моем дневнике.

Пункт 1. Решился достаточно просто — я написал свою функцию изменения текущего языка и подменил ею родную. Теперь я сам могу определять сколько языков будет доступно при переключении из меню. Ну, правда, их не может быть больше 256, но этого должно хватить :))

Пункт 2. Тоже решено путем подмены родных функций вывода текста (их там в родной прошивке 4 или 5 разных). К ним я добавил перекодировку из UTF-8 в позицию символа в шрифте, все просто 🙂

Пункты 3 и 4. Я не стал просто вписывать перевод на место родных текстов в прошивке, а написал свою функцию для выбора нужного текста. Вместо родных текстов в прошивке я проставил номера и перенаправил оригинальную функцию вывода текста на свою. Теперь в мою функцию приходит не текст, а номер нужного текста и она по этому номеру выбирает нужный текст из таблицы, соответствующей текущему языку. Таким образом все тексты получились собраны в один компактный массив, причем отдельный для каждого языка:

Нужен еще один язык? Просто добавить еще один такой массив с соответствующим переводом 🙂 Ну, на самом деле чуть-чуть сложнее, но все равно очень просто 🙂 И при этом если где-то вдруг какой-то текст в оригинальной прошивке оказался забыт и вместо него не был подставлен номер, то выведется этот текст. 

Пункт 5. Вот с этим пришлось повозиться. Длинные имена файлов в FAT32 держатся в кодировке Unicode. В оригинальной прошивке считается по умолчанию, что если код символа в названии файла больше 127, то это китайский язык и никаких вариантов. И вот эта проверка и перекодировка из юникода в китайский язык была закопана очень глубоко, я долго не мог найти ее. Вот текст еще в юникоде, а в следующее мгновенье он уже в китайской кодировке. Но все-таки нашел и перенаправил оттуда на свою функцию, которая нормально переводит из Unicode в UTF-8. Аллилуйя! 🙂

Пункт 6. Я очень давно ушел от ассемблера и возвращаться к нему не имею никакого желания. Вписывать в прошивку что-то столь объемное по коду и данным кодами или мнемониками ассемблера — полнейшее извращение 🙂 Поэтому я настроил в нормальной среде программирования линкер на нужные адреса, заставил его формировать только чистый код, написанный мною, без всяких библиотек и стартовых инициализаций, прописал в нем адреса оригинальных функций прошивки, которые используются в моих собственных функциях, и написание дополнений к прошивке теперь одно удовольствие 🙂 Вот, например, моя функция вывода текста:

Простой привычный Си без всяких заморочек. Красота 🙂

Пункт 7. Просто еще не добрался до этого. Хотя у меня есть написанная мною библиотека для работы с пропорциональными шрифтами и со сглаживанием, но просто руки еще не дошли внедрить ее 🙂

Однако, пока еще не все, что я задумал, реализовано. Например, тексты на несколько языков перевести — уже сейчас не вопрос, делается легко и очень быстро. А вот с фоновыми картинками, на которых и нарисованы все меню, пока проблема. Их в памяти всего два набора — для двух языков. Я уже подумал как можно это решить и при этом даже сэкономить место в памяти, но еще не реализовал.

Второй момент, который тоже хотелось бы реализовать — это простое изменение положения активных и информационных элементов на экране (кнопки, данные). Чтобы можно было нарисовать любой свой дизайн и указать координаты кнопок на каждом экране. Сейчас придется заменять их по всей прошивке, а хотелось бы, чтобы это было как сейчас с текстами — в одной компактной таблице.

Ну и третий момент — новый код вставляется в прошивку вместо шрифта с китайскими иероглифами. Так что хотя я и постарался сохранить возможность работы принтера с китайским языком (а для этого пришлось приложить усилия), но некоторые иероглифы уже оказались затертыми новым кодом. Нужно выводить китайские надписи тем шрифтом, который хранится во внешней флешке (вместе с фоновыми рисунками), но пока и это не сделано 🙂

Но в принципе, перевод на русский язык на настоящий момент выполнен полностью и эта русифицированная прошивка доступна для скачивания — https://drive.google.com/open?id=11nA3cPoeMGfrhCx8-TTF-o-QMbG-rkJ0

Прошивать стандартно, как и родную: на пустую (а лучше на всякий случай отформатированную) флэшку в корень закинуть оба файла, вставить флэшку в принтер и запустить на печать сначала файл P_V341ml01.bin . Принтер спросит подтверждение на прошивку, нужно согласиться и подождать окончания прошивки. После этого принтер перезагрузится. Теперь запустить на печать файл P_UI_2_6ml01.bin . Так же согласиться на прошивку UI и подождать около полуминуты пока прошивка завершится. После этого файла принтер не будет перезагружаться, это нормально. Все готово, можно пользоваться.

Вот короткий ролик с демонстрацией:

Ссылка на источник

Читайте также

1 КОММЕНТАРИЙ

  1. Хотелось-бы исходники от платы, лежит от клиентов пару кирпичей, было бы не плохо их оживить, а рабочей нет с чего слить можно. Буду благодарен.

ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here
Перетащите ползунок, чтобы вставить комментарий