Металл2024 Реклама
Метобр2024 Реклама

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

AndyBig
Идет загрузка
Загрузка
14.09.2019
5554
14
Техничка

Подпишитесь на автора

Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.

Отписаться от уведомлений вы всегда сможете в профиле автора.

19
Статья относится к принтерам:
Anycubic Photon S

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Подпишитесь на автора

Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.

Отписаться от уведомлений вы всегда сможете в профиле автора.

19
Комментарии к статье
Кремень КБ Реклама
Кремень КМ Реклама