Как я запустил Doom на дешевом кнопочном телефоне +136


Начну с конца и покажу результат:

За что этот телефон так наказан...

Минутка анти-рекламы, это F+ F256. Каждый месяц отправляет платное СМС на номер 4446. Судя по прошивке текст сообщения "ccor 75#nonet". Также появлялись странные подписки с ежедневным списанием. СMC не сохраняется на телефоне и видно только на детализации расходов. Хотелось бы услышать от F+ объяснений, как же так получилось, и что это больше не повторится (и не происходит с другими моделями, а F256 уже нет в продаже).

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

Что за зверь внутри?

В данном телефоне используется чип SC6531E китайской компании Spreadtrum Communications, которая после объединения с компанией RDA Microelectronics сменила название на Unisoc.

Это процессор ARM926EJ-S частотой 208 МГц, архитектура процессора armv5tej. Младшая ARM архитектура, отличается отсутствием возможности чтения невыровненных данных, нет деления, нет SIMD операций, нет операций с плавающей точкой.

Установлено 4 мегабайта флэш памяти, большая часть занята прошивкой, остальное используется для сохранения настроек, номеров и СМС. Также осталось место на раздел FAT12 размером... 78.8 килобайт (влезает ровно один снимок с камеры, качество которой ужасное).

Также есть 4 мегабайта оперативной памяти.

мб Мб МБ...

Может быть найдутся те, кто мне возразит, но я воспринимаю сокращение из букв М и Б только как мегабайт, большинство же брендов таких телефонов (как и продавцов), пишет объёмы памяти в мегабитах, подписывая это МБ/Мб. Считаю это введением в заблуждение, если пишете про мегабиты, то будьте добры подписывать "Мбит". За что нередко получают негативные отзывы от покупателей, что ожидали там больше памяти.

Как дошло до Doom

Сначала я лишь хотел сделать дамп прошивки и заглянуть в неё. Так как я использую Linux, а большинство инструментов для прошивки сделано только для Windows, и на виртуальной машине эти инструменты не заработали, то я написал свой опенсорсный дампер прошивки для Linux.

Так как в процессе я узнал как работать с USB на этом устройстве, то решил приспособить его в качестве игрушки для запуска своего кода, в отличие от простых плат разработки - тут сразу есть корпус, много кнопок, экран, батарейка, динамик, Bluetooth, карта памяти, радио. И много дешевле выходит. Единственный очень серьёзный минус - нет никакой открытой информации о том, как этим пользоваться. Это можно узнать только анализом прошивки и опытным путём.

Doom знаковая игра и имеет достаточно простой для портирования код, поэтому часто используется для запуска на различных устройствах, чтобы показать своё мастерство и возможности устройства. Решил попробовать то же самое.

А еще железо может потянуть эмулятор NES (про SNES не уверен).

Что получилось

Нашел управление:

  1. USB - правда лишь медленный 1.1.

  2. LCD панель - имеет собственный 16-бит номер и интерфейс, для одной модели телефона могут использоваться разные LCD панели, команды управления которых могут отличаться.

  3. LCDC - контроллер LCD, выполняет функцию акселератора 2D графики, без него изображение придётся передавать попиксельно, тратя на это время процессора.

  4. Системный таймер - на SC6531E точность таймера 1мс.

  5. Клавиши - кроме клавиши питания (она же повесить трубку), видимо имеет свой интерфейс.

  6. Подсветка экрана - могу включать и изменять яркость.

  7. MMU - устройство управления памятью, нужно чтобы включить кэш данных.

Что не нашел (и не пытался): звук, MicroSD карта, Bluetooth, микрофон, радио, SIM карты.

Для загрузки данных игры написал программу сервер, что читает файлы по запросу кода на телефоне и передаёт по USB. Сам код игры загружается через USB прямо в память, прошивка не перезаписывается. ОС из прошивки не запускается.

Первую стадию запуска, где есть код для управления USB - уже выложил на GitHub. Остальное планирую переписать более чисто и выкладывать частями. Но сначала проверить еще на нескольких телефонах на том же чипсете.

Размер необходимого бинарного кода ~250кб (ARM thumb с опциями -Os/-Oz), четыре 8-бит и один 16-бит фреймбуферы размером 320x200. Для игровых данных осталось лишь 3 мегабайта. Вместо шести в оригинальном коде, на удивление всё работает, но возможно для каких-то больших уровней этого не хватит.

