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

Я очень большой фанат портативных гаджетов с полноценными QWERTY-клавиатурами: ноутбуков, коммуникаторов и различных хэндхелдов. Когда в мои руки попадает девайс с Linux или Windows CE в том или ином виде, я стараюсь максимально расширить функционал устройства и порой даже портирую программы с других платформ! Недавно мне удалось купить китайский детский обучающий ноутбук с MIPS-процессором и поворотным дисплеем всего за 1 000 рублей. Интересно узнать о том, как я хакнул девайс и причём здесь Dingoo A320? Тогда жду вас под катом!

❯ Предыстория

В конце 2000-х годов, цена на бюджетные ноутбуки снизилась настолько, что купить полноценный лэптоп мог почти каждый студент. Если в начале нулевых годов миниатюрность была роскошью и стоила довольно дорого по отношению к обычным 15-дюймовым бюджетникам, то с выходом Asus EEEPC в 2007 году, маленькие нетбуки с 7-дюймовыми дисплеями наоборот образовали новый сегмент рынка недорогих портативных устройств.

Сейчас мы с вами привыкли, что большинство ноутбуков работает на базе процессоров с двумя архитектурами — x86_64 и ARM. Однако в те времена, инженеры и производители активно экспериментировали и с альтернативными архитектурами — например, MIPS. В 2009 году, некая китайская компания Noah Educational Holdings, которая занималась разработкой портативных устройств для обучения дошколят и школьников младших классов, выпустила на рынок свой собственный миниатюрный обучающий ноутбук — Noah NP5000.

Обычно, когда читатель слышит ‭«детский ноутбук‭», он представляет себе небольшое устройство с почти полноценной QWERTY-клавиатурой, небольшим монохромным ЖК-дисплеем и набором некоторых обучающих программ. При этом замоддить такие устройства не представляется возможным — в них используются микроконтроллеры с масочной ROM (прожигаемой на заводе), которые скорее всего являются близкими родственниками процессоров тех самых Тетрисов!

Пример такого детского ноутбука
Пример такого детского ноутбука

Однако в случае с NP5000 всё было совершенно по другому — дисплей здесь уже цветной, а не монохромный, вместо батареек используется полноценный аккумулятор, да и в целом девайс выглядит действительно как взрослый миниатюрный нетбук с поворотным экраном! При включении пользователя встречает заставка с логотипом компании и характерным пингвинчиком, рабочий стол, напоминающий Windows XP и определенный набор обучающих программ на китайском языке.

В один день я листал Goofish (китайский аналог Авито) в поисках интересных гаджетов, именно пингвинчик и привлёк моё внимание. Информации о том, на каком процессоре работает ноутбук, можно ли на него устанавливать сторонние приложения и что он вообще умеет в сети не было. Однако приятная цена в 1 000 рублей и желание заполучить интересный девайс в коллекцию взяли верх — и я решил рискнуть!

Мчу на своем болиде за ноутбуком для дошколят!
Мчу на своем болиде за ноутбуком для дошколят!

Когда девайс приехал ко мне, я немного поковырял его родную оболочку, попытался выйти в терминал, поставить пакеты OpenWRT — но всё тщетно, оболочка тщательно была закрыта от ушлых детских ручек! Поэтому я решил разобрать девайс и узнать, на каком процессоре он работает и есть ли у нас UART, на котором можно поискать рут-консоль или хотя-бы консоль U-Boot.

Девайс помог привезти в Россию мой подписчик Роман и сервис YouCanBuy, за что им огромное спасибо! Также этой статьи не было бы без подписчика Андрея, который занял мне определенную сумму для заказа ништячков из Китая, за что ему отдельная благодарность!

❯ Что внутри?

Разбирается маленький нетбук почти также, как и его взрослые собратья — через клавиатуру! Со стороны поддона виднеется съёмная крышка, которая на x86-устройстве должна содержать в себе место под HDD и слоты для оперативной памяти. Однако в нашем случае, здесь скрывается кое-что поинтереснее: видите характерное место под миниджек с подписанными пинами RX и TX? Это и есть UART, о котором я говорил в прошлом абзаце.

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

В качестве процессора используется легендарный Ingenic JZ4757! Это готовая система на кристалле, включающая в себя MIPS-ядро собственной разработки с микроархитектурой XBurst, работающее на частоте до 380МГц, видеоконтроллер с возможностью вывода картинки на дисплей или телевизор, аудиокодек, USB-хост и т. п. Слева от процессора расположились два чипа ОЗУ типа SDRAM, в сумме образующие 64Мб, а чуть ниже распаяна NAND-флэшка от компании Samsung на 2Гб. Справа снизу ‭«спрятался‭» чип часов реального времени — с которого при желании можно было бы взять шину I2C!

