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

AndyBig
Идет загрузка
Загрузка
14.09.2019
1191
11
печатает на Anet A8
Техничка

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

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

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

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

Русифицированная прошивка для 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 и подождать около полуминуты пока прошивка завершится. После этого файла принтер не будет перезагружаться, это нормально. Все готово, можно пользоваться.

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

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

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

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

16
Комментарии к статье

Комментарии

14.09.2019 в 09:20
0

Отличная работа!

Всегда уважал работу программистов.

14.09.2019 в 14:24
0

Спасибо :) Хотя тут программистской работы было всего процентов 5, все остальное время занимало решение ребусов в дизассемблере :)

14.09.2019 в 09:59
0

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

14.09.2019 в 14:21
0

Да вроде это и так понятно :) Кроме "гарантийное обслуживание принтера может прекратиться" - оно в принципе не может прекратиться. Есть закрепленное законом понятие "срок гарантии", в течении которого производится бесплатное устранение заводских дефектов, и этот срок не снижается и не прекращается ни при каких условиях :)

14.09.2019 в 15:27
0

что за заблуждение? В гарантии обычно прописано "если не производились изменения конструкции, по и тд..." - а тут поставщик вправе отказать.

14.09.2019 в 15:44
0

Это не заблуждение, а закон о защите прав потребителя :) В этом законе не предусмотрено сокращение или отмена гарантийного срока. Его можно только увеличить :)

14.09.2019 в 18:26
0

Статья 18. П.6

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

14.09.2019 в 21:31
1

Вот именно :) И никаких "лишаем гарантии" :) Вот если он докажет, что, например, матрица перестала работать из-за прошивки - тогда производитель вправе отказать в бесплатной замене матрицы. Но никаких общих лишений гарантии.

14.09.2019 в 23:05
0

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

15.09.2019 в 02:33
0

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

15.09.2019 в 04:51
4

Сегодня поковырялся немного с прошивкой и добился почти пятикратного ускорения вывода фоновых картинок на экран :) Родным способом они выводились за 0.13 секунды, после переделки выводятся за 0.03 секунды :)


Для написания комментариев, пожалуйста, авторизуйтесь.

Читайте в блогах

Самое бюджетное решение выключения принтера программной кнопкой (Автовыключение после печати)

PARAVAN и BigRep: Новый тип рычагов управления

Фигурка ко дню строителя.

Сглаживаем слои на модели! Как лучше подружить ABS с ацетоном: холодная, горячая баня или кисть?

Печатаем со сверхзвуковыми скоростями. 100мм/с, 200мм/с, 300 мм/с, .... 750 мм/с не предел !!!

Мышка. Символ 2020 года по китайскому календарю