Добавил клавиши для переключения оружия на предыдущее/следующее, чего в оригинале не было. Слишком мало клавиш чтобы использовать семь только для переключения оружия.

Скорость работы игры ~19 FPS (из максимальных 35).

Обновление: Исправил ошибку в заполнении MMU таблиц, из-за которой кэшировался только 1-й мегабайт памяти из 4-х. После исправления стало 35 FPS (могло быть 38, если бы не ограничения игры, квант игрового времени занимает 1/35 секунды).

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

Можно ли запустить на телефоне другой модели?

У этого чипа переопределяются контакты, то есть одно и то же устройство на плате (например дисплей или кнопки) может быть подключено по разному. Также разводка клавиш на печатной плате может быть разной. Поэтому нужны таблицы из прошивки как правильно инициализировать конкретное устройство. Эти таблицы называются pinmap и keymap.

Находил на сайте 4pda сообщения от тех, кто пытался ставить прошивки с телефонов других моделей, пишут что клавиши не работают, поэтому пользоваться нельзя. Я полагаю, что если перенести pinmap и keymap из старой прошивки в новую, то шанс что заработает будет гораздо выше.

Обновление: Эти таблицы можно найти в прошивке. Прямо при инициализации игры, без участия пользователя. Но проверено только на двух прошивках.

Известные бренды кнопочных телефонов (Nokia, Panasonic) могут иметь защиту запускаемого через USB кода проверкой подписи.

Другие чипы дешевых кнопочных телефонов

По моему исследованию выходит, что половина рынка занята Spreadtrum (Unisoc) с чипом SC6531, на которые есть модификации SC6531E и SC6531DA (мне показалось что DA - более новый чип и начинает замещать E). Другая половина это MediaTek MT6261 (можно найти предшественника MT6260, но сейчас это редкость).

SC6531DA похож на SC6531E, но адреса некоторых контрольных регистров изменились и надо всё перепроверять по прошивкам.

Для MT6260 уже есть готовая работа по контролю над чипом.

Напоследок

Когда-то, до прихода Android, были ОС для кнопочных телефонов, которые позволяли писать свои приложения. Сейчас это исчезло и прошивки идут с предустановленными приложениями - ни удалить и ни добавить своё. Хочу чтобы это вернулось.

Хочу обратиться к представителям наших брендов, продающих кнопочные телефоны:

  1. Сделайте API для разработчиков и возможность запускать свои приложения с карты памяти. Первые кто это грамотно сделает - получат преимущество на рынке, где очевидных различий между брендами нет, всё одинаковое и делается на одних и тех же китайских фабриках. (В идеале хотелось бы открытую ОС, но с этим возникнут проблемы из-за нежелания китайской компании открывать документацию.)

  2. Прекратите вводить в заблуждение покупателей, выдавая мегабиты за мегабайты.

  3. Что относится к половине брендов - пишите модель чипа на сайте и в инструкции. У многих не указано даже в инструкции. Некоторые пишут SC6531 без указания модификации.

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