Что странно — маркировка флэшки была наполовину затерта с завода, при том что ноутбук ни разу не разбирался... видимо использовали Б/У-накопитель?
Что странно — маркировка флэшки была наполовину затерта с завода, при том что ноутбук ни разу не разбирался... видимо использовали Б/У-накопитель?

Я не зря назвал процессоры от Ingenic легендарными. Дело в том что именно JZ'шки использовались во многих легендарных портативных гаджетах нулевых годов. Например, JZ4732 использовался в популярной эмуляторной игровой консоли Dingoo A320, а JZ4725 использовался в журнале Vogue с экранчиком и OpenHardware-ноутбуке Ben NanoNote. Ingenic славились своей открытостью к сообществу моддеров и свободно предоставляла исходный код ядра Linux, BSP для Windows CE и даже код своей проприетарной прошивки для MP4-плееров!

Далее я решил подпаяться к UART'у, дабы почитать что у нас туда пишет система. Вне зависимости от чипсета или устройства, довольно часто на UART летят логи загрузчика и ядра, а иногда на нём можно найти и рутовую консоль. Благодаря такому ‭«бэкдору‭» можно попытаться хакнуть самые разные устройства: например, тонкие клиенты на процессорах Marvell или незамысловатый ТВ-бокс. В качестве USB-UART преобразователя я использую плату с ESP32 с постоянным RESET'ом на микроконтроллере (дабы не вмешивался в работу шины):

Не забываем общую массу, иначе на шине будет мусор!
Не забываем общую массу, иначе на шине будет мусор!

❯ Хакаем

Далее я включил ноутбук, настроил Putty на свой COM-порт с бодрейтом 115200 и увидел логи. Выяснилось что в качестве загрузчика используется всеми любимый U-Boot (в котором нельзя прервать процесс загрузки), а в качестве ядра — Linux версии аж 2.6! И конечно же на этом терминале висела полноценная рут-консоль!

Далее я сразу решил проверить с какой системой мне придется иметь дело: заглянул в top, обнаружив что используется оболочка Qtopia (формальная альтернатива Xorg и DirectFB для КПК на Linux), пошерстил по папкам с бинарниками и посмотрел inittab. Наша задача — заставить ноутбук запускаться с текстовым терминалом на дисплее, а Qtopia запускать уже по желанию.

Сначала я закомментировал запуск Qtopia в скрипте автозагрузки - inittab'е. Однако если просто ‭«прибить‭» оболочку — после включения ноутбука нас будет встречать пустой экран без какого либо взаимодействия. Поскольку у меня не было возможности изменить cmdline ядра и перенаправить консоль на терминал fbcon, я решил это сделать уже в юзерспейсе с помощью системного вызова TIOCCONS, однако он по каким-то причинам выдавал ошибку. Тогда пришлось немного костылить и дублировать терминал с помощью getty:

getty -l /login.sh 115200 tty0
...
#!/bin/sh
clear
/bin/login

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

❯ Портируем эмуляторы

Далее я решил попробовать портировать эмуляторы с родственной данному ноутбуку Dingoo A320. В родной системе почти никакие эмуляторы не работали даже после подкидывания всех необходимых библиотек (в том числе и uclibc с SDL), однако после chroot'а в систему от Dingoo A320 у меня запустились часть эмуляторов. Однако в этом ноутбуке используется оригинальный непропатченный кривой драйвер фреймбуфера, который постоянно сыпет ошибками и не умеет работать в виртуальном разрешении. Из-за этого, часть эмуляторов выглядело... примерно вот так:

В эмуляторе был некорректно реализован скейлинг, который портил память
В эмуляторе был некорректно реализован скейлинг, который портил память

А часть вот так:

Разрешение оригинальной Dingoo A320 — 240x320, а в ноутбуке — 800x480
Разрешение оригинальной Dingoo A320 240x320, а в ноутбуке — 800x480

И я понял что без патчей в исходном коде не обойтись. Для сборки программ под старые Linux-машины, кросс-компилятор из репозиториев свежих дистрибутивов не подойдет — слишком новая версия glibc. Более того, некоторые устройства могут использовать uclibc вместо glibc, как, например, та же самая динга. Поэтому может потребоваться установка уже готового тулчейна — благо для динги он сохранился в сети. Распаковываем архив в /opt/, добавляем в переменную PATH путь к папке bin/ и пробуем собирать тестовую программу. Всё работает!

