Начну с конца и покажу результат:
За что этот телефон так наказан...
Минутка анти-рекламы, это 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 не уверен).
Что получилось
Нашел управление:
USB - правда лишь медленный 1.1.
LCD панель - имеет собственный 16-бит номер и интерфейс, для одной модели телефона могут использоваться разные LCD панели, команды управления которых могут отличаться.
LCDC - контроллер LCD, выполняет функцию акселератора 2D графики, без него изображение придётся передавать попиксельно, тратя на это время процессора.
Системный таймер - на SC6531E точность таймера 1мс.
Клавиши - кроме клавиши питания (она же повесить трубку), видимо имеет свой интерфейс.
Подсветка экрана - могу включать и изменять яркость.
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, были ОС для кнопочных телефонов, которые позволяли писать свои приложения. Сейчас это исчезло и прошивки идут с предустановленными приложениями - ни удалить и ни добавить своё. Хочу чтобы это вернулось.
Хочу обратиться к представителям наших брендов, продающих кнопочные телефоны:
Сделайте API для разработчиков и возможность запускать свои приложения с карты памяти. Первые кто это грамотно сделает - получат преимущество на рынке, где очевидных различий между брендами нет, всё одинаковое и делается на одних и тех же китайских фабриках. (В идеале хотелось бы открытую ОС, но с этим возникнут проблемы из-за нежелания китайской компании открывать документацию.)
Прекратите вводить в заблуждение покупателей, выдавая мегабиты за мегабайты.
Что относится к половине брендов - пишите модель чипа на сайте и в инструкции. У многих не указано даже в инструкции. Некоторые пишут SC6531 без указания модификации.
Предоставляйте обновления прошивок для скачивания на официальном сайте. Пока же у меня есть подозрения, что некоторые сотрудники сервис центров сливают прошивки на сайты с платным скачиванием и подзарабатывают на этом. Пока что скачивание прошивок с официального сайта заметил только у бренда Maxvi.