Комментарии (47):

  1. inferrna
    /#24944906 / +9

    Есть же KaiOs. Девайсы, вроде бы, от 11$, через emscripten можно хоть дум, хоть квейк собрать.
    https://www.kaiostech.com/explore/devices/

    • Viacheslav01
      /#24947468

      КаиОс уже больше напоминает андройд на минималках )

  2. Drayden
    /#24944958 / +2

    Круть!

    Смешно, но я на HTC Touch (Win Mobile) с похожим управлением игрался в эмулятор СНЕС. На 200мгц чипе... Там, конечно, не Дум - но и такое управление позволяет игрушки проходить :))

    • snuk182
      /#24947304 / +3

      Я на MPX200 соника так прошел.

      • Botvinkin
        /#24947418 / +3

        А я проходил Соника на Nokia 7710 c 168MHz-процессором. Вообще, было сложно найти нативные игры под Symbian S90, эмулятор Сеги только-то и спасал.

    • Dimsml
      /#24948564 / +2

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

      Тот же Yoshi's Island подтормаживает на дешёвых эмуляционных железках типа Powkiddy q90 / v90, Starfox скорее всего тоже. Обе игры используют дополнительные чипы в картридже, все эти чипы надо тоже эмулировать. Правда проблема может быть ещё и в устаревшей версии эмулятора.

      Процессор в этих железках вроде бы такой: Allwinner F1C100S CPU:533-798 MHz Single-Core ARM926-EJS

      • Drayden
        /#24949902

        Да, насчёт чипов и возможностей там было всё неоднозначно. На той же СНЕС, например, прозрачная лава в СуперМетроиде тормозила. Приходилось отключать или непрозрачить...

        Забавно, ведь был Doom для SNES! Жаль, не попробовал...

  3. Nyashkoshkko
    /#24945196 / +7

    С подключением на хабр ;)

  4. balamutang
    /#24945312

    Визуально похож на inoi 101, который не ворует деньги

  5. Vladusik2
    /#24945512 / +2

    Очень круто! Я тоже так хочу поковыряться с железками, что нужно для запуска?

    • jpegqs
      /#24945672 / +2

      Чтобы у вас был Linux и телефон на чипе SC6531E (без защиты FDL подписью, как у дорогих брендов). Можете попробовать портировать мой код для Linux на другую систему, но тут я вам не помогу.
      Я выложил исходники что позволяют запускать свой код на SC6531E, SC6531DA (директория custom_fdl), MT6260, MT6261 (директория payload). Но с этим вы пока только Hello World сможете напечатать с телефона в терминал на компьютере (и дампнуть прошивку с бутлоадером). Можете начать с этого. А чтобы портировать на другие телефоны с чипсетом SC6531E, нужно вытащить таблицы пинов и клавиш из прошивки вашего телефона.

      И пока у меня поддерживается только LCD с id=0x9306, вертикальной ориентации, разрешения 240x320.

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

  6. 0xdead926e
    /#24945536 / +3

    926ej-s... 208 мгц... не думала, что опять увижу это в 2022.

    *косится на siemens s75 с таким же 926ej-s на 208 мгц в стоке. вроде там в думе было побольше 19-ти фпс.*

    на snes и прочие сеги этого проца хватит. даже немножечко должно хватить на первую кваку, если памяти добавить. по крайней мере эта самая квака относительно неплохо бегала на нокии 3230, в которой 926 на 124 мгц.

    • jpegqs
      /#24945756

      На старых телефонах известных брендов могла быть память быстрее и больше, небо выше и трава зеленее. А на этих экономят на чём только можно.

      • 0xdead926e
        /#24945812 / +1

        вот не помню, как на s75 было, вот тайминги с s65 (926e на 104 мгц, память sdram)

        SDRAM timings: tRAS: 0, tRFC: 7, tRSC: 0, tRP: 0, tRCD: 0, tRC: 5, CL: 2, opmode: 0, burst: OFF, burst length: 3, tREF: 25, tRFC: 0, autorefresh: ON

        надо бы уже собраться и дописать эмулятор...

        и да, на старых телефонах тоже экономили на всем, что только можно было.

    • PuerteMuerte
      /#24946124 / +2

      926ej-s... 208 мгц... не думала, что опять увижу это в 2022.

      Во времена дума в компьютерах было 33 МГц, так что тут агрегат с хорошим таким запасом мощности, даже пусть и ARM, а не х86

      • CrashLogger
        /#24946640 / +2

        На 33 МГц DOOM еле шевелился.

        • PuerteMuerte
          /#24946896 / +1

          Нормально она там шевелится:

          https://www.youtube.com/watch?v=KQDEKoRcXZc

          Не 60 фпс, но по меркам 1993 года что такое "плавный фпс", никто вообще и не знал. Играбельно - и слава богу.

          • beeruser
            /#24947524

            по меркам 1993 года 

            В 1993 уже был Pentium 66, где Doom работал очень быстро, а не 5-10fps как у вас на видео.

            Даже между 486dx-25 и 386dx-50 разница по плавности работы Doom была кардинальная.

            • PuerteMuerte
              /#24950518 / +4

              В 1993 уже был Pentium 66, где Doom работал очень быстро

              Ну как был... вы просто привыкли к современному миру, где Интел/АМД анонсировали новую линейку процессоров (пара лоу-енд, пара мейнстрим, пара мощных, пара топовых), через пару месяцев запустили продажи, и все побежали в магазины их покупать. В 1993 году было чутка иначе. Новые модели выходили не линейкой, а одной-двум штукам. Попадали они после выхода в топовый сегмент по уберцене, подвигая остальные на ступеньку ниже. Pentium 60 и 66 в 1993-м году, это был топ среди топов, они были в серверном сегменте и в сегменте дорогущих рабочих станций. Чуть ниже их в топе сидели 486 DХ2, в сегменте мощных были старшие 486DX, а как раз 386 и младшие 486 были мейнстримом.

              Что касается кардинальной разницы между 486dx-25 и 386dx-50, могу сказать, что даже 386DX-40 был по производительности примерно равен или даже немного лучше, чем 486DX-25, а 386DX-50 вообще не существовало :)

              Но на производительность дума влиял ряд других факторов, в частности, FPS мог очень сильно отличаться в зависимости от видеокарты. Это сейчас мы забыли, что у видеокарты есть ещё и такая характеристика, как производительность 2D-части, предполагается, что какая бы она ни была, её достаточно. А тогда банальная скорость записи данных в видеопамять существенно влияла на общую производительность всех приложений компьютера, которые что-то выводили на экран. И очень-очень сильно влияла на те приложения, которые много чего выводили на экран, такие, как игры. Даже заменой такого, казалось бы, утилитарного девайса, как ISA-видеокарта, на более новую, можно было удвоить ФПС в думе.

              • beeruser
                /#24951818

                В 1993 году было чутка иначе.

                Дяденька, а мне 40 лет(с)

                 они были в серверном сегменте и в сегменте дорогущих рабочих станций

                И что? Сейчас никто не мешает купить тредриппер и на нём запустить игру.

                Что касается кардинальной разницы между 486dx-25 и 386dx-50, могу сказать, что даже 386DX-40 был по производительности примерно равен или даже немного лучше,

                Давайте придерживаться фактов. Я прекрасно помню (в 1993г) что сабж на 486dx25 работал быстрее и интернет подтверждает это. (486sx тоже самое, но без FPU).

                https://youtu.be/3fcPxAO1FeU?t=122

                В тесте используется одинаковая видеокарта.

                386DX-50 вообще не существовало

                Ой, ну всё, очень страшная опечатка :)

                Я, знаете ли, ещё охотился на мамонтов на 286 в PCAD платы разводил.

                • axe_chita
                  /#24951858

                  На самом деле все сильно зависело от материнской платы, и WS по памяти и шине. К примеру, материнская плата Octec Jaguar 386DX40, с MR-BIOS, за счет нулевых WS показывала производительность на уровне 486 на 20-22МГц. Ну и конечно видеокарты Cirrus Logic тут рулил.

                • PuerteMuerte
                  /#24953514

                  И что? Сейчас никто не мешает купить тредриппер и на нём запустить игру.

                  Мешает тётя Зарплата. Пентиум-66 в 1993-м стоил несколько средних зарплат американца. Конечно же, Билл Гейтс с Мелиндой наверняка рубились в десматч именно на таких компьютерах, но они тогда стримов не оставили, поэтому давайте исходить из того, что подавляющее большинство геймеров тогда играли на чём-то вроде 386, это была совершенно типовая конфигурация, и именно под неё дум и писался.

                  Давайте придерживаться фактов

                  Да легко. Интернет ещё подтверждает, что в мире есть куда больше конфигураций, чем те две, которые были показаны в вашем видео.

                  Вот пусть не дум, но тоже вполне себе трехмерный тест.

                  Вполне себе видно, что старшие 386 пересекаются по производительности с младшими 486, даже с одинаковым видео

                  Я, знаете ли, ещё охотился на мамонтов на 286 в PCAD платы разводил

                  Подумаешь, я в оркаде на "Поиске" схемы рисовал :Р

            • MW_dem1305
              /#24951844 / +1

              В 95-м -97 пентиумы пошли, я тогда в БГУИР учился.У нас ещё 486/586 вовсю в сетке рубились.В дум.

      • vitalyvitaly
        /#24947256 / +1

        По памяти использования DosBox на Нокии 5500 с подобным ARM-процессором - под эмулятором x86 он примерно соответствовал 12-мегагерцевому 80286, то есть весьма и весьма медленно. Но можно было играть в Supaplex.

        • PuerteMuerte
          /#24947384 / +1

          Здесь автор же запускает не под эмулятором, а нативный порт под ARM

    • jpegqs
      /#24947952 / +2

      Дополнил текст, 19 FPS было из-за ошибки в заполнении MMU таблиц. После исправления упёрлось в 35 FPS лимит.

  7. aPiks
    /#24945916

    У сяоми есть кнопочный телефон на Андроид...

    • jpegqs
      /#24946064

      У меня есть Nobby 230, та же система (Android 4.4, но модифицированный и называется Mocor5 OS).

  8. tormozedison
    /#24946010 / +3

    Возвращение эльфов?

  9. Doublesharp
    /#24946016 / +1

    Немного повышу ставки и оставлю это тут. GTA: San Andreas на смарт-часах.

  10. jpegqs
    /#24946116 / +5

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

    • khaleb1102
      /#24946190 / +5

      Было бы неплохо.

      При попытке изучения ассемблера, обсмотревшись роликов про устройство древних ПК на Z80 решил попробовать написать хоть что-то для какого-нибудь нестандартного (в моём случае - не являющегося ардуиной) процессора.

      Нашёл трубку на 6531Е, родную прошивку. А ещё со времён когда у меня были android-телефоны на Spreadtrum, я помню, что для телефонов на таких процессорах есть 2 прошивальшика - UpgradeDownload и ResearchDownload. Второй позволяет распаковывать файлы родной прошивки (*.pac) и заменять в них разделы - идеальный способ рутования трубок для которых нет даже темы на 4pda - просто правка initrd с последующей прошивкой. (Телефоны с подписью загрузчика мне не попадались).

      Соответственно, подсмотрев в ResearchDownload, по какому смещению в оперативке грузится FDL2 начал писать свой helloworld на смеси ассемблера и сей arm-none-eabi-gcc. При этом, прошивальшик под wine хоть и запускается, но тело не видит, так что переехал на форточки и WSL2 - сборка под местной убунтой, заливка под win.

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

      На 4пда нашёл исходники, видимо для версии прошивки более ранней, чем у меня - и от другого телефона. На основе её и даташита запустил UART на передачу, подпаялся к пятачкам под аккумулятором. Кстати, под запуском имеется ввиду - разобрался как передавать байты и менять скорость. Сам блок включает FDL1 - в инициализацию не вникал.

      Решил пойти дальше, разобраться с RTC или клавой - но застрял. Там вроде клавиатура зависит от RTC, который находится на "analog die" - а наладить с ним общение не удалось. И до прерываний (любых) тоже не дошёл - забросил проект.

      Так что жду ваших исходников в любом рабочем виде, а уж если будет рабочий пример с извлечением pinmap (до необходимости которого я не дошёл) - вообще шик.

      • jpegqs
        /#24946234 / +1

        Мои тулы с гитхаба собрать и запустить сможете? (Что загрузчик FDL для Линукс и custom_fdl.) С вами бы я скооперировался для ускорения разработки. На базе этих исходников у меня FDL2 с игрой и USB файл сервер.

        • khaleb1102
          /#24946244

          Но я не то, чтобы обладаю достаточными знаниями, чтобы со мной кооперироваться.

  11. jpegqs
    /#24946450 / +6

    Хотелось бы накопить достаточно знаний о чипе чтобы сделать открытую ОС. Но такое я один не потяну, нужна команда. Так что я хочу сделать порт Doom что работает на достаточном количестве телефонов, а там может народ подтянется и поможет с остальным. (Или не подтянется, ну и ладно... попытаться всё равно стоит.)

    • Javian
      /#24946604 / +3

      Off надо бы на hackaday как новость разместить.

      • jpegqs
        /#24946760 / +4

        На Hacker News размещал, никто не заметил, но там всегда как повезёт.

  12. Qumbayas
    /#24947620 / +2

    Очень круто! Меня рассмешило в свое время, как doom запустили в диспетчере задач windows

  13. irishmann
    /#24947762 / +2

    На старых телефонах была же платформа J2ME, почему ее не используют на современных кнопочных звонилках?

    • jpegqs
      /#24947878 / +3

      Причём J в ARMv5TEJ - это Jazelle, расширение процессора что позволяет выполнять Java байткод напрямую. Но Java там нет, возможно из-за малого количества RAM/флэш памяти.

      • 0xdead926e
        /#24947996 / +2

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

        *и кстати, на симанцах эту java-машину каждый второй отключал. ибо лишний мегабайт оперативки, да.*

    • Akon32
      /#24948162

      То ли она медленно развивалась, то ли в Google/Android был синдром NIH.

  14. DinoZavr3
    /#24949462

    Оо, круто, что нужно для запуска? Может, тоже попробую

    • jpegqs
      /#24950562

      Пока не дошел до публикации всего. На гитхаб (в дампер/загрузчик) добавил использование libusb (для тех кто на Windows - это будет единственный метод, подозреваю что еще и драйвера требует, те же самые что для прошивки используются). Если вы на Windows, то попробуйте собрать это и дампнуть прошивку. И телефон нужен конкретного чипсета. В общем не просто и не сразу, код пока настроен на одну модель телефона и LCD экрана, но у меня есть идеи для автоматического нахождения конфигурации телефона.