Далее предстояло найти исходный код эмуляторов для динги. Часть из них можно найти на гите (в качестве портов на GCW-Zero), часть — на сайте OpenHandhelds. Первым дело я решил портировать эмулятор GameBoy Color. Поскольку эмулятор работает поверх библиотеки SDL, в первую очередь я изменил видеорежим с 240x320 на 800x480...

if (!(fbSurface = SDL_SetVideoMode(240, 320, vmode[2], flags)))
		die("SDL: can't set video mode: %s\n", SDL_GetError());

	screen = SDL_CreateRGBSurface(0, 160, 144, 16, 0, 0, 0, 0);

И ожидаемо ничего не получил, никто растягивать картинку за меня не будет! Поэтому я сначала написал простейшую функцию скейлинга картинки на флоатах с заранее посчитанным шагом интерполяции, затем оптимизировал её до fixed-point арифметики, а после и вовсе решил ‭«запечь‭» координаты для сэмплинга в один большой массив.

void BlitScale(SDL_Surface* srcSurface, SDL_Surface* dstSurface, framebuffer_scale_t* scales)
{
	int i, j;

	for (i = 0; i < dstSurface->h; i++)
	{
		for (j = 0; j < dstSurface->w; j++)
		{
			framebuffer_scale_t scale = scales[i * dstSurface->w + j];

			uint16_t* pixel = &srcSurface->pixels[(scale.y * srcSurface->w + scale.x)];
			uint16_t* dstPixel = &dstSurface->pixels[(i * dstSurface->w + j)];

			*dstPixel = *pixel;
		}
	}
}

Крайний вариант был самым быстрым, однако в нативном разрешении ноутбука я получил примерно 50%-скорости от реальной консоли — т. е., по сути, не играбельно. При этом в видеорежиме 240x320 всё работало нормально и упор был явно не в скорость растягивания картинки... по каким-то причинам либо блиттер SDL работал слишком медленно, либо драйвер фреймбуфера спотыкался об преобразование форматов пикселя из-за чего всё и тормозило.

Далее я решил попробовать запустить другие эмуляторы. NES, Sega Master System и другие консоли работали отлично... пока я не устанавливал разрешение выше 240x320. Ради интереса, я запустил оболочку для Linux-консолей gmenu2x с Ben NanoNote, которая вместо SDL использует DirectFB и получил вот такую картину. Epic fail...

❯ Накатываем Debian

После этого я решил попробовать накатить всем известный Debian. В отличии от эмуляторов, здесь пересобирать ничего не нужно: достаточно лишь собрать rootfs с необходимыми пакетами, отформатировать SD-карточку и chroot'унутся в систему. Для сборки можно использовать две утилиты — debootstrap и multistrap:

Сначала я хотел накатить что-то относительно современное по типу Debian Buster или Jessie, однако вскоре выяснилось, что ядро 2.6 эти версии системы не поддерживают...

Оказалось что последней версией Debian, поддерживающей ядро 2.6, был Squeeze вышедший в далёком 2011 году. После сборки и копирования рутфс, необходимо было выполнить вторую стадию установки системы, а именно фактическую распаковку и установку пакетов:

Установка БАЗОВЫХ пакетов занимает около 20 минут!
Установка БАЗОВЫХ пакетов занимает около 20 минут!

Далее мне удалось подкинуть некоторые пакеты и даже попытаться запустить иксы (на 64Мб ОЗУ!)... но затем я погряз в зависимостях и всё таки решил попытаться подкинуть сеть. Выяснилось что в ядре есть поддержка встроенного в чипсет Ethernet-контроллера, однако PHY на плате то не распаян!

❯ Заключение

Вот такая статья о попытке превратить китайский бюджетный MIPS-ноутбук в портативную игровую консоль у нас с вами получилось. И хотя в определенном смысле мне удалось добиться успехов — выйти в рутовую консоль, накатить Debian и запустить эмуляторы в половинном разрешении, всё равно это всё таки больше Epic fail... Но по крайней мере, эти бессонные ночи были очень веселыми!

А вам надеюсь было интересно почитать мой опыт моддинга такого замечательного девайса. Пишите своё мнение в комментариях! Если вам интересна тематика ремонта, моддинга и программирования для гаджетов прошлых лет, подписывайтесь на мой Telegram-канал ‭«Клуб фанатов балдежа‭», куда я публикую бэкстейджи статей, иногда полезные посты ну и немножечко щитпоста! Если вам интересны мои видео той же тематики — предлагаю подписаться на мой YouTube-канал.

Но это ещё не всё

NP5000 — не единственная обучающая модель. В Китае есть куча интересных ноутбуко-подобных гаджетов за шапку сухарей, которые я могу попробовать хакнуть, потенциально с положительным результатом! Если вам интереса подобная тематика в будущем — проголосуйте в опросе ниже.

Например, некие Readboy с 32 bit high-speed processor. Что же за processor там может скрываться?
Например, некие Readboy с 32 bit high-speed processor. Что же за processor там может скрываться?
Или легендарные мини-ноутбуки Ben NanoNote!
Или легендарные мини-ноутбуки Ben NanoNote!


А ещё я держу все свои мобилы в одной корзине при себе (в смысле, все проекты у одного облачного провайдера) — Timeweb. Потому нагло рекомендую то, чем пользуюсь сам — вэлкам:

Перейти ↩

Очень важно! Разыскиваются девайсы для будущих статей!

Друзья! Для подготовки статей с разработкой самопальных игрушек под необычные устройства, объявляется розыск телефонов и консолей! В 2000-х годах, китайцы часто делали дешевые телефоны с игровым уклоном — обычно у них было подобие геймпада (джойстика) или хотя бы две кнопки с верхней части устройства, выполняющие функцию A/B, а также предустановлены эмуляторы NES/Sega. Фишка в том, что на таких телефонах можно выполнять нативный код и портировать на них новые эмуляторы, чем я и хочу заняться и написать об этом подробную статью и записать видео! Если у вас есть телефон подобного формата и вы готовы его задонатить или продать, пожалуйста напишите мне в Telegram (@monobogdan) или в комментарии. Также интересуют смартфоны-консоли на Android (на рынке РФ точно была Func Much-01), там будет контент чуточку другого формата :)

А также я ищу старые (2010-2014) подделки на брендовые смартфоны Samsung, Apple и т. п. Они зачастую работают на весьма интересных чипсетах и поддаются хорошему моддингу, парочку статей уже вышло, но у меня ещё есть идеи по их моддингу! Также может у кого-то остались самые первые смартфоны Xiaomi (серии Mi), Meizu (ещё на Exynos) или телефоны Motorola на Linux (например, EM30, RAZR V8, ROKR Z6, ROKR E2, ROKR E5, ZINE ZN5 и т.п, о них я хотел бы подготовить специальную статью и видео т. к. на самом деле они работали на очень мощных для своих лет процессорах, поддавались серьезному моддингу и были способны запустить даже Quake!). Всем большое спасибо за донаты!

Комментарии (36)


  1. bodyawm Автор
    15.02.2025 14:06

    Статья, к сожалению, не торт. Я умудрился поймать хондру и развел сопли.

    Но все равно постараюсь на днях закончить один интересный проЭкт. Какой? Узнаете на следующей неделе.


    1. NickDoom
      15.02.2025 14:06

      Ну техническая сторона норм, даже деб попробовал :) это ж, поди, почти полноценный бук уже, насколько это на таком железе реально :)


      1. bodyawm Автор
        15.02.2025 14:06

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


        1. Ratenti
          15.02.2025 14:06

          Можно в ядро Линукс добавить драйвер USB сетевой карты?


          1. bodyawm Автор
            15.02.2025 14:06

            Исходников ядра у меня нет, так бы можно было бы в конфиге включить. Но можно попробовать собрать модуль


    1. vkni
      15.02.2025 14:06

      Спасибо вам за сэкономленные 5 минут и душевные силы.


      1. bodyawm Автор
        15.02.2025 14:06

        Для максимальной экономии можно нажать шестерню и добавить автора в чс


    1. NutsUnderline
      15.02.2025 14:06

      не эмуляторами одними живем!

      люди на малинках всяких лепят свои кибердэки, или покупают всякие GPD win чтобы работать в терминалке, в том числе через com-порт. а тут практически готовое, жаль нет wifi


  1. tormozedison
    15.02.2025 14:06

    «Обычно, когда читатель слышит ‭«детский ноутбук‭», он представляет себе небольшое устройство с почти полноценной QWERTY-клавиатурой, небольшим монохромным ЖК-дисплеем и набором некоторых обучающих программ. При этом замоддить такие устройства не представляется возможным — в них используются микроконтроллеры с масочной ROM (прожигаемой на заводе), которые скорее всего являются близкими родственниками процессоров тех самых Тетрисов!»

    Встречал статью, суть следующая. Масочное ПЗУ там большое, статическое ОЗУ совсем небольшое. Но есть отладочные ноги, через которые можно записать в ОЗУ небольшой кусок кода и запустить. Сохранить во что-то энергонезависимое его, конечно, не получится. Но можно расположить рядом какую-нибудь ардуиноподобную железку, которая будет по командам пользователя загонять в это ОЗУ различные куски кода.

    А можно просто заменить всё железо и дисплей, оставив клавиатуру. Тогда получится гонять, например, slviajero-tinybasic, там предусмотрена работа с внешними клавиатурным матрицами.


    1. bodyawm Автор
      15.02.2025 14:06

      О, а есть какая то более подобная информация? Звучит интересно.

      Правда если там все таки Holtek, у них своя система команд и сначала нужно написать ассемблер.



      1. tormozedison
        15.02.2025 14:06

        А ещё можно сделать как в этой штуке

        http://www.wiki-telesys.1gb.ru/pristavka-kalkofon

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


        1. bodyawm Автор
          15.02.2025 14:06

          Там же уарт есть) при желании нтут можно как одноплатнрк юзать


  1. tormozedison
    15.02.2025 14:06

    А вам попадались железки, позиционируемые как MP3-плееры, но со вспомогательной функцией эмулятора NES? Как назывались, забыл, но несколько моделей на рынке точно было. Датируются они примерно тем периодом, когда Mini USB встречался в разы чаще, чем Micro.


    1. bodyawm Автор
      15.02.2025 14:06

      Да) даже со своим интерпретатором C-подобного языка (KPEX-100).

      Обычно эмуляторы есть на плеерах с чипами Rockchip и Anyka


      1. tormozedison
        15.02.2025 14:06

        На Kingston не эмулятор, просто две встроенных игры. А те были ноунеймовскими совсем. И не всегда в корпусах «джойстикоподобного» вида.


        1. bodyawm Автор
          15.02.2025 14:06

          del


  1. tormozedison
    15.02.2025 14:06

    А какая у этой штуковины (до всех манипуляций) была реакция на Ctrl+Alt+F1?


    1. bodyawm Автор
      15.02.2025 14:06

      Во блин! А я даже и не знаю :)

      Скорее всего никакой, Qtopia должна отключать возможность переключаться между терминалами.


      1. fhunter
        15.02.2025 14:06

        И, кстати, консоль/getty можно было поднять из самого inittab-а, как собственно раньше и делали?
        Или я что-то упустил?


        1. bodyawm Автор
          15.02.2025 14:06

          Да, я вчера так и сделал) но скроллинга все равно нет.


  1. kvatapo
    15.02.2025 14:06

    Блин, обожаю такие статьи!


    1. bodyawm Автор
      15.02.2025 14:06

      Она могла быть еще круче))) Но я ниасилил починить эмуляторы(((

      Иначе я бы портировал сюда много всякого интересного ;)


      1. fhunter
        15.02.2025 14:06

        Может эмулятору скорости оперативки не хватает?
        Всё же разрешение в 4 раза (по числу пикселей) поднимается?


        1. bodyawm Автор
          15.02.2025 14:06

          Навряд-ли. P III тянул же.


  1. ProgrammerForever
    15.02.2025 14:06

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


    1. bodyawm Автор
      15.02.2025 14:06

      В РФ именно таких (и именно на MIPS'е) - нет. Но вот x86 да, много)


  1. sdore
    15.02.2025 14:06

    Также интересуют смартфоны-консоли на Android (на рынке РФ точно была Func Much-01)

    Func Master-01 есть, Москва. Раз уж интересует :)


    1. bodyawm Автор
      15.02.2025 14:06

      Приветствую. Это которая большая-пребольшая PSP? :)


      1. sdore
        15.02.2025 14:06

        Не знаю насчёт размера, 6" она примерно (плюс корпус) :)


        1. bodyawm Автор
          15.02.2025 14:06

          Было б интересно. Пните в тг @monobogdan


  1. infitum
    15.02.2025 14:06

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


  1. Playermtr1
    15.02.2025 14:06

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


    1. bodyawm Автор
      15.02.2025 14:06

      Хм, ну я точно знаю что есть электронные книги на Linux, MIPS и тех же самых инжениках!


      1. axe_chita
        15.02.2025 14:06

        QUMO Libre (с QWERTY клавиатурой) работает под Linuxна SoC от Samsung


    1. NutsUnderline
      15.02.2025 14:06

      playdate давно уже сделали, можно посмотреть видео как оно работает