monobogdan

monobogdan

Топовый автор
На Пикабу
Дата рождения: 25 сентября 2001
5002m user6154240 ivan1s1s
ivan1s1s и еще 49 донатеров
G0lubи еще 1 читатель ждут новые посты
поставил 6 плюсов и 1 минус
отредактировал 2 поста
проголосовал за 2 редактирования

Собираем на будущие ништяки

Именно Вы, читатели, помогаете с подготовкой новых статей - все деньги отправляются на покупку девайсов для будущих статей и оборудования! Спасибо всем, кто помогает - и морально, и материально!

0 2 000
из 2 000 собрано осталось собрать
Награды:
За участие в Авторской неделеболее 1000 подписчиков Высокий разум
42К рейтинг 1817 подписчиков 0 подписок 176 постов 129 в горячем

Пикабушники! Монобогдан ищет девайсы для статей!

Привет, Пикабушники! Я пишу о ремонте, моддинге и программировании под различные старые девайсы, вполне вероятно, что вы читали мои статьи! Но некоторые девайсы найти проблематично: в основном потому что большинство оказалось на свалке, а на онлайн-барахолках их не найти из-за запрета на контрафакт. Я снова ищу китайские подделки из начала 2010х: в основном китайские игровые консоли, Android-реплики айфонов, айпадов, Samsung Galaxy, Nokia Lumia/HTC/Sony Xperia и другие подделки на популярные бренды. Можно невключайки/нерабочие/зависающие, почти любое состояние - все постараюсь оживить и поднять. Что с ними происходит потом? Смотрите сами: Сам себе Linux-смартфон: Выкидываем Android из старого Fly и пилим свою оболочку, Сам себе экосистема, портируем свежий Android на NoName-смартфон, на грани отвала eMMC: переносим Android на MicroSD, накатываем чистый Android на китайский iPhone 5s, бомж-гейминг за копейки с отвальной консолью. Так что не сомневайтесь, девайсы попадают в хорошие руки :) Все стараюсь поднять, оживить и написать про них материал! Есит что-то подобное? Пишите в комменты или в тг @monobogdan. Спасибо!

Пикабушники! Монобогдан ищет девайсы для статей! Гаджеты, Android, Apple, Девайс, Китайцы, Китай, Подделка, Реплики, Поиск, Длиннопост
Пикабушники! Монобогдан ищет девайсы для статей! Гаджеты, Android, Apple, Девайс, Китайцы, Китай, Подделка, Реплики, Поиск, Длиннопост
Пикабушники! Монобогдан ищет девайсы для статей! Гаджеты, Android, Apple, Девайс, Китайцы, Китай, Подделка, Реплики, Поиск, Длиннопост
Пикабушники! Монобогдан ищет девайсы для статей! Гаджеты, Android, Apple, Девайс, Китайцы, Китай, Подделка, Реплики, Поиск, Длиннопост
Пикабушники! Монобогдан ищет девайсы для статей! Гаджеты, Android, Apple, Девайс, Китайцы, Китай, Подделка, Реплики, Поиск, Длиннопост
Пикабушники! Монобогдан ищет девайсы для статей! Гаджеты, Android, Apple, Девайс, Китайцы, Китай, Подделка, Реплики, Поиск, Длиннопост
Показать полностью 6

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI?

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

Зачастую в процессе разработки собственных устройств или моддинга уже существующих, встаёт задача выполнения стороннего кода: будь то ваши собственные программы с SD-флэшек, или программы, написанные другими пользователями с помощью SDK для вашего устройства. Тема компиляторов и кодогенерации достаточно сложная: чтобы просто загрузить ELF или EXE (PE) программу, вам нужно досконально разбираться в особенностях вашей архитектуры: что такое ABI, релокации, GOT, отличие -fPIE от -fPIC, как писать скрипты для ld и т. п. Недавно я копал SDK для первых версий Symbian и основываясь на решениях из этой ОС понял, каким образом можно сделать крайне «дешевую» загрузку любого нативного кода практически на любом микроконтроллере, совершенно не вникая в особенности кодогенерации под неё! Сегодня мы с вами: узнаем, что происходит в процессе загрузки программы ядром Linux, рассмотрим концепцию, предложенную Symbian Foundation и реализуем её на практике для относительно малоизвестной архитектуры — XTensa (хотя она используется в ESP32, детали её реализации «под капотом» для многих остаются загадкой). Интересно? Тогда добро пожаловать под кат!

❯ Как это работает?


Думаю, для многих моих читателей реализация процесса загрузки exe-программ и dll-библиотек в память процесса оставалась эдаким чёрным ящиком, в детали реализации которого вдаваться не нужно. Отчасти это так и есть: современные ОС разруливают процесс загрузки бинарников в память сами, не требуя от программиста вообще ничего, даже понимания того, куда будет загружена его библиотека или программа.

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост




Давайте для общего понимания вкратце разберемся, как происходит загрузка программ в Windows/Linux:

1. Система создаёт процесс и загружает в память программы секции из ELF/PE. Обычные программы для своей работы используют 3 секции: .text (код), .data (не-инициализированный сегмент памяти для глобальных переменных), .bss (сегмент памяти для инициализированных переменных). Каждому процессу выделяется собственное адресное пространство, называемое виртуальной памятью, которое не позволяет программе испортить память ядра, а также позволяет не зависеть от разметки физической памяти на выполняющей машине. Концепцию виртуальной памяти реализует специальной модуль в процессоре, называемый MMU.

2. Если бы наши программы не использовали никаких зависимостей в виде динамических библиотек, то на этом процесс загрузки можно было бы закончить: каждая программа имеет свой адрес загрузки, относительно которого линкер строит связи между обращениями к коду/данным программы. Фактически, для самых простых программ линкеру остаётся лишь прибавить адрес загрузки программы (например, 0x100) к каждому абсолютному обращению к памяти.
Однако современные программы используют десятки библиотек и для всех предусмотреть собственный адрес загрузки не получится: кто-то где-то всё равно будет пересекаться и вероятно, портить память. Кроме того, современные стандарты безопасности в Linux рекомендуют использовать позиционно-независимый код, дабы использовать преимущества ASLR (Address Space Layout Randomization, или простыми словами возможность загрузить программу в случайное место в памяти, дабы некоторые уязвимости, завязанные на фиксированном адресе загрузки программы перестали работать).

3. Поэтому для решения этой проблемы придуман т. н. динамический линкер, который уже на этапе загрузки программы или библиотеки патчит программу так, чтобы её можно было загрузить в любой участок памяти. Для этого используются данные, полученные от обычного линкера а этапе компиляции программы: помимо .text, .data и .bss, линкер создаёт секции .rel и .rel-plt, которые называются релокациями. Если объяснять совсем условно, то релокации — это просто запись вида «какой абсолютный адрес в коде программы нужно пропатчить» -> «на какое смещение его пропатчить». Самая простая релокация выглядит вот так:

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

Где по итогу:

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

.rel-plt же служит для резолвинга вызовов к dll/so: изначально программа ссылается на заранее определенные в процессе компиляции символы, которые уже в процессе загрузки патчатся на физические адреса функций из загруженной библиотеки.

И казалось бы — всё очень просто, пока в дело не вступают GOT (Global Offset Table — глобальная таблица смещений) и особенности реализации конкретного ABI. И ладно бы x86 или ARM, там всё разжевано и понятно, однако на других архитектурах начинаются проблемы и не всегда очевидно что и где за что отвечает.

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

  1. Писать полноценный загрузчик ELF-бинарников. ELF может оказаться громоздким для некоторых окружений и его реализация может оказаться тривиальной не для всех.

  2. Зарезервировать определенный сегмент в памяти (пусть с 0xFFF по 0xFFFF) и скомпилировать нашу программу с адресом загрузки 0xFFF с параметром -fno-pic. В таком случае, линкер сгенерирует обращения к памяти по абсолютным адресам — если переменная лежит по адресу 0xFFF, то программа будет обращаться сразу к этому адресу памяти, без необходимости что либо динамически линковать. Именно такой подход использовался во времена ZX Spectrum, Commodore 64 и MS-DOS (однако там роль «виртуальной памяти» выполняла такая особенность 8086, как сегменты). У такого подхода есть и минусы: относительная невозможность загрузки сразу нескольких программ одновременно, зарезервированное пространство линейно отъест небольшой кусок памяти у основной прошивки, нет возможности динамической аллокации секций. Зато такой код теоретически будет работать быстрее, чем PIC.

    Проблемы реализации такого способа: иногда нужно лезть в систему сборки основной прошивки и патчить скрипт линкера так, чтобы он не трогал определенный регион памяти. В случае esp32, например, это требует патча в сам SDK и возможного «откола» от мейнлайн дистрибутива.

  3. Использовать программу с относительной адресацией, однако без сегментов .bss и .data. Самый простой в реализации способ, который к тому же очень экономичен к памяти, позволяет загружать программу в любое место и пользоваться всеми фишками динамического аллокатора и не требует вмешательств в основную прошивку, кроме примитивного загрузчика программ. Именно его я и предлагаю рассмотреть подробнее.


Недавно мы сидели в чате ELF-сцены (разработка нативных программ под телефоны Siemens, Sony Ericsson, Motorola и LG с помощью хаков) и думали, как же можно реализовать загрузчик сторонних программ на практически неизвестных платформах. Кто-то предлагал взять ELF под основу — однако с его реализацией под некоторые платформы есть трудности, а кто-то предлагал писать «бинлоадер» — самопальный формат бинарников, который получается из, например, тех же эльфов.

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

В это же время я копал SDK для Symbian и хорошо помнил, что в прикладных приложениях для этой ОС нет поддержки глобальных переменных вообще. Да, сегмент .data и .bss полностью отсутствует — переменные предлагается хранить в структурах. Почему так сделано? Всё дело в том, что каждая программа в Symbian — это dll-библиотека, которую загружает EKA и создаёт экземпляр CApaApplication. И дабы была возможность загрузить dll один раз для всех программ (что справедливо для системных библиотек), ребята полностью выкинули возможность использования любых глобальных переменных. А ведь идея интересная!

Однако в таком подходе есть несколько серьезных ограничений:

  • Отсутствие глобальных переменных может стать проблемой при портированиии уже существующего софта, хотя вашим программам ничего не мешает передавать в каждую функцию структуру с глобальным стейтом, который можно при необходимости изменять. Кроме того, нет ограничений на использование C++ (за исключением необходимости ручной реализации new/delete и отсутствием исключений).

  • Отсутствие преинициализированных данных. Вот это уже может стать относительно серьёзной проблемой, у которой, тем не менее, есть свои обходные решения. Например если вы храните команды для инициализации дисплея в таблице, или какие-либо калибровочные данные — вы не сможете их объявить, просто используя инициализаторы в C. Тоже самое касается и строковых литерал. Тут есть два варианта: часть таблиц можно вынести на стек (если эти самые таблицы достаточно маленькие), либо подгружать необходимые данные из бинарника с помощью основной прошивки (например, LoadString и т. п.).


Давайте же на практике посмотрим, имеет ли право на жизнь такой подход!

❯ Практическая реализация


Формат нашего бинарника будет до безобразия прост: небольшой заголовок в начале файла и просто сырой дамп сегмента .text, который можно экспортировать из полученного elf даже без необходимости писать скрипт для линкера. При этом нужно учесть, что ESP32 — это микроконтроллер частично Гарвардской архитектуры, т. е. шина данных и кода у него расположены отдельно. Однако у чипа есть полноценный MMU, который позволяет маппить регионы физической памяти в виртуальную память, чем мы и воспользуемся в итоге!

Заголовок нашего бинарника будет выглядеть вот так:

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

Программа общается с основной прошивкой посредством псевдо-syscall'ов: функции, которая в качестве первого аргумента ожидает номер нужной службы и один 32х-битный указатель для описания структуры с параметрами. Реализация syscall'ов — одна из самых простых и неприхотливых с точки зрения обратной совместимости с будущими прошивками.

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

Концептуально всё очень просто: GetGlobalStateSize сообщает нашему загрузчику размер структуры для хранения глобального стейта, в то время как Start уже фактически заменяет main() в нашей программе. Необходимости в crt0 нет, поскольку весь необходимый инит выполняет бутлоадер ESP32. Впрочем, при желании вы можете выделить отдельный стек для вашей программы — это повысит надежность, если выполняемая программа удумает испортить стек.

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

Собираем нашу программу:

xtensa-esp32-elf-cc.exe test.c -fno-pic -nostdlib -nostartfiles -Wl,--section-start=.text=0x0

xtensa-esp32-elf-objcopy.exe --only-section=.text --output-target binary a.out run.bin

-fno-pic отключает генерацию кода, зависимого от GOT, -nostdlib и -nostartfiles убирает из билда crt0 и stdlib, благодаря чему мы получаем только необходимый код. --section-start задает смещение для загрузки секции .text на 0x0 (в идеале это делать необходимо из скрипта для ld).
objcopy скопирует из полученного ELF только необходимую нам секцию .text.

Как же это работает на практике? Давайте дизассемблируем выходной бинарник и посмотрим, что у нас дает на выхлопе cc:

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

Обратите внимание, что Start вызывает подфункции с помощью инструкции CALLX8, которая в отличии от обычного Immediate-версии CALL8, выполняет переход относительно текущего адреса в PC, благодаря чему переход полностью независим от адреса загрузки программы в памяти. А благодаря тому, что все данные, в том числе и указатель на глобальный стейт передаются через стек, нет необходимости релокейтить сегменты данных.

По итогу всё, что нужно от загрузчика бинарников — это загрузить программу в память для инструкций, выделить память для структуры с стейтом программы и передать управление Start. Всё!
Конкретно в случае ESP32, у нас есть два возможных решения задачи загрузки программы в память:

  1. Загрузить программу в IRAM. Такая возможность теоретически есть, однако на практике загрузчик ESP32 устанавливает права только на чтение и выполнение на данный регион памяти. Попытка что-то скопировать туда закончится исключением SIGSEGV. Кроме того, сегмент IRAM относительно небольшой — всего около 200Кб.

  2. Самопрограммирование. Для этого, в esp32 есть два механизма — Partition API и SPI Flash API. Я выбрал Partition API для простоты реализации.


Для нашей прошивки необходимо будет переразметить флэш-память. Для этого запускаем idf.py menuconfig, идём в Partition Table -> Custom partition table CSV. Создаём в папке проекта partitions.csv, куда пишем:

# ESP-IDF Partition Table
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x6000,
phy_init, data, phy, 0xf000, 0x1000,
factory, app, factory, 0x10000, 1M,
executable, data, undefined, 0x110000, 0x10000

Для заливки программы можно использовать соответствующее Partition API, либо parttool.py:

parttool.py --port "COM41" write_partition --partition-name=executable --input "run.bin"

Переходим к загрузчику программы:

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

Прошиваем ESP32:

idf.py build

idf.py flash

idf.py monitor

И смотрим результат:

SysCall 25

SysCall 35

SysCall 15

Всё работает!

❯ Заключение


Как видите, ничего сложного в выполнении сторонних программ при условии соблюдении некоторых ограничений нет. Да, в таком подходе есть как серьезные плюсы, так и минусы, однако он делает своё дело и позволяет реализовать запуск игр на кастомных игровых консолях, или сторонних программ на самодельных компьютерах. Ну и конечно же не стоит забывать про плагины! Авось в вашем решении нужна возможность расширения функционала устройства, однако предоставлять исходный код или даже объектные файлы нет возможности — тогда вам может пригодится и такая методика.

Пожалуй, стоит упомянуть ещё один… очень своеобразный метод, который я иногда встречаю при реализации самодельных компьютеров. Люди пишут… эмуляторы 6502/Z80 :)
И если такой подход ещё +- применим к ESP32, то в AVR просадки производительности будут слишком серьезными. Так зачем, если можно использовать все возможности ядра на максимум?

Полезный материал?
Всего голосов:
Приходилось ли загружать сторонний код в ваших устройствах?
Всего голосов:
Показать полностью 9 2

Продолжение поста «Игровая легенда из 90-х: Как работала 3dfx Voodoo "под капотом"? Пишем 3D-приложение нуля на Glide (1/2)»

Это вторая часть лонга про 3dfx Voodoo. Пришлось разбить его на две части из-за ограничений в 30.000 символов на пост у Пикабу. Сначала читайте первую часть.

Продолжение поста «Игровая легенда из 90-х: Как работала 3dfx Voodoo "под капотом"? Пишем 3D-приложение нуля на Glide (1/2)» Гаджеты, Покупка, 3D графика, Графика, Программирование, C++, 3dfx, Voodoo, Видеокарта, 90-е, Железо, Старое железо, Ретро-игры, Игры, Ретро, YouTube, Ответ на пост, Длиннопост, Telegram (ссылка)

Скрин с криво-наложенной текстурой: здесь уже был настроен сэмплер, но неправильно. А ещё тут видно артефакты отсутствия Z-сортировки наглядно.

Пока не впечатляет, да? Где же текстуры? А об этом — в следующей главе!

❯ Текстуры


Плоские модельки без текстур — это не очень круто. Ну что можно сделать с плоскими моделями, пусть даже они будут с освещением?

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

Но в Glide всё было иначе — ведь там не было понятия текстуры как объекта! Как-так? Glide позволял нам получить верхнюю и нижнюю границу адресного пространства памяти одного конкретного TMU и программист волен был выгружать текстуру куда угодно! Затем программист сохранял указатель на текстуру в видеопамяти и передавал её… в комбайнер, дабы он мог использовать текстуру по назначению! При этом TMU даже характеристики текстур не знал — эту информацию отсылал программист.

TMU поддерживает множество пиксельформатов: RGB332 (8 бит на пиксель), RGB565 (16 бит на пиксель), палитровый и собственный формат сжатия с NCC-компрессией. Тем не менее, 565 у 3dfx требует какого-то особого формата пикселей, иначе текстуры превращаются в кашу. Благо для загрузки текстур с диска, в Glide есть удобные функции и тулза texUS для создания текстур и всего набора мипов для них — gu3dfGetInfo и gu3dfLoad. Кроме того, есть функция grTexCalcMemRequired для расчета необходимого размера для текстуры в видеопамяти с учетом мипов, формата и выравнивания.

Я не стал писать сложный аллокатор, поскольку игра не требует динамической видеопамяти и может сразу загрузить уровень «пачкой», а при загрузке следующего — просто освободить всю память.

https://pastecode.io/s/ruf14177

После этого, нам необходимо загрузить текстуру в видеопамять юнита с помощью grTexDownloadMipMap.

https://pastecode.io/s/260k0nrr

Как же теперь указать текстуру для сэмплинга, ведь glBindTexture здесь нет? Для этого есть функция glTexSource, которая принимает адрес первого мипа и конфигурацию текстуры — которая хранится на стороне ЦПУ!

https://pastecode.io/s/6ouq99eo

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

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

Продолжение поста «Игровая легенда из 90-х: Как работала 3dfx Voodoo "под капотом"? Пишем 3D-приложение нуля на Glide (1/2)» Гаджеты, Покупка, 3D графика, Графика, Программирование, C++, 3dfx, Voodoo, Видеокарта, 90-е, Железо, Старое железо, Ретро-игры, Игры, Ретро, YouTube, Ответ на пост, Длиннопост, Telegram (ссылка)

Запускаем программу и вот результат:


Да, первая полноценная 3D-модель с текстурой! Мы реализовали половину работы видеодрайвера вручную, однако по концовке всё равно очень приятно! Игры здесь пока ещё нет — материал вышел бы слишком большим.

❯ А где практика?



К сожалению, сегодня без практической части :( Изначально я думал что у меня всё схвачено и моя материнка на 478 с AGP-слотом вполне справиться с ролью тестового стенда для нашей демки. Однако, я не учел важный факт — существовало несколько физических версий AGP и на 478 уже поздний вариант с 1.5в/0.8в уровнями.

Материал был обещан в четверг на 11 утра, времени на заказ через почту у меня не было (новый год, посылки 1.5-2 недели задерживаются только на сортировке в Краснодаре), поэтому я начал написывать всем сервисникам у себя в городе, в надежде что у кого-то лежит на складе материнка на PGA370… в любом состоянии.

И материнка нашлась! Ей оказалась поздняя ECS P6IPAT на 815 чипсете с универсальным AGP-разъемом, который поддерживал все стандарты AGP одновременно. Продавал её мужичок всего за 100 рублей, сразу с процом и охладом :) Однако возникли определенные проблемы с поднятием платы (все электролиты необходимо менять «вкруг», а нужных номиналов под рукой не оказалось, плата стартовала раза с 3го) и накатыванием винды (помер IDE-привод), поэтому практическая часть немного откладывается…

Продолжение поста «Игровая легенда из 90-х: Как работала 3dfx Voodoo "под капотом"? Пишем 3D-приложение нуля на Glide (1/2)» Гаджеты, Покупка, 3D графика, Графика, Программирование, C++, 3dfx, Voodoo, Видеокарта, 90-е, Железо, Старое железо, Ретро-игры, Игры, Ретро, YouTube, Ответ на пост, Длиннопост, Telegram (ссылка)


❯ Заключение


И мы приходим к выводам, что для написания 3D-игры, программист в 90-х годах должен был как минимум:

  1. Иметь представлении о трансформации геометрии, что такое матрицы (геометрию можно трансформировать и без матриц, однако это не очень удобно).

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

  3. Иметь представление об основных техниках в растеризации 3D-графики: что такое перспективное деление, Z-буфер, форматы вершин, фильтрация текстур, мипмаппинг, затенение по Гуро, какие-либо методы анимации, если была необходимость и т. п.


Материал получился очень объёмным, для меня это абсолютный рекорд. Я старался собрать всю информацию о 3dfx Voodoo, которую изучил и поделится с вами не только архитектурой конкретно видеокарт, но и рассказать о программировании графических API на низком уровне и подробно рассказать, как же строится изображение «под капотом» и вашей видеокарты.

Касательно баек насчет 3dfx в СНГ: я лично родился в 2001 году, так что могу судить исключительно из услышанных мной баек и историй. А какая история с 3dfx Voodoo была у вас? Пишите в комментах!
Надеюсь, материал был вам интересен. :) Статья писалась несколько бессонных ночей, дабы успеть под новый год! Больше бэкстейджа, мыслей и проектов у меня вTelegram.

Материал подготовлен при поддержке TimeWeb Cloud. Подписывайтесь на меня и @Timeweb.Cloud, дабы не пропускать новые статьи каждую неделю!

Продолжение поста «Игровая легенда из 90-х: Как работала 3dfx Voodoo "под капотом"? Пишем 3D-приложение нуля на Glide (1/2)» Гаджеты, Покупка, 3D графика, Графика, Программирование, C++, 3dfx, Voodoo, Видеокарта, 90-е, Железо, Старое железо, Ретро-игры, Игры, Ретро, YouTube, Ответ на пост, Длиннопост, Telegram (ссылка)
Показать полностью 4

Игровая легенда из 90-х: Как работала 3dfx Voodoo «под капотом»? Пишем 3D-приложение нуля на Glide (1/2)

Игровая легенда из 90-х: Как работала 3dfx Voodoo «под капотом»? Пишем 3D-приложение нуля на Glide (1/2) Гаджеты, Покупка, 3D графика, Графика, Программирование, C++, 3dfx, Voodoo, Видеокарта, 90-е, Железо, Старое железо, Ретро-игры, Игры, Ретро, Видео, YouTube, Длиннопост

Полагаю, многие мои читатели так или иначе знакомы с такими видеокартами, как 3dfx Voodoo. Эти легендарные графические ускорители из середины\конца 90-х годов был чуть ли не в каждой второй сборке для игр, а о их производительности слагали легенды. До сих пор есть относительно небольшое сообщество фанатов ретро-игр, которые ценят, любят и собирают с цветмета те немногие видеокарты от 3dfx, что остались в СНГ. Однако обзоров на 3dfx Voodoo много, тестов игр — тоже, а вот материала «простыми словами» о его внутренней архитектуре и более того, практической части с написанием 3D-игры практически нет! Недавно я прикупил себе Voodoo 3, и начал зубрить Programmer's Manual с желанием запилить что-нибудь эдакое… Статью я долго и упорно готовил дабы успеть к новому году и сегодня у нас с вами: краткая история компании 3dfx, подробный разбор архитектуры видеочипов 3dfx «под капотом», что должен был уметь программист 3D-графики в 90х и написание 3D-приложения на Glide полностью с нуля. Интересно? Тогда жду вас в статье!

❯ Предисловие


Материал про архитектуру S3 ViRGE показал, что рубрика с разбором «подкапотки» видеочипов 90-х годов оказалась довольно интересной. Многие люди приходят почитать, поностальгировать в комментариях, а иногда даже пишут в личку и спрашивают детали реализации конкретных видеочипов! Думаю, эта рубрика станет одной из основных, в будущем году, мы рассмотрим с вами:

  1. PSP;

  2. PS1 (как раз читатель недавно задарил фаточку и слимку);

  3. ATI Rage;

  4. Вероятно, GeForce 2.

Игровая легенда из 90-х: Как работала 3dfx Voodoo «под капотом»? Пишем 3D-приложение нуля на Glide (1/2) Гаджеты, Покупка, 3D графика, Графика, Программирование, C++, 3dfx, Voodoo, Видеокарта, 90-е, Железо, Старое железо, Ретро-игры, Игры, Ретро, Видео, YouTube, Длиннопост

Само собой, я не мог пройти мимо 3dfx Voodoo. И дело не только в ценности и легендарности данных видеочипов, но и во внутренней архитектуре, которая очень сильно отличается от современных GPU. Про 3dfx я знаю уже более 10 лет, ещё с самой юности, а знакомство произошло в одном из выпусков «16-бит тому назад», однако прикупить себе один экземпляр решился только сейчас.

Игровая легенда из 90-х: Как работала 3dfx Voodoo «под капотом»? Пишем 3D-приложение нуля на Glide (1/2) Гаджеты, Покупка, 3D графика, Графика, Программирование, C++, 3dfx, Voodoo, Видеокарта, 90-е, Железо, Старое железо, Ретро-игры, Игры, Ретро, Видео, YouTube, Длиннопост

Чем же был обусловлен культовый статус 3dfx Voodoo с точки зрения игрока? В первую очередь, 3dfx Voodoo вышел достаточно рано и стал одним из первых (наряду с Rendition Verite) потребительских GPU с оптимальной производительностью и ценой для 3D-игр тех лет. Игры с полноценной 3D-графикой существовали и ранее: вспомнить хотя бы PS1, N64, или японские игровые автоматы из 90-х, однако в играх на ПК в те годы практически всегда был софтварный рендерер, а 3dfx Voodoo позволял достичь графики на уровне, а то и лучше домашних консолей тех лет. За год до выхода Voodoo 1, на рынке появился NVidia NV1 — мультимедийный чип, одной из задач которого было ускорение 3D-графики. Однако, он оперировал не треугольной геометрией, как это принято сейчас, а квадами — т.е прямоугольниками и не был совместим с основными графическими API тех лет, посему и популярности не получил.

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

  • Один FBI: Чип, отвечающий за обмен данными с хост-ПК через PCI/AGP и растеризацию треугольников. Это главный чип в видеокарте, который может работать в паре с другим FBI, образовывая систему из двух видеокарт — SLI.

  • До трёх TMU: Один или несколько чипов, отвечающий за сэмплинг — нанесение текстуры на треугольник. В процессе отрисовки геометрии, FBI передаёт на каждый из указанных программистом TMU данные о текстуре, которую требуется наложить и параметры наложения (фильтрация, мипы и.т.п).



Именно в те годы появилась гонка за объемами видеопамяти на борту и разделение их по классу. Видеокарта с общим объёмом памяти в 16Мб считалась гораздо круче видеокарты с 8Мб: и ведь действительно, больший объём VRAM позволял загрузить текстуры с более высоким разрешением, при этом на частоту видеоядра тогда смотрели гораздо реже.

Игровая легенда из 90-х: Как работала 3dfx Voodoo «под капотом»? Пишем 3D-приложение нуля на Glide (1/2) Гаджеты, Покупка, 3D графика, Графика, Программирование, C++, 3dfx, Voodoo, Видеокарта, 90-е, Железо, Старое железо, Ретро-игры, Игры, Ретро, Видео, YouTube, Длиннопост

Другим интересным моментом было собственное графическое API. В те годы доминировал OpenGL, пришедший к нам с профессиональных графических станций: SGI выделили собственное API в отдельную спецификацию, выкинули оттуда различные функции, не касающиеся вывода графики и сделали полностью открытой. В 1996 году, DirectX 2.0 с первой версией Direct3D только-только появился и был достаточно нестабильным GAPI (даже Кармак его ругал), а больше вариантов и не было. Результатом стало появление 3dfx Glide — низкоуровневого графического API, которое позволяло управлять видеокартой похожим на OpenGL путём, но при этом на ещё более низком уровне, имея возможность тонкой настройки всего конвейера. Одной из важных фишек Glide стала поддержка не только Windows, но и DOS, что было достаточно редким, если не уникальным случаем для тех лет.

Игровая легенда из 90-х: Как работала 3dfx Voodoo «под капотом»? Пишем 3D-приложение нуля на Glide (1/2) Гаджеты, Покупка, 3D графика, Графика, Программирование, C++, 3dfx, Voodoo, Видеокарта, 90-е, Железо, Старое железо, Ретро-игры, Игры, Ретро, Видео, YouTube, Длиннопост

Игры для 3dfx Voodoo не заставили себя ждать. Благодаря относительной простоте Glide и понятному мануалу, а также открытости SDK, начали появляться игры с поддержкой данного GAPI: Tomb Raider, MechWarrior, Quake — какие-то игры работали через прослойку (как вышеупомянутая квака, которая реализовывала прослойку Glide -> минимальное подмножество OpenGL, которого хватало для работы игры), какие-то нативно. Выход игр с поддержкой 3dfx Glide обеспечил успех новой видеокарте, поскольку игры зачастую не просто работали шустрее, но и выглядели гораздо симпатичнее.

Игровая легенда из 90-х: Как работала 3dfx Voodoo «под капотом»? Пишем 3D-приложение нуля на Glide (1/2) Гаджеты, Покупка, 3D графика, Графика, Программирование, C++, 3dfx, Voodoo, Видеокарта, 90-е, Железо, Старое железо, Ретро-игры, Игры, Ретро, Видео, YouTube, Длиннопост

После выхода первой 3dfx Voodoo, компания сосредоточилась на улучшении Glide и доработке архитектуры видео-ускорителей. В 1998 году, спустя два года после выхода первой Voodoo, компания выпустила Voodoo 2 с объемами памяти 8Мб (по 2Мб на TMU) или 12Мб (по 4Мб на TMU), которая архитектурно была похожа на первый видеочип, однако несла в себе несколько серьезных изменений:

  • 64-битная шина для обмена данными с TMU. Помимо этого, 3dfx отмечала то, что благодаря широкой шине, ей удалось реализовать сэмплинг сразу двух текстур за такт.

  • Поддержка Clip-Space координат. Прошлый видеочип рисовал треугольники в абсолютных координатах экрана, а не нормализованных, что в некоторой степени негативно влияло на производительность. При этом для обратной совместимости, поддержка абсолютных координат была оставлена.

  • Поддержка SLI для объединения двух видеокарт для обработки одного кадра. При этом каждая видеокарта работала над своим набором сканлайнов — строк на экране. То есть, первый видеочип мог обрабатывать нечетные строки, а второй четные.


Но тем не менее, 3dfx Voodoo оставались именно видео-ускорителями и полностью заменить видеокарту не могли, поскольку у них не было блока для работы с 2D-графикой (этот блок, в свою очередь, помимо софтварной поддержки VESA-режимов должен включать в себя аппаратное ускорение BitBLT, рисования некоторых примитивов и.т.п). По этой же причине, игры с использованием Glide нельзя было свернуть с помощью Alt-Tab (на самом деле можно, но хаком) и они не могут быть запущены в оконном режиме. По сути, 3dfx Voodoo подключался к полноценной 2D-видеокарте (которой мог быть и ATI Rage, и S3 ViRGE, и ISA-видеокарта с VGA) и полностью переключал сигнал на выход из своего RAMDAC при запуске игры. В общем, игры на Glide с точки зрения системы были простыми консольными приложениями — даже без собственных окон!

Игровая легенда из 90-х: Как работала 3dfx Voodoo «под капотом»? Пишем 3D-приложение нуля на Glide (1/2) Гаджеты, Покупка, 3D графика, Графика, Программирование, C++, 3dfx, Voodoo, Видеокарта, 90-е, Железо, Старое железо, Ретро-игры, Игры, Ретро, Видео, YouTube, Длиннопост

Немного позже, 3dfx добавила модуль 2D ускорения, сделав полноценную видеокарту, которая могла работать в системе в одиночку. В 1999 году, через год после релиза 3dfx Voodoo 2, вышла Voodoo 3, которая стала системой на кристалле и объединила FBI и два TMU в один кристалл. Видеокарта стала гораздо меньше и обзавелась интерфейсом AGP (который очень близок к PCI сам по себе).

Конкуренты у 3dfx Voodoo были серьезные, пожалуй, самым серьезным был ATI Rage: это была небольшая система на кристалле, которая помимо ускорения 3D-графики обладала декодером видео DVD-качества (в те времена, посмотреть видео в 480p и нормальном качестве с софтварным декодером возможно было далеко не на всех процессорах. Насколько мне известно, 486 и Pentium 1 сразу в пролете), умела выводить изображение на телевизор (сам себе домашняя игровая консоль!) и поддерживала не только D3D и OpenGL (причем насколько мне известно, OpenGL поддерживался плохо и такая тенденция сохранялась до покупки ATI компанией AMD), но и собственное проприетарного GAPI ATI CIF (C Interface), которое обладало весьма широкими возможностями и было… ну очень низкоуровневым, приходилось вручную создавать контекст DirectDraw, аттачить его к 3D-контексту, вручную делать backface-отсечение и т. п.

Игровая легенда из 90-х: Как работала 3dfx Voodoo «под капотом»? Пишем 3D-приложение нуля на Glide (1/2) Гаджеты, Покупка, 3D графика, Графика, Программирование, C++, 3dfx, Voodoo, Видеокарта, 90-е, Железо, Старое железо, Ретро-игры, Игры, Ретро, Видео, YouTube, Длиннопост

Нельзя не вспомнить и за Riva TNT: очень шустрая видеокарта для своих лет, которая также обладала ТВ-выходом и хорошей поддержкой OpenGL. Кроме того, Riva TNT гораздо лучше себя проявляла при 24-х битном цвете: 3dfx Voodoo отрисовывала всё в 16-битном формате. Вон, люди на Riva TNT как-то даже в Морровинд играли!

Игровая легенда из 90-х: Как работала 3dfx Voodoo «под капотом»? Пишем 3D-приложение нуля на Glide (1/2) Гаджеты, Покупка, 3D графика, Графика, Программирование, C++, 3dfx, Voodoo, Видеокарта, 90-е, Железо, Старое железо, Ретро-игры, Игры, Ретро, Видео, YouTube, Длиннопост

Ну и конечно же была конкуренция в бюджетном сегменте рынка. 3dfx поставляла OEM-видеокарты для сборщиков ПК, в том числе и недорогие. Тут уж конкуренция была серьезнее: и PowerVR с десктопной видеокартой, и Intel с i740 (эдакий предок GMA), и видеокарты от SiS, и конечно же S3 Graphics!

В пост-советском пространстве, 3dfx Voodoo была достаточно дорогой и для некоторых оставалась мечтой. Ситуация изменилась ближе к 1999-2001 годам, когда 3dfx с Voodoo 4 и Voodoo 5 была на грани банкротства из-за отсутствия T&L и программируемых шейдеров, а NV и AMD взяли верх, то и Voodoo начали стоить адекватных денег на вторичке: тут уже и GeForce 3 с шейдерами подоспевал, но более бедные геймеры все еще могли поиграть в Quake 3 и другие игры с приемлемым FPS!

Наш сегодняшний герой будет на 3 года меня старше — мой выбор пал на 3dfx Voodoo 3 на 8Мб в AGP-версии, которая среди любителей видеокарт 3dfx считается «не трушной» и посему, самой дешевой. Основной причиной выбора Voodoo 3 была достаточно низкая цена на конкретно это поколение видео-ускорителей — я заплатил 3.400 рублей. 1 и 2 Voodoo стоят в среднем от 4-5 тысяч рублей, а цены Voodoo 4 улетают в космос. Так что скромненько, конечно, но тоже нормально :)

Игровая легенда из 90-х: Как работала 3dfx Voodoo «под капотом»? Пишем 3D-приложение нуля на Glide (1/2) Гаджеты, Покупка, 3D графика, Графика, Программирование, C++, 3dfx, Voodoo, Видеокарта, 90-е, Железо, Старое железо, Ретро-игры, Игры, Ретро, Видео, YouTube, Длиннопост

Придя домой и распаковав посылку, я сразу же установил Glide SDK и принялся изучать Programmers Manual, дабы запилить что-нибудь интересное…

❯ Архитектура «под капотом»


Но сначала давайте поговорим об архитектуре 3dfx Voodoo «под капотом», на более низком уровне, дабы было общее понимание, что и как работает. Без этого, понять принцип работы GAPI и видеокарты в целом может быть сложно. Предлагаю рассмотреть FBI, TMU и RAMDAC по отдельности:

Игровая легенда из 90-х: Как работала 3dfx Voodoo «под капотом»? Пишем 3D-приложение нуля на Glide (1/2) Гаджеты, Покупка, 3D графика, Графика, Программирование, C++, 3dfx, Voodoo, Видеокарта, 90-е, Железо, Старое железо, Ретро-игры, Игры, Ретро, Видео, YouTube, Длиннопост

FBI — FrameBuffer Interface. Как уже было сказано выше, этот модуль является основой видеоускорителя: в его задачи входит коммуникации через PCI/AGP, растеризация примитивов, клиппинг, расчет вершинного освещения, подготовка текстур к заливке на TMU, перспективная коррекция, альфа-блендинг и работа с Z-буфером, а также двойная/тройная буферизация и управление самим фреймбуфером.

Игровая легенда из 90-х: Как работала 3dfx Voodoo «под капотом»? Пишем 3D-приложение нуля на Glide (1/2) Гаджеты, Покупка, 3D графика, Графика, Программирование, C++, 3dfx, Voodoo, Видеокарта, 90-е, Железо, Старое железо, Ретро-игры, Игры, Ретро, Видео, YouTube, Длиннопост

В Voodoo 3, под радиатором находится система на кристалле, где FBI и TMU находятся в одном чипе.

FBI делились на несколько поколений — SST-1 (3dfx Voodoo 1), SST-96 (3dfx Voodoo 2) и.т. п. Судя по всему, у одного FBI могло быть несколько ревизий, но в чем их отличие — неизвестно.

Игровая легенда из 90-х: Как работала 3dfx Voodoo «под капотом»? Пишем 3D-приложение нуля на Glide (1/2) Гаджеты, Покупка, 3D графика, Графика, Программирование, C++, 3dfx, Voodoo, Видеокарта, 90-е, Железо, Старое железо, Ретро-игры, Игры, Ретро, Видео, YouTube, Длиннопост

Для нужд FBI выделено строго 2Мб видеопамяти, которые используются для 3 буферов, один из которых можно использовать для произвольных целей. Первые два буфера называются Front и Back буферами и отображают то, что сейчас находится на экране, а третий является aux-буфером с 16-битным форматом цвета, который можно использовать для альфа-блендинга, либо как Z-буфер. Видеокарта поддерживает несколько форматов фреймбуфера, однако «под капотом» все расчёты ведутся в 16-битном RGB565 — что когда-то и стало «визитной карточкой» видеокарт 3dfx. Программист может получить прямой доступ к записи в буфер экрана с помощью lfb-функций (аналог в OpenGL — glCopyPixels/glReadPixels).

Игровая легенда из 90-х: Как работала 3dfx Voodoo «под капотом»? Пишем 3D-приложение нуля на Glide (1/2) Гаджеты, Покупка, 3D графика, Графика, Программирование, C++, 3dfx, Voodoo, Видеокарта, 90-е, Железо, Старое железо, Ретро-игры, Игры, Ретро, Видео, YouTube, Длиннопост

Для FBI выделен отдельный чип памяти на 2Мб или 4Мб. При 2Мб, максимальное разрешение с Aux-буфером составляло 640x480, без Aux-буфера — 800x600, при 4Мб можно было создать буфер с разрешением 800x600, при этом с Aux-буфером.

Ключевой особенностью растеризатора FBI в SST-1 была в том, что вся отрисовка геометрии происходила в абсолютных оконных координатах. В 3D-графике принято все расчеты проводить в т. н. Clip-Space координатах, которые представляют из себя нормализованные экранные координаты (NDC) в пределах -1..1. То есть, точка 0 — центр экрана, -1 — левая сторона экрана, 1 — правая. В SST-1 же все вершины рисовались сразу же в экранных координатах, то есть так:

Игровая легенда из 90-х: Как работала 3dfx Voodoo «под капотом»? Пишем 3D-приложение нуля на Glide (1/2) Гаджеты, Покупка, 3D графика, Графика, Программирование, C++, 3dfx, Voodoo, Видеокарта, 90-е, Железо, Старое железо, Ретро-игры, Игры, Ретро, Видео, YouTube, Длиннопост

В 3dfx Voodoo 2 ввели расчеты в Clip-Space, пояснив что растеризация в абсолютных оконных координатах слишком медленная для будущих поколений видеокарт. По итогу, если программисты хотели, чтобы их игра работала на 3dfx Voodoo 1, им нужно было выбирать «старый» режим работы и преобразовывать Clip-Space координаты в оконные вручную.

Игровая легенда из 90-х: Как работала 3dfx Voodoo «под капотом»? Пишем 3D-приложение нуля на Glide (1/2) Гаджеты, Покупка, 3D графика, Графика, Программирование, C++, 3dfx, Voodoo, Видеокарта, 90-е, Железо, Старое железо, Ретро-игры, Игры, Ретро, Видео, YouTube, Длиннопост

Как уже было сказано выше, вся видеопамять выделялась отдельным TMU и FBI. Но где-же тогда хранилась геометрия? Опытный читатель помнит про такие функции, как glBegin/glEnd. В те годы, видеопамять было принято считать именно текстурной, а геометрию пересылал процессор каждый кадр вручную — причём сразу же трансформированную, подготовленную для вывода на экран. Для каждой вершины в примитиве был свой набор регистров, задающий координаты, цвет и UV для текстур, что и позволяло сделать гибкий формат вершин, чем активно пользуется Glide.

Игровая легенда из 90-х: Как работала 3dfx Voodoo «под капотом»? Пишем 3D-приложение нуля на Glide (1/2) Гаджеты, Покупка, 3D графика, Графика, Программирование, C++, 3dfx, Voodoo, Видеокарта, 90-е, Железо, Старое железо, Ретро-игры, Игры, Ретро, Видео, YouTube, Длиннопост

Если говорить совсем уж просто, то 3dfx Voodoo был растеризатором треугольников, который ко всему прочему умел Backface-отсечение. Например, не было Near-clipping'а — процесса перестроения примитивов, вершины которых частично уходят за камеру. Если этого не делать — то когда примитив уйдет за камеру, мы все равно продолжим видеть его на экране, а если это дело аппроксимировать, отсекая целые примитивы — некоторая геометрия будет пропадать, если расположена слишком близко к камере. Многие концепции отрисовки 3D-графики программист должен был знать заранее, никаких упрощений, как с современными GAPI, не было.

TMU — Texture Mapping Unit. Как уже было сказано ранее, этот чип отдельно отвечал за сэмплинг текстур, а также управление своими банками видеопамяти и отправкой конечного результата обратно FBI.

Ключевой особенностью TMU была поддержка комбайнеров — своеобразная альтернатива пиксельных шейдеров в те годы. Программист мог задать функцию и параметры работы каждого TMU, дабы он мог выполнять операции умножения текстуры на цвет, или, например, использовать текстуру как маску, манипулировать её альфаканалом и сэмплить сразу две текстуры за один проход! В те годы сама возможность отрисовать геометрию с несколькими текстурами за один проход (т.е за один вызов DrawTriangle) была прорывом и позволяла, например, вместо двух вызовов отрисовки стен в квейке (один проход для текстурированной стены, второй, отрисованный с блендингом, для лайтмапы) рисовать стены за один проход:

Игровая легенда из 90-х: Как работала 3dfx Voodoo «под капотом»? Пишем 3D-приложение нуля на Glide (1/2) Гаджеты, Покупка, 3D графика, Графика, Программирование, C++, 3dfx, Voodoo, Видеокарта, 90-е, Железо, Старое железо, Ретро-игры, Игры, Ретро, Видео, YouTube, Длиннопост

Максимальный размер текстуры — 256x256 пикселей, также была поддержка текстур с нестандартным соотношением сторон и мипмаппинга (техника, которая позволяет убрать рябь на дальних текстурированных объектах с помощью снижения разрешения текстуры в зависимости от дистанции до наблюдателя). Поддержки Non Power Of Two (не кратные степени двойки) текстур не было вообще. Поддерживалась билинейная и Point-фильтрация. По какой-то причине, 3dfx не могли сделать поддержку текстур большего разрешения чем 256х256, в то время как первая Riva TNT уже умела в текстуры 1024х1024.

Игровая легенда из 90-х: Как работала 3dfx Voodoo «под капотом»? Пишем 3D-приложение нуля на Glide (1/2) Гаджеты, Покупка, 3D графика, Графика, Программирование, C++, 3dfx, Voodoo, Видеокарта, 90-е, Железо, Старое железо, Ретро-игры, Игры, Ретро, Видео, YouTube, Длиннопост

Память у каждого TMU была отдельной, а Glide как GAPI не предоставлял никакого аллокатора для хранения текстур, программист должен был распоряжаться видеопамятью полностью сам. При этом каждый TMU может сэмплить текстуры только из своей памяти.
Текстуры загружались сразу в виде набора мипмап, однако сам сет мипов мог быть не полным и мог быть расположен в нескольких регионах памяти «вразброс». Таким образом, частично решалась проблема фрагментации памяти. Тем не менее, в те годы динамическая загрузка ресурсов на уровне — весьма нечастое явление, поэтому все текстуры можно было линейно загрузить в память и не заморачиваться с менеджментом.

DAC — RAMDAC производства компании ICS. Данный чип служит для вывода определенной части видеопамяти, т.е фреймбуфера на монитор. Дело в том, что старые VGA-мониторы с ЭЛТ, по электрической части были аналоговыми: на входе было три сигнала — красный, зеленый и синий, а также сигнальные линии горизонтальной и вертикальной синхронизации. Поскольку многие видеокарты не имели на борту ЦАП'а, в 90-х и начале нулевых устанавливались отдельные RAMDAC'и для фактического вывода картинки на дисплей. При этом вывод на ТВ с помощью «тюльпанов» мог реализовываться ещё одним RAMDAC'ом — уже специально для ТВ.

Игровая легенда из 90-х: Как работала 3dfx Voodoo «под капотом»? Пишем 3D-приложение нуля на Glide (1/2) Гаджеты, Покупка, 3D графика, Графика, Программирование, C++, 3dfx, Voodoo, Видеокарта, 90-е, Железо, Старое железо, Ретро-игры, Игры, Ретро, Видео, YouTube, Длиннопост

Сами по себе ЭЛТ-мониторы формально не имели такого понятия, как разрешение, однако существовало несколько общепринятых «пиксельклоков» — частот стробов HSYNC и VSYNC, которые и задавали виртуальное разрешение дисплея. Управляя настройками RAMDAC, FBI мог настраивать разрешение картинки, частоту синхронизации и иные параметры — например, настройки гаммы. Именно от используемого RAMDAC зависело качество изображение на ЭЛТ-мониторе, с плохим RAMDAC картинка как-бы «плыла».

❯ Настраиваем окружение


Дабы пилить игры под 3dfx Voodoo, необязательно иметь ПК на WinXP и тулчейн уровня VC98. Строго говоря, даже самой видеокартой обладать необязательно — существует множество эмуляторов Glide, которые перехватывают вызовы игр к GAPI и преобразуют их в вызовы отрисовки D3D или Vulkan, что позволяет отлаживать ваши игры в профайлере.

Игровая легенда из 90-х: Как работала 3dfx Voodoo «под капотом»? Пишем 3D-приложение нуля на Glide (1/2) Гаджеты, Покупка, 3D графика, Графика, Программирование, C++, 3dfx, Voodoo, Видеокарта, 90-е, Железо, Старое железо, Ретро-игры, Игры, Ретро, Видео, YouTube, Длиннопост

Glide в его нативном виде работает под Windows XP. Поэтому минимальный тулчейн, который можно использовать — это VC2015 с поддержкой Windows XP. Но если вы хотите максимальной «трушности» и иметь возможность запускать софт на Win98/Win95 — нужно использовать Visual Studio 2005. При этом, совершенно необязательно отказываться от плюшек современных IDE: Visual Studio автоматически подхватывает все установленные тулчейны в системе, достаточно лишь выбрать нужный:

Игровая легенда из 90-х: Как работала 3dfx Voodoo «под капотом»? Пишем 3D-приложение нуля на Glide (1/2) Гаджеты, Покупка, 3D графика, Графика, Программирование, C++, 3dfx, Voodoo, Видеокарта, 90-е, Железо, Старое железо, Ретро-игры, Игры, Ретро, Видео, YouTube, Длиннопост

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

Ну что ж, на этом интро-часть материала закончена. Самое время перейти от теории к практике!

❯ Инициализация


Концептуально Glide очень близок к OpenGL, поэтому тем людям, кто имел опыт программирования 3D-графики, сам процесс настройки стейтов и рисования примитивов будет знаком. Однако поскольку основной целью Glide было создание облегченного GAPI, которое только рисует примитивы и управляет текстурными юнитами, мы не найдем здесь utility-функций (в Glide 2.x они были, причем очень даже полезные, но в 3.x gu убрали), таких как работа с матрицами — множество вещей нужно реализовывать самому, полностью с нуля. Однако я постараюсь подробно и понятно всё объяснить, в свойственной мне манере!

Наша игра начинается с инициализации и конфигурации контекста Glide, который может быть только один в системе. Связано это с тем, что каждое приложение эксклюзивно занимает ВСЕ ресурсы видеочипа для себя — возможности рисовать в отдельное окно, напоминаю, нет. Инициализация очень простая: сначала нужно проверить количество видеочипов в системе, а затем выбрать один из них как основной и создать контекст. Все сниппеты будут на pastebin.com - у Pikabu нет тега "код", а число картинок ограничено :(

Параметры нашего контекста: разрешение 640x480 в формате RGBA и частотой обновления 60Гц, два буфера для двойной буферизации и один aux-буфер для Z-буфера.

https://pastebin.com/FymhyC9a

Всё! Ни окон создавать не нужно, ни ловить события через WndProc. Просто создал контекст — и уже можно в цикле продолжать работу. После этого, нам нужно настроить состояние контекста — базовая концепция в программировании графики, которая заключается в том, что у видеокарты есть множество стейтов, которые управляют выводом итоговой картинки на экран. Примеры стейтов: цвет освещения, ширина линий, Z-буфер и Color-буфер.

Для того, чтобы наша игра работала даже на первых видеоускорителях 3dfx, нам необходимо выбрать абсолютную координатную систему, а также настроить Depth-буфер и Cull-mode. Cull-mode, или Backface culling позволяет отсекать примитивы, если они повернуты к камере обратной стороной — это позволяет не рисовать лишние фрагменты. Именно из-за этой техники, залетая внутрь модельки простенького здания или персонажа, внутри она оказывается прозрачной!

https://pastecode.io/s/6zus1qbg

Буфер глубины — это дешевая screen-space техника отрисовки перекрываемой друг другом геометрии без фактической сортировки примитивов по отдалению от камеры. Суть простая: каждая вершина треугольника имеет собственную координату Z, которая и обозначает дальность вершины от камеры. При растеризации треугольника, Z-значение интерполируется и записывается в картинку точно таких-же размеров, как и основное игровое окно, только вместо цвета записывается это самое Z-значение.

При отрисовке следующих примитивов, видеокарта проверяет Z-координату рисуемых треугольников с Z-координатами в буфере и если Z-координата фрагмента больше (т.е объект за другим объектом), видеокарта просто не рисует пиксель.

В классических GAPI принято использовать режимы сравнения LEQUAL и LESS, однако с буфером глубины в Glide есть особенности: в самой видеокарте они хранятся в виде целочисленного 16-битного short (т.е до 65535 значений), причем обратного (1 / z). Поэтому в нашем случае, чем объект дальше от камеры, тем меньше его Z-координаты, а посему для корректной сортировки нужно необходимо выставлять режим сравнения GREATER. Но об этом немного позже — когда дойдем до фактической отрисовки треугольников.

Переходим к настройкам формата вершины.

https://pastecode.io/s/pwswyjtc

Как я уже говорил ранее, 3dfx Voodoo оперирует координатами в абсолютных экранных координатах, про 3D он формально ничего не знает. Создать трёхмерное представление — задача программиста. X и Y — координаты треугольника в экранных координатах, Z-значение — для указания дальности вершины от камеры и сортировки, Q — т. н/ W-координата, необходимая для перспективного деления и перспективно-корректного текстурирования (про второе позже). R, G, B, A — цвет вершины. Позволяет, например, раскрасить ландшафт с помощью комбайнера в несколько проходов, или просто сделать модельку любого цвета, а TmuVertex — UV-координаты для корректного наложения текстур. Подробнее об этом будет в разделе текстур.

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

Это по сути минимальная инициализация Glide для рисования трёхмерной графики. После создания контекста, мы увидим синий экран. Нормальный синий экран/ :)

Игровая легенда из 90-х: Как работала 3dfx Voodoo «под капотом»? Пишем 3D-приложение нуля на Glide (1/2) Гаджеты, Покупка, 3D графика, Графика, Программирование, C++, 3dfx, Voodoo, Видеокарта, 90-е, Железо, Старое железо, Ретро-игры, Игры, Ретро, Видео, YouTube, Длиннопост

❯ Рисуем примитивы


Теперь переходим к самому интересному — рисованию треугольников! Однако до полноценного 3D-представления нам пока ещё рано. Сначала хотя-бы просто научиться выводить примитивы на экран.
Впрочем, ничего сложного в этом нет.

Перед рисованием геометрии, нам необходимо очистить (т. е. залить одним цветом) бэкбуфер и Depth-буфер. Бэкбуфер необходимо очищать только если ваша сцена не перекрывает весь экран — т. е. в ней есть не закрашенные участки. На современных видеокартах эта операция бесплатная, однако на видеокартах 90х от нее есть некоторый оверхед. Если бэкбуфер не чистить, то при передвижении камеры, мы будем наблюдать т.н «эффект зеркал» — поскольку новая геометрия рисуется поверх старой, то мы будем видеть старый кадр внахлест с новым:

grBufferClear(RGB(0, 128, 0), 0, 0);

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

https://pastecode.io/s/585e1ha9

Откуда же берутся текстуры, окраска и освещение, спросите вы? Может, есть какая-то система материалов как в Unity/UE? Дойдем и до этого, уже совсем скоро!

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

grBufferSwap(1);

Теперь у нас есть треугольник, выведенный средствами 3dfx Voodoo! Уже неплохое начало, но… где обещанное 3D!? Об этом — в следующем разделе!

❯ Математика и трансформации


Приготовьтесь, этот раздел будет звучать как учебник по матану — относительно сложно, но я постарался объяснить как можно проще и понятнее :) Если всё таки окажется сложновато — переходите к коду, понять будет гораздо проще. Строго говоря, по началу вам вообще необязательно знать детали реализации перемножения матриц и самих матриц трансформации, поскольку есть очень удобные математические библиотеки (glm и DXMath, например).

Важной составляющей в 3D-графике являются трансформации и матрицы. Если говорить простыми словами, то матрицы — многомерный массив чисел (в 3D-графике матрицы обычно имеют размерность 4х4), который позволяет представить трансформацию нашей будущей геометрии — например, модельки кораблика или героя. Например, умножив матрицу поворота на матрицу перемещения:

Matrix.RotationY(Math.DegToRad(90)) * Matrix.Translation(0, 0, 10);

Мы передвинем персонажа на 10 юнитов и повернем его на 90 градусов по оси Y. Например, компонент Transform в Unity строит мировую матрицу на основе позиции, поворота и масштабирования, которые вы задаете в инспекторе/коде.

В 3D-графике есть три основные матрицы, которые отвечают за положение объекта в мире и его представление из глаз наблюдателя:

  • Мировая матрица/матрица модели (OpenGL) — Положение рисуемой геометрии в глобальных мировых координатах. Пример с передвижением и поворотом относится именно к мировой матрице.

  • Матрица вида — Положение камеры в игровом мире. Трансформация камеры в мире имеет инвертированную систему координат — поскольку все передвижения объектов в глазах игрока — это как-бы вычитание позиции камеры из позиции объекта. Это значит, что для соответствия систем координат, все углы поворота и координаты необходимо инвертировать (-x, -y, -z). Умножив мировую матрицу на матрицу вида — мы получим координаты геометрии в пространстве наблюдателя.

  • Матрица проекции — Самая непонятная для некоторых матрица. Именно она преобразует координаты из пространства наблюдателя в Clip-Space (т.е абсолютные координаты треугольников в пространстве окна) и выдает нам W-координату, необходимую для перспективной проекции!


Таким образом, перед тем как быть нарисованной на экране, каждая вершина должна быть умножена на три матрицы — World/Model, View, Projection. Затем, на полученную матрицу необходимо умножить координаты самой вершины (в свою очередь, координаты вершины — это само строение 3D-модели):

vertex * (model * view * projection)

Насколько мне известно, с математической точки зрения это неверно — матрицы могут быть умножены только на матрицы той-же размерности. 4х-мерный вектор матрицой вообще не является, но там используется своя формула. Пожалуй, совсем уж в детали реализации математики не буду — это за рамками содержания статьи, но для общего понимания принципа работы 3D-графики, не только на 3dfx Voodoo, это необходимо.

Переходим к деталям реализации, здесь уже всё гораздо проще. Ниже приведена примитивнейшая, неэффективная и неоптимизированная «матлиба». Ну а что вы хотели, у нас таргет — Pentium MMX, там даже SIMD не было. :) Зато вполне наглядно.

https://pastecode.io/s/n1gb0c8u

И вот, наконец-то мы переходим к отрисовке самой графики!

❯ Рисуем 3D-модель!


Итак, что мы поняли из предыдущих разделов? Первым делом, нам нужно умножить каждую вершину на матрицу ModelViewProjection и исходя из позиционирования в абсолютных координатах, перевести координаты из Clip space в оконные. Ничего сложного!

Но сначала, давайте загрузим модельку. Я быстренько состряпал конвертер из SMD (собственный загрузчик, который таскаю из проекта в проект) в свой формат моделей.

https://pastecode.io/s/gakxwcbg

И написал загрузчик. Обратите внимание, что формат вершин для Glide и для ваших вершин должен отличаться!

https://pastecode.io/

Теперь, когда у нас есть 3D-модель, её можно нарисовать.
Сначала нам необходимо трансформировать каждую вершину геометрии в Clip-space, матрица — ModelViewProj. Обратите внимание, что на этом этапе, нормальный рендерер реализовывает клиппинг геометрии. У нас его нет, используется аппроксимация, что обязательно будет выливаться в пропадание геометрии, если одна из её вершин уходят «назад» за камеру. Современные видеокарты делают клиппинг аппаратно:

https://pastecode.io/s/x6fs137q

После того, как мы подготовили вершины, необходимо преобразовать их из Clip-Space в абсолютные координаты окна и посчитать для них UV в координатной системе 3dfx Voodoo:

https://pastecode.io/s/amtmjmkw

Обратите внимание на то, что каждая координата в Clip-Space делится на координату W — это называется перспективным делением, благодаря которому вершины отдаляются и приближаются в зависимости от позиции относительно глаз игрока! Здесь же рассчитывается координата Z для отрисовки перекрытой геометрии.

Перевод из Clip-Space в абсолютные координаты:

#define XVALUE_TO_WINDOW_SPACE(srcX, width) (width / 2) + (srcX * width);

#define YVALUE_TO_WINDOW_SPACE(srcY, width) width - ((width / 2) + (srcY * width));

И теперь, мы наконец-то, готовы нарисовать 3D-модель! Обратите внимание, что UV-координаты переводятся из 0..1 в 0..255 из-за особенностей TMU.

https://pastecode.io/s/3pcp07ba

Игровая легенда из 90-х: Как работала 3dfx Voodoo «под капотом»? Пишем 3D-приложение нуля на Glide (1/2) Гаджеты, Покупка, 3D графика, Графика, Программирование, C++, 3dfx, Voodoo, Видеокарта, 90-е, Железо, Старое железо, Ретро-игры, Игры, Ретро, Видео, YouTube, Длиннопост

Вторая часть материала вот здесь. Пришлось бить на две части из-за ограничения в 30.000 символов.

Больше бэкстейджа, мыслей и проектов у меня вTelegram.

Показать полностью 23 1

DongShan Pi Pico-W: крошечный одноплатник с современным чипсетом за 600 рублей

DongShan Pi Pico-W: крошечный одноплатник с современным чипсетом за 600 рублей Гаджеты, Покупка, Девайс, Одноплатный компьютер, Компьютер, Минипк, Raspberry pi, Orange pi, Дешево, Своими руками, Embedded, Электронные сигареты, Разработка, Linux, Nix, Длиннопост



Китайские производители не перестают удивлять: многие видят явные перспективы рынка одноплатных компьютеров и стараются представить целую линейку девайсов на самых разных чипсетах, а разработчики стараются использовать уже привычное и поддерживаемое долгие годы железо. К ним относятся решения на чипсетах AllWinner, RockChip, Tegra. Другие же стараются взять малоизвестный, но дешевый чип для иного круга применений, развести на нем компактную плату и продавать по цене пачки сухарей, подобные решения появляются регулярно. Один из таких одноплатников я недавно купил на AliExpress — некий DongShan Pi Pico W, на базе экзотического чипсета SigmaStar SSD210, всего за 600 рублей. И тут действительно есть на что посмотреть: два ядра Cortex-A7, контроллер TTL матриц, 2D GPU, Wi-Fi, 64Мб ОЗУ и Embedded Linux на борту. Более того, девайс поставляется в виде System on Module с переходной Evaluation-платой, что позволяет использовать это устройство в составе других гаджетов! Что это за красавец и на что он способен? Читайте в статье!!

❯ Что это за девайс?


Думаю, большинство моих читателей когда-либо слышали об одноплатных компьютерах. Это компактные и достаточно мощные устройства, которые можно использовать как в качестве компактных серверов или даже десктопных машин, так и собрать своё устройство на базе готового одноплатного компьютера. Одноплатники используется во многих сферах: вендинговые автоматы, умные экраны, самопальные игровые консоли и смартфоны, DIY-ноутбуки!

DongShan Pi Pico-W: крошечный одноплатник с современным чипсетом за 600 рублей Гаджеты, Покупка, Девайс, Одноплатный компьютер, Компьютер, Минипк, Raspberry pi, Orange pi, Дешево, Своими руками, Embedded, Электронные сигареты, Разработка, Linux, Nix, Длиннопост



Однако чаще всего можно увидеть обзоры и проекты на базе довольно известных устройств: Raspberry Pi, Orange Pi, Olimex. Эти платы, скажем так, достаточно дорогие: и если Orange Pi One/Zero ещё можно ухватить за 1.000 рублей на вторичке (один из таких я купил еще летом. Узнав о моем блоге, продавец стал моим читателем и вместо одного OPi прислал мне целых два — один в подарок!), а за RPi Zero придется выложить как минимум 2.000 рублей. Однако есть ещё один сегмент одноплатных компьютеров: ультра-дешевые, разработанные на базе чипов для конкретного применения. Один из самых известных представителей — MangoPi/CherryPi R3, который работает на базе AllWinner F1C200s — чипа для… электронных книг!

DongShan Pi Pico-W: крошечный одноплатник с современным чипсетом за 600 рублей Гаджеты, Покупка, Девайс, Одноплатный компьютер, Компьютер, Минипк, Raspberry pi, Orange pi, Дешево, Своими руками, Embedded, Электронные сигареты, Разработка, Linux, Nix, Длиннопост



Информации по дешевым, почти неизвестным одноплатникам довольно мало. У них не очень хорошая поддержка (кроме AllWinner, там почти все чипсеты есть в mainline-ветке Linux), в них могут обнаружится аппаратные баги, да и многие люди вообще не замарачиваются с ними, предпочитая переплатить, но купить что-то более стабильное. Но не я! Я просто обожаю различные ультрадешевые девайсики, поэтому недавно по наводке моего активного читателя NutsUnderline, я заказал интереснейший девайс — DongShan Pi Pico-W. Устройство обошлось мне всего в 600 рублей, но в первую очередь, меня привлек форм-фактор устройства и его чипсет. Некий SigmaStar SSD210!

DongShan Pi Pico-W: крошечный одноплатник с современным чипсетом за 600 рублей Гаджеты, Покупка, Девайс, Одноплатный компьютер, Компьютер, Минипк, Raspberry pi, Orange pi, Дешево, Своими руками, Embedded, Электронные сигареты, Разработка, Linux, Nix, Длиннопост




Я заказал сразу два устройства: первую партию очень быстро разобрали, поэтому я взял «с запасом». Сейчас конкретно этот одноплатник пока-что не доступен в магазине продавца, однако у него же продаются другие устройства на базе SSD210. Можете найти их по ключевому слову: «SSD210» (прямые линки публиковать не буду, дабы не сочли за рекламу). Через месяц оба красавца пришли ко мне и я принялся их изучать.

DongShan Pi Pico-W: крошечный одноплатник с современным чипсетом за 600 рублей Гаджеты, Покупка, Девайс, Одноплатный компьютер, Компьютер, Минипк, Raspberry pi, Orange pi, Дешево, Своими руками, Embedded, Электронные сигареты, Разработка, Linux, Nix, Длиннопост



Какое же было моё удивление, когда я обнаружил, что это по сути System on Module, который вручную надо припаять к Evaluation-плате! Вкратце это значит, что на базе таких SoM вы можете развести плату, протравить её, а затем припаять одноплатник поверх нее и сделать своё полноценное устройство, «без соплей»! Производителю плюсик за такую гибкость — я не очень люблю одноплатники с штырьковыми гребенками. Хотя, конечно, это очень сильно помогает при разработке макета устройства.

DongShan Pi Pico-W: крошечный одноплатник с современным чипсетом за 600 рублей Гаджеты, Покупка, Девайс, Одноплатный компьютер, Компьютер, Минипк, Raspberry pi, Orange pi, Дешево, Своими руками, Embedded, Электронные сигареты, Разработка, Linux, Nix, Длиннопост

❯ Характеристики


Но чем он так меня привлек, помимо SoM направленности? Своим крутым чипсетом! Давайте ознакомимся с его характеристиками поближе:

  • Процессор: SigmaStar SSD210. 2 ядра Cortex-A7, работающие на частоте до 1ГГц. 16Кб кэш инструкций и 16Кб кэш данных, плюс 128Кб L2-кэша. В процессоре есть FPU и поддержка SIMD-инструкций Neon (альтернатива SSE в x86). Нехило, правда?

  • Поддержка дисплеев: У чипсета есть выделенный модуль для работы с внешними матрицами. Поддерживаются TTL дисплеи (до 1024x768), SPI-матрицы с клоком до 54МГц (480x320), а также прямой RGB аналоговый RGB сигнал (этот интерфейс можно использовать для подключения к ТВ с тюльпанами или аналоговым матрицам). Про типы дисплеев, вы можете прочитать в моей статье.

  • 2D GPU: Поддержка отрисовки линий, прямоугольников, градиентной заливки, BitBLT, клиппинг, дизеринг, автоматическая конвертация формата пикселя (с RGB888 в RGB565). Это серьёзно снимает нагрузку с ЦПУ при рисовании графики, однако поддерживается ли он в Linux — вопрос другой.

  • ОЗУ: 64Мб DDR2 памяти «бутербродом» прямо с чипсетом, плюс поддержка до 512Мб DDR2 внешней памяти, до 1333Мб/с.

  • Звук: Один моно-выход DAC, два выходных канала I2S, вход микрофона. Входные каналы поддерживают частоту дискретизации до 96КГц. Можно организовать вывод звука лишь подключив внешний усилитель. Внешний ЦАП не обязателен, если вам не нужен стерео-звук.

  • Память: Контроллер NOR/NAND SPI-памяти, до двух параллельно подключенных чипов, плюс поддержка SDIO. BootROM поддерживают загрузку с MicroSD карт.

  • Сеть: Ethernet, на DongShan Pi есть Wi-Fi.

  • USB: Как хост, так и ведомое устройство

  • Периферия: 4 канала ШИМ, GPIO, 4 UART, 2 канала SPI, 2 канала I2C

  • Камера: До двух камер по интерфейсу MIPI CSI

  • Безопасность: Есть аппаратное шифрование.

  • Питание: 0.9В ядро, 1.8В ОЗУ, 3.3В I/O


Очень даже бодро, согласитесь? Вообще, производитель подразумевает SSD210 как чипсет для HMI-дисплеев — т. е. умные дисплеи, которые могут, например, служить стендами в музеях, или служить для заказа билетов в кино. Есть внешние HMI-дисплеи, которыми можно управлять используя другие МК: просто посылая команды и реагируя на нажатия кнопок. Тут мы и видим, как китайский производитель решил применить этот чипсет для другой сферы: одноплатный компьютер для DIY!

DongShan Pi Pico-W: крошечный одноплатник с современным чипсетом за 600 рублей Гаджеты, Покупка, Девайс, Одноплатный компьютер, Компьютер, Минипк, Raspberry pi, Orange pi, Дешево, Своими руками, Embedded, Электронные сигареты, Разработка, Linux, Nix, Длиннопост

На SSD210 есть порт Linux, предлагается использовать Embedded Linux в качестве основной системы. Никаких дистрибутивов по типу Ubuntu для устройства нет — предполагается, что вы сами реализуете весь необходимый для ваших программ функционал (отрисовку графики, обработку ввода, звук и т. п.). Есть Build root и исходный код ядра, а также U-Boot.

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

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

❯ Сборка и запуск


Для более удобного процесса разработки нашего устройства, лучше всего заказывать сразу две платы: одну припаять к переходной плате с штырями, а другую использовать на нашем устройстве. Как я уже говорил ранее, одноплатник предлагается в виде System on Module, которые можно при желании распаять на переходной плате:

DongShan Pi Pico-W: крошечный одноплатник с современным чипсетом за 600 рублей Гаджеты, Покупка, Девайс, Одноплатный компьютер, Компьютер, Минипк, Raspberry pi, Orange pi, Дешево, Своими руками, Embedded, Электронные сигареты, Разработка, Linux, Nix, Длиннопост

Честно сказать, я очень люблю такой тип монтажа и топлю за то, чтобы другие одноплатники не форсировали использование штырьков, а позволяли припаять себя «бутербродом» к другой плате. Обычно SoM дороже чем простые одноплатники, один из примеров — Olimex A20 SoM. Припаиваем основную плату к eval-плате. Обратите внимание, что припой должен находится «скосом» с внешней стороны пинов!

DongShan Pi Pico-W: крошечный одноплатник с современным чипсетом за 600 рублей Гаджеты, Покупка, Девайс, Одноплатный компьютер, Компьютер, Минипк, Raspberry pi, Orange pi, Дешево, Своими руками, Embedded, Электронные сигареты, Разработка, Linux, Nix, Длиннопост
DongShan Pi Pico-W: крошечный одноплатник с современным чипсетом за 600 рублей Гаджеты, Покупка, Девайс, Одноплатный компьютер, Компьютер, Минипк, Raspberry pi, Orange pi, Дешево, Своими руками, Embedded, Электронные сигареты, Разработка, Linux, Nix, Длиннопост

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

DongShan Pi Pico-W: крошечный одноплатник с современным чипсетом за 600 рублей Гаджеты, Покупка, Девайс, Одноплатный компьютер, Компьютер, Минипк, Raspberry pi, Orange pi, Дешево, Своими руками, Embedded, Электронные сигареты, Разработка, Linux, Nix, Длиннопост

Теперь подключаем питание. На плате уже разведены Step-down преобразователи с 5В на 3.3В (основная логика), 1.8В (DDR2), и 0.9В/1.0В (ядро), нам достаточно подключить лишь 5В, либо запитать плату от 3.7В аккумулятора. Устройство стабильно работает и от 0.5А порта ПК (если не юзать Wi-Fi).

DongShan Pi Pico-W: крошечный одноплатник с современным чипсетом за 600 рублей Гаджеты, Покупка, Девайс, Одноплатный компьютер, Компьютер, Минипк, Raspberry pi, Orange pi, Дешево, Своими руками, Embedded, Электронные сигареты, Разработка, Linux, Nix, Длиннопост

Для работы с одноплатником, обязательно нужен COM-преобразователь. Открываем Putty, задаем COM-порт, выставляем бодрейт 115200 и отключаем контроль четности. После подачи питания на устройство, в консоли побегут логи, U-Boot начнет загружать систему… однако, есть один важный нюанс…

DongShan Pi Pico-W: крошечный одноплатник с современным чипсетом за 600 рублей Гаджеты, Покупка, Девайс, Одноплатный компьютер, Компьютер, Минипк, Raspberry pi, Orange pi, Дешево, Своими руками, Embedded, Электронные сигареты, Разработка, Linux, Nix, Длиннопост

Все платы прошиваются на заводе с помощью фирменного флэшера SSD210. Но фирменный флэшер, по каким-то причинам, на некоторых платах не может сохранить U-Boot Environment (переменные окружения, которые в том числе определяют таблицу разделов и коммандлайн ядра).

DongShan Pi Pico-W: крошечный одноплатник с современным чипсетом за 600 рублей Гаджеты, Покупка, Девайс, Одноплатный компьютер, Компьютер, Минипк, Raspberry pi, Orange pi, Дешево, Своими руками, Embedded, Электронные сигареты, Разработка, Linux, Nix, Длиннопост

Поэтому если ваша плата повисла на CRC Error, нужно ввести следующие команды:

setenv mtdids nand0=nand0

setenv mtdparts ' mtdparts=nand0:0x140000(CIS),0x1a0000(BOOT0),0x1a0000(BOOT1),0x40000(ENV),0x40000(ENV1),0x20000(KEY_CUST),0x500000(KERNEL),0x500000(RECOVERY),0x600000(rootfs),0xa0000(MISC),-(UBI)

setenv bootargs ubi.mtd=UBI,0x800 root=/dev/mtdblock8 rootfstype=squashfs ro init=/linuxrc LX_MEM=0x3FE0000 mma_heap=mma_heap_name0,miu=0,sz=0x1E00000 cma=2M highres=off mmap_reserved=fb,miu=0,sz=0x300000,max_start_off=0x3C00000,max_end_off=0x3F00000 ${mtdparts}

setenv bootcmd ' nand read.e 0x22000000 KERNEL ${kernel_file_size}; dcache on ; bootlogo 0 0 0 0; bootm 0x22000000;nand read.e 0x22000000 RECOVERY ${recovery_file_size}; dcache on ; bootm 0x22000000

setenv autoestart 0

setenv sstar_bbm off

setenv ipl_version "##p3##gdf99011IPL_##########

setenv ipl_version "DUALENV=1 SILENT_CONSOLE=1 CFG_SDMMC_DISABLE=n ALK=1 SPINAND=1 CHIP=pioneer3""

saveenv

После этого отправляем плату в ресет и система загружается как ни в чем не бывало!

DongShan Pi Pico-W: крошечный одноплатник с современным чипсетом за 600 рублей Гаджеты, Покупка, Девайс, Одноплатный компьютер, Компьютер, Минипк, Raspberry pi, Orange pi, Дешево, Своими руками, Embedded, Электронные сигареты, Разработка, Linux, Nix, Длиннопост

Поскольку на плате не разведен разъем USB, для прошивки нужно распустить нерабочий кабель для зарядки смартфона, либо купить внешний USB-разъем на плате. VBUS кидаем на вход питания, белый провод на DM-, зелёный на DM+. Не забывайте провести общую землю между UART-преобразователем и основным питанием платы, дабы не потерять логи.

DongShan Pi Pico-W: крошечный одноплатник с современным чипсетом за 600 рублей Гаджеты, Покупка, Девайс, Одноплатный компьютер, Компьютер, Минипк, Raspberry pi, Orange pi, Дешево, Своими руками, Embedded, Электронные сигареты, Разработка, Linux, Nix, Длиннопост
DongShan Pi Pico-W: крошечный одноплатник с современным чипсетом за 600 рублей Гаджеты, Покупка, Девайс, Одноплатный компьютер, Компьютер, Минипк, Raspberry pi, Orange pi, Дешево, Своими руками, Embedded, Электронные сигареты, Разработка, Linux, Nix, Длиннопост
DongShan Pi Pico-W: крошечный одноплатник с современным чипсетом за 600 рублей Гаджеты, Покупка, Девайс, Одноплатный компьютер, Компьютер, Минипк, Raspberry pi, Orange pi, Дешево, Своими руками, Embedded, Электронные сигареты, Разработка, Linux, Nix, Длиннопост

Замыкаем два пина в центре платы пинцетом и жмем RESET. Плата определится как MSDC-флэшка (не удивляйтесь). Прошивальщик глючный и бывает не с первого раза может прошить устройство. Если девайс после прошивки не включается — введите команды в консоль U-Boot выше.

DongShan Pi Pico-W: крошечный одноплатник с современным чипсетом за 600 рублей Гаджеты, Покупка, Девайс, Одноплатный компьютер, Компьютер, Минипк, Raspberry pi, Orange pi, Дешево, Своими руками, Embedded, Электронные сигареты, Разработка, Linux, Nix, Длиннопост

Теперь переходим к самой системе.

❯ Система


Девайс работает на базе ядра Linux 4.9. Тем не менее, производителем заявлена поддержка Mainline-ядра, что даёт надежду на поддержку устройства в будущем.

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

«Из коробки» на устройстве доступен лишь i2cdev, благодаря которому можно свободно общаться с i2c-устройствами из юзерспейса. Хотите получить доступ к SPI? Готовьтесь качать билдрут, вручную включать spidev в конфиге и редактировать DeviceTree, дабы spidev мог получить доступ к физическим spi-устройствам ядра.

DongShan Pi Pico-W: крошечный одноплатник с современным чипсетом за 600 рублей Гаджеты, Покупка, Девайс, Одноплатный компьютер, Компьютер, Минипк, Raspberry pi, Orange pi, Дешево, Своими руками, Embedded, Электронные сигареты, Разработка, Linux, Nix, Длиннопост

Кроме того, конечно же, есть доступ к GPIO из sysfs.

На самой плате, Wi-Fi реализован в виде внешнего USB-хаба + Wi-Fi адаптера. Чипсет также поддерживает Ethernet.

Для разработки устройств, производитель предлагает отдельное SDK для общения с периферией устройства из юзерспейса. С помощью этого SDK, можно получить доступ к камере, аппаратному декодеру, звуку и настроить матрицу. Судя по всему, общение происходит с помощью ioctl к необходимым устройствам. Это сделано для того, чтобы разработчики не копались в низкоуровневых драйверах, ведь например, ALSA, на устройстве нет совсем.

DongShan Pi Pico-W: крошечный одноплатник с современным чипсетом за 600 рублей Гаджеты, Покупка, Девайс, Одноплатный компьютер, Компьютер, Минипк, Raspberry pi, Orange pi, Дешево, Своими руками, Embedded, Электронные сигареты, Разработка, Linux, Nix, Длиннопост

Если включить нужные нам модули в юзерспейс (spidev, i2cdev, gpio), то можно будет проектировать устройства более простым путем. Например, подключить дисплейчик и прямо из юзерспейса выводить на него графическую информацию. Это открывает перспективы для самых разных применений: опрос датчиков и хранение информации в внутренней памяти, умные сигнализации, самодельные часы, DIY игровые консоли, самодельные телефоны и т. п. Применений просто куча!

❯ Заключение


Вот мы и посмотрели с вами на дешевые одноплатники, где используются чипсеты, которые разработаны для использования в совершенно других сферах. Девайсы весьма своеобразные и для полноценной работы с ними нужно обладать навыками прожженного линуксоида и иметь навыки системного программирования. Но, чего уж точно нельзя отрицать, так это перспектив подобных девайсов для своих проектов. Да, под них нет готовых гайдов, как для Raspberry Pi или Orange Pi, информации по ним минимум… но если захочется — то всегда можно «сварганить» самопальное устройство за минимальный прайс!

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

DongShan Pi Pico-W: крошечный одноплатник с современным чипсетом за 600 рублей Гаджеты, Покупка, Девайс, Одноплатный компьютер, Компьютер, Минипк, Raspberry pi, Orange pi, Дешево, Своими руками, Embedded, Электронные сигареты, Разработка, Linux, Nix, Длиннопост

Чуть позже выйдет материал про Repka Pi. Их одноплатник получился не менее интересным и как раз таки метит в нишу одноплатников с хорошей поддержкой, где есть уже готовые гайды, информация и даже сами разработчики могут помочь с решением некоторых проблем. Без косяков не обошлось: есть пару аппаратных проблем, о которых я расскажу открыто, но в целом девайс выглядит интересным!

Материал подготовлен при поддержке TimeWeb Cloud. Подписывайтесь на меня и @Timeweb.Cloud , дабы не пропускать свежие статьи каждую неделю!

Показать полностью 21

Крутейший КПК из конца 90-х — каким был Casio Cassiopeia E-105?


Не так уж много людей помнят о такой аббревиатуре, как КПК. Карманные персональные компьютеры появились ещё в прошлом веке и стали незаменимыми помощниками в руках бизнесменов и крутыми девайсами в руках гиков. Ух, если сейчас вспомнить, то на ум приходят как минимум несколько серий: iPaq, Axim, Zaurus, планшеты N-серии от Nokia, Tungsten, Jornada и конечно же, Cassiopeia от японской компании Casio! Сейчас функционал КПК давно переехал в любой современный смартфон, однако в те времена, портативные компьютеры работали на целом зоопарке самого разного железа и различных ОС! Недавно мой читатель из Финляндии всё же смог привезти в Россию большую посылку с подарками, где оказался и наш сегодняшний гость. Сегодня мы взглянем на одну из самых дорогих, крутых и функциональных гиковских штук из 90-х. Встречайте — Cassiopeia!

Крутейший КПК из конца 90-х — каким был Casio Cassiopeia E-105? Гаджеты, Windows, Кпк, Pda, Palm, Casio, Cassiopeia, Ништяки, Подарки, Длиннопост

❯ КПК и какими они бывают


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

Крутейший КПК из конца 90-х — каким был Casio Cassiopeia E-105? Гаджеты, Windows, Кпк, Pda, Palm, Casio, Cassiopeia, Ништяки, Подарки, Длиннопост



HPC же был классом совершенно иных устройств и является эдаким предком современных смартфонов с QWERTY-клавиатурой (привет, BlackBerry!). Основным отличием этих гаджетов было наличие физической небольшой клавиатуры, с которой пользователь мог обрабатывать документы. При этом экземпляры начала 90-х годов (которые, в общем-то, можно считать HPC, но сам термин ввела Microsoft с появлением Windows CE во второй половине 90-х годов) зачастую были обычными компьютерами на базе embedded-версий x86 процессоров и работали на DOS, зачастую с какой-либо проприетарной графической оболочкой.

Крутейший КПК из конца 90-х — каким был Casio Cassiopeia E-105? Гаджеты, Windows, Кпк, Pda, Palm, Casio, Cassiopeia, Ништяки, Подарки, Длиннопост

HP Jornada 720. Фото честно «стырил» у @dlinyj,



И по сути именно HPC на x86 оставались основным интересом для гиков — если бы, конечно, не цена. Полноценный компьютер в кармане, на котором можно Duke Nukem запустить — это тебе не хухры-мухры! Массовый интерес КПК начали представлять тогда, когда на них стало возможным запускать сторонний софт. И двумя главными лидерами в этом направлении была Palm с PalmOS и КПК Tungsten, а также Microsoft со своей новоявленной Windows CE 2.0, при этом оставаясь программно частично совместимой с настольными версиями Windows. Почему я говорю именно о CE начиная с 2.0? Потому что 1.0 — это, судя по всему, порт Win9x под MIPS и он не совместим с более популярной CE от слова совсем.

Крутейший КПК из конца 90-х — каким был Casio Cassiopeia E-105? Гаджеты, Windows, Кпк, Pda, Palm, Casio, Cassiopeia, Ништяки, Подарки, Длиннопост



При этом под программной совместимостью подразумевается как возможность портирования десктопных приложений, благодаря довольно большой совместимости WinAPI десктопного и WinAPI CE (та же оконная система, похожее API для мультимедиа, способ обработки ввода и работы с файлами идентичен) за исключением минорных изменений — например, полная интеграция юникода и выкидывание ANSI-версий функций, так и Look n feel системы, которая была очень похожа на Windows 98 и в «сыром» виде обеспечивала практически те же ощущения от работы системы.

Palm же свободно предоставляла SDK и относительно простой API для написания собственных приложений. При этом PalmOS была однозадачной: возможности запустить сразу две программы параллельно не было. Под палм было написано довольно много софта, многие программы распространялись платно. Поэтому CE, в целом, была покруче благодаря наличию поддержки разделяемых библиотек и полноценной многозадачности.

Крутейший КПК из конца 90-х — каким был Casio Cassiopeia E-105? Гаджеты, Windows, Кпк, Pda, Palm, Casio, Cassiopeia, Ништяки, Подарки, Длиннопост


В начале 2000х, Microsoft начнёт развивать КПК (PPC — Pocket PC), коммуникаторы (КПК с радиомодулем и возможностью звонить) и смартфоны (коммуникаторы с физической клавиатурой и зачастую без сенсорного дисплея) в отдельной ветке Windows CE под названием Windows Mobile, где сосредоточится на мобильном Look'n'feel устройств. Помимо этого, Microsoft добавит в Windows CE поддержку 3D-графики с аппаратным видео-ускорением (D3D Mobile), полноценный Windows Media Player, API для написания игр (GAPI) и портирует .NET Framework. Именно в это время появятся такие легендарные серии, как Dell Axim, HP iPaq, КПК от Samsung, устройства от HTC (QTEK, O2, i-Mate). Palm же, к сожалению, со временем разорится и последние настоящие Palm'ы будут работать на базе Windows Mobile. Увы!

Крутейший КПК из конца 90-х — каким был Casio Cassiopeia E-105? Гаджеты, Windows, Кпк, Pda, Palm, Casio, Cassiopeia, Ништяки, Подарки, Длиннопост


Однако устройства на базе Windows Mobile мы уже успели с вами посмотреть. Но, что насчет девайсов гораздо старше? Например, Casio Cassiopeia? Читатель из Финляндии, которого зовут Antti, почти год назад написал мне на мейл и предложил поскребать по сусекам и шкафам, дабы насобирать ништяков и отправить мне большой посылкой! Я конечно же согласился. На один из его подарков мы уже посмотрели — это был ноутбук Fujitsu-Siemens 1998 г. выпуска. Помимо этого, Antti подарил мне еще один Fujitsu-Siemens, Thinkpad и куча всякого разного железа, за что ему огромное спасибо! Посылку было очень сложно доставить в РФ: на таможне с Финляндией сейчас ситуация сложная, поэтому его другу (которому тоже большое спасибо за то, что согласился с этим всем заморочиться и помочь) пришлось везти девайсы по одному, дабы не приняли за «ввоз предметов роскоши» или тем-более контрабанду!

Крутейший КПК из конца 90-х — каким был Casio Cassiopeia E-105? Гаджеты, Windows, Кпк, Pda, Palm, Casio, Cassiopeia, Ништяки, Подарки, Длиннопост



Большое спасибо читателю за такой подгон. Это очень крутые аппараты, которые я сразу же принялся смотреть. Давайте познакомимся с Cassiopeia поближе!


❯ Оживляем красавца


Девайс был разработан и произведен Casio в Японии, о чем нам говорит соответствующая надпись. И это не редкость для японской техники тех лет: например ноутбуки Fujitsu-Siemens тоже производились в Японии!

Крутейший КПК из конца 90-х — каким был Casio Cassiopeia E-105? Гаджеты, Windows, Кпк, Pda, Palm, Casio, Cassiopeia, Ништяки, Подарки, Длиннопост


Сам по себе девайс был полностью рабочим, однако, батарейка CR2032 (которая подпитывает ОЗУ во время отсутствия АКБ) была утеряна вместе с заглушкой. Нам необходимо было всего лишь толкнуть аккумулятор и запустить девайс. Распиновка аккумулятора простейшая: +, термистор и -, поэтому при необходимости, вы и сами сможете смастерить свой аккумулятор. Чуть более поздние КПК общались с контроллером АКБ не меньше, чем это делает свежий айфон.

Крутейший КПК из конца 90-х — каким был Casio Cassiopeia E-105? Гаджеты, Windows, Кпк, Pda, Palm, Casio, Cassiopeia, Ништяки, Подарки, Длиннопост


У устройства присутствует порт для установки в док-станцию, при этом есть возможность зарядки от обычного Jack-подобного БП на 5в. Поскольку крэдла у меня не оказалось, изначально я растолкал аккумулятор с помощью внешнего источника питания. Для зарядки же отлично подходит БП для Sony PSP — проверено! Что занимательно: аккумулятор спустя практически 25 лет всё ещё продолжает немного держать заряд! Пусть его хватает на ~30 минут автономной работы устройства, но все же!

Крутейший КПК из конца 90-х — каким был Casio Cassiopeia E-105? Гаджеты, Windows, Кпк, Pda, Palm, Casio, Cassiopeia, Ништяки, Подарки, Длиннопост


После включения устройства, нас встречает окно настройки устройства: поскольку все пользовательские данные в этих версиях Windows CE хранятся в ОЗУ, после полного разряда аккумулятора и батарейки CR2032, все данные с устройства были удалены.

Крутейший КПК из конца 90-х — каким был Casio Cassiopeia E-105? Гаджеты, Windows, Кпк, Pda, Palm, Casio, Cassiopeia, Ништяки, Подарки, Длиннопост


Девайс просил меня нажать кнопку OK, но я не сразу понял где она была… а ведь оказалась она в фирменном колесике JogDial, предназначенном для быстрого скроллинга! Похожие решения использовала Samsung, Sony Ericsson и HTC.

После этого, нас встречает такой привычный рабочий стол Windows! И Microsoft предлагала работать с ним как есть — с помощью стилуса, при этом сохранялась полная концепция окон из десктопной Windows — у нас есть панель задач, панель уведомлений, мы можем открыть несколько окон на одном экране и перетаскивать их как угодно! Для тех лет это реально здорово. Не то что сейчас в Play Store выходят всякие «Windows 10 Launcher» :)

Крутейший КПК из конца 90-х — каким был Casio Cassiopeia E-105? Гаджеты, Windows, Кпк, Pda, Palm, Casio, Cassiopeia, Ништяки, Подарки, Длиннопост



Давайте же посмотрим на характеристики устройства внимательнее:

  • Процессор: NEC VR4121 (MIPS R4000) на частоте аж 131МГц

  • ОЗУ: 32Mb RAM

  • Flash-память: 32Мб (в E-105), только для прошивки + слот для CompactFlash

  • Дисплей: 320x240 TN-матрица с резистивным тачскрином. Максимальное кол-во цветов: 65536 (RGB565), что, в целом, даже круче чем некоторые ПК тех лет, которые до сих пор использовали палитровую графику (до 255 цветов). Для тех лет выглядит очень неплохо!

  • Звук: 2.5мм джек + встроенный спикер + встроенный микрофон — аппарат умел работать в качестве диктофона

  • ОС: Windows CE 2.11

  • Внешние интерфейсы: UART, IrDA

  • Аккумулятор: 1.400мАч, литий-ионный.


Характеристики устройства околотоповые для тех лет. Несмотря на то, что полноценного порта Windows Media Player под WinCE в те года ещё не было, с помощью сторонних плееров на нём вполне можно было слушать очень пережатую музыку в MP3 (и тут вопрос в свободном месте на CF) уже в 1999 году! Вы только представьте себе этот киберпанк: в Московском метро многие едут и слушают кассетные плееры Congli, а вы слушаете музыку с настоящего КПК! Отвал башки…

Крутейший КПК из конца 90-х — каким был Casio Cassiopeia E-105? Гаджеты, Windows, Кпк, Pda, Palm, Casio, Cassiopeia, Ништяки, Подарки, Длиннопост


Можно вспомнить трюк многих владельцев телефонов с нулевых, которые часто слушали треки в midi-версии — т. е. без вокала. Таких треков по 1-2Кб могло поместится в память КПК десятки.

В целом, процессора аппарата должно хватать и на сильно пережатые видео. Тогда просмотром видео в дороге могли похвастаться… Ну, премиум-комплектации автомобилей BMW/Mercedes/Toyota, в которых были полноценные навигационные системы с ЖК-экранами. Насколько мне известно, полностью портативных проигрывателей (не телевизоров) ещё не было. Кроме того, была встроенная софтина для записи голоса. Качество такое себе, но лично я, будучи школьником, ухищрялся с диктофоном и записывал некоторые треки на свой телефон!

Крутейший КПК из конца 90-х — каким был Casio Cassiopeia E-105? Гаджеты, Windows, Кпк, Pda, Palm, Casio, Cassiopeia, Ништяки, Подарки, Длиннопост



Помимо мультимедийной составляющей, девайс мог запускать и сторонний софт с играми, однако вот нюанс: в прошивке нет встроенного полноценного проводника — что странно. Тем не менее, софт предполагалось устанавливать из cab-пакетов с помощью ActiveSync. Немного позже, на Windows CE портировали кучу полезного софта: Putty для удаленной работы с терминалами, эмуляторы игровых консолей и т. п. Есть порты целых игровых движков для квестов 80-х годов.

Крутейший КПК из конца 90-х — каким был Casio Cassiopeia E-105? Гаджеты, Windows, Кпк, Pda, Palm, Casio, Cassiopeia, Ништяки, Подарки, Длиннопост

Косынка



И я бы показал этот софт, если бы у меня была док-станция. Синхронизировать КПК на Windows CE с ПК не проблема: хотя под Windows 10 совместимость с WM6.1 сломали, в виртуалке всё работает нормально. С CF без какого-либо проводника установить софт не выйдет…

Крутейший КПК из конца 90-х — каким был Casio Cassiopeia E-105? Гаджеты, Windows, Кпк, Pda, Palm, Casio, Cassiopeia, Ништяки, Подарки, Длиннопост


ActiveSync в те годы работал не через USB, а напрямую через UART. При этом RS232 преобразователь мог быть встроен в док-станцию.

Что весьма интересно — в Windows CE был реализован полноценный сетевой стек + урезанная версия Pocket IE! Устройство можно было подключить к интернету и просматривать Web 1.0 тех лет, правда никакого Wi-Fi или BT здесь не было, так что подключение шло с помощью последовательного порта к ПК:

Крутейший КПК из конца 90-х — каким был Casio Cassiopeia E-105? Гаджеты, Windows, Кпк, Pda, Palm, Casio, Cassiopeia, Ништяки, Подарки, Длиннопост


Вообще, тогда существовали даже некие PDA-каналы от Microsoft: поддерживаемые сайты могли делать что-то типа страниц с основной информацией, сверстанные для КПК. На первый взгляд идея напоминает WML для WAP, по факту это все еще полноценный HTML-браузер.

Крутейший КПК из конца 90-х — каким был Casio Cassiopeia E-105? Гаджеты, Windows, Кпк, Pda, Palm, Casio, Cassiopeia, Ништяки, Подарки, Длиннопост
Крутейший КПК из конца 90-х — каким был Casio Cassiopeia E-105? Гаджеты, Windows, Кпк, Pda, Palm, Casio, Cassiopeia, Ништяки, Подарки, Длиннопост



Остальной бизнес-функционал подразумевал полную синхронизацию с ПК. Например почту можно было синхронизировать локально и если вам приходит кучу сообщений, вы могли ответить на него сидя в курилке на обеде, а вечером прийти, подключить девайс к ПК и ActiveSync сам отправит сообщение на мейл при появлении интернета. Тоже самое и с заметками, задачами и иными бизнес-штучками!

❯ Заключение


В остальном же, Cassiopeia E-105 — крутейшая штука, которой немного не хватает возможности установки программ без ActiveSync. Карточку CF найти ещё вполне реально, а вот док-станцию для таких HPC… вопрос другой. Впрочем, без синхронизации с ПК время от времени, их никто и не предполагал использовать. Функционал из коробки достаточно близок к Palm Tungsten, однако по факту, Windows CE предлагала ещё более высокие возможности по написанию довольно сложных приложений для такого рода девайсов. Может, у вас когда-то была Cassiopeia?

Тем не менее, аппарат был отнюдь не из дешевых и недоступен многим гикам: розничная цена ~700$ давала о себе знать. Это было около 19.000 рублей: за такие деньги можно было даже автомобиль прикупить! А вам понравилась Cassiopeia?

❯ Роадмап для следующего материала


Недавно я создалTelegram-канал для тех читателей, кто хочет видеть бэкстейджи статей, анонсы и поболтать о ретро-технике в комментариях. Без откровенного мусора — посты 1-2 раза в день и только по делу! Но поскольку не всем читателям нравится концепция каналов, я решил продублировать роадмап следующих статей:

  1. Статья об одноплатном компьютере за… 500 рублей с AliExpress. При этом одноплатник вполне можно считать System on Module, поскольку вам придется сначала его распаять на Evaluation-плате! Посмотрим, на что способно устройство с Cortex-A7 чипсетом, MIPI-DSI-интерфейсом для дисплеев, Wi-Fi и 64Мб ОЗУ «бутербродом» на борту!

  2. Материал о 3dfx Voodoo и написание 3D-игры полностью с нуля. Пожалуй, это будет первая игра, написанная для вуду за долгие годы! Недавно я рассказывал вам о принципе работы первых 3D-ускорителей с точки зрения железа и драйверов, теперь самое время рассказать о том, как это работало с точки зрения разработчика игр!

  3. Рассказ о программировании нативных приложений под новодельные кнопочные телефоны по 500 рублей — Из них тоже могут получится эдакие «одноплатники», которые могут стать самостоятельными сигнализациями, например. И стоят копейки!

  4. Использование SIM900 в качестве самостоятельного микроконтроллера — многие привыкли видеть радиомодули SIMCom как отдельные устройства, с которыми можно общаться только посредством AT-команд. На самом деле, SIM800/SIM900 могут работать как самостоятельные микроконтроллеры. Как? Расскажу в одной из следующих статей!


Подписывайтесь, дабы не пропускать свежий материал почти каждую неделю!

Крутейший КПК из конца 90-х — каким был Casio Cassiopeia E-105? Гаджеты, Windows, Кпк, Pda, Palm, Casio, Cassiopeia, Ништяки, Подарки, Длиннопост

Материал подготовлен при поддержке TimeWeb Cloud. Подписывайтесь на меня и @Timeweb.Cloud , чтобы не пропуска новый материал каждую неделю!

Показать полностью 20

Большая дыра в безопасности Android: Почему смартфоны с зеленым роботом подвержены кражам?

Большая дыра в безопасности Android: Почему смартфоны с зеленым роботом подвержены кражам? Android, Гаджеты, Смартфон, Броня, Google, FRP, Аккаунт, Привязка, Icloud, Девайс, Мобильные телефоны, Телефон, Apple, Электроника, Длиннопост, Agm (бренд)



Многим пользователям смартфонов знакомо такие понятия как «привязка к аккаунту». У различных вендоров смартфонах есть свои механизмы защиты смартфонов от кражи: у Apple — FMI, у Xiaomi — Mi Cloud, а у Google — FRP. Однако у Android есть давняя уязвимость, которая позволяет обходить практически любые смартфоны на «чистой» системе, даже с привязкой к Google-аккаунту. Недавно мне написал известный YouTube-блогер MaddyMurk и предложил задарить смартфон-броневичок AGM H3 на гугл-аккаунте, который он не смог сбросить. Я решил подготовить подробный материал о дырах в защите Android и на практике обойти FRP на смартфоне, который «повис» на активации. Сегодня мы с вами узнаем: почему смартфоны на Android так легко обходить, какие существуют методики и почему подобная практика невозможна на устройствах Apple. Интересно? Жду вас под катом!

❯ Какие бывают «привязки»?



Ещё в нулевых, никакой привязки к аккаунтам у телефонов не существовало. Девайсы крали направо и налево: не уверен насчёт других стран, но в СНГ, к сожалению, эта практика была развита очень хорошо. Девайсы защищались максимум пин-кодом, который телефон мог запросить при смене SIM-карты, но даже его можно было обойти с помощью т.н «мастер-кодов», которые рассчитывались на специальных сайтах в различных СЦ. На некоторых телефонах помогала обычная перепрошивка — и вот, девайс снова отправлялся на БУ рынок для продажи своему новому владельцу, абсолютно чистенький и вероятно, пересобранный в новый китайский корпус. И пофиг, что IMEI-устройства уже давно числится как краденый!

Большая дыра в безопасности Android: Почему смартфоны с зеленым роботом подвержены кражам? Android, Гаджеты, Смартфон, Броня, Google, FRP, Аккаунт, Привязка, Icloud, Девайс, Мобильные телефоны, Телефон, Apple, Электроника, Длиннопост, Agm (бренд)



Иногда, своеобразную защиту обеспечивала редкость аппаратной платформы телефона. Например, французские Sagem, которые были довольно популярны в РФ в середине нулевых, практически никто не обслуживал, несмотря на наличие программаторов на рынке. Смена IMEI же зачастую была невозможна — на телефонах Nokia, например, в внутренней памяти хранятся т.н сертификаты для активации радиомодуля и загрузки телефона. Если в процессе кривой прошивки они были повреждены или кто-то пытался их подделать, то телефон больше не включался без генерации нового сертификата за деньги на специальном сайте. Совсем.
Единственное известное мне исключение — китайские телефоны на платформе MediaTek (кнопочники Fly, Explay и.т.п) — там IMEI вполне можно поменять на какой-нибудь левый. Хоть из семерок себе сделать :)

Большая дыра в безопасности Android: Почему смартфоны с зеленым роботом подвержены кражам? Android, Гаджеты, Смартфон, Броня, Google, FRP, Аккаунт, Привязка, Icloud, Девайс, Мобильные телефоны, Телефон, Apple, Электроника, Длиннопост, Agm (бренд)



Одну из первых и эталонных реализаций привязки смартфона к аккаунту представила Apple с выходом iPhone 4. Помимо входа в обычный аккаунт iCloud, пользователь мог включить функцию Find My iPhone, которая позволяла найти смартфон в случае кражи. Помимо поиска утерянного девайса, включенный FMI запрашивает логин и пароль пользователя при сбросе смартфона до заводских настроек (или перепрошивке). И вот здесь кроется главная фишка реализации «яблочников»: все устройства Apple, вышедшие с конвейера и прошедшие контроль качества, заносятся в некую базу данных, где хранится связка из нескольких аппаратных идентификаторов: уникальный ID процессора, который «прожигается» на заводе и остаётся
неизменяемым навсегда, уникальный ID модема (вот здесь я точно не скажу, что является идентификатором — скорее всего IMEI) и вероятно что-то ещё. Если идентификатор хотя-бы одного модуля не соответствует тому, что хранится в базе данных Apple — устройство повиснет на ошибке активации!

Большая дыра в безопасности Android: Почему смартфоны с зеленым роботом подвержены кражам? Android, Гаджеты, Смартфон, Броня, Google, FRP, Аккаунт, Привязка, Icloud, Девайс, Мобильные телефоны, Телефон, Apple, Электроника, Длиннопост, Agm (бренд)



С этим даже связана одна занимательная история: iPhone 4/4s страдали отвалами модема, от чего в мастерских приловчились менять их с донорских аппаратов, при этом не перекатывая всю сборку вместе с процессором и памятью. С прилётом какого-то апдейта iOS, Apple ужесточили правила активации и многие полностью исправные айфоны повисли на ошибке активации.
Несмотря на эталонную реализацию, FMI обойти можно, если для устройства есть джейлбрейк, который можно сделать до доступа на главный экран (например checkra1n). Однако мобильная сеть и звонки работать не будут — для активации модема нужен уникальный токен, который генерирует сервер активации Apple Albert. Однако, кто-то всё-де смог отреверсить механизм работы сервера активации и завести модем на «байпаснутых» устройствах…

Большая дыра в безопасности Android: Почему смартфоны с зеленым роботом подвержены кражам? Android, Гаджеты, Смартфон, Броня, Google, FRP, Аккаунт, Привязка, Icloud, Девайс, Мобильные телефоны, Телефон, Apple, Электроника, Длиннопост, Agm (бренд)



На Android-устройствах ситуация совсем иная: здесь долгое время балом правила открытость смартфонов, которая позволяла модифицировать устройства как угодно — портировать свежие версии Android, делать кастомные прошивки с различными плюшечками и оптимизациями. Долгое время люди знать не знали, что такое секьюрбут (заблокированный загрузчик) и с чем его едят…
По причинам тотальной открытости Android-смартфонов, никто особо не замарачивался с серьёзной привязкой к облачным сервисам: устройства с пин-кодом или графическим ключом без проблем обходились сбросом до заводских настроек через рекавери… до выхода Android Lolipop!

Большая дыра в безопасности Android: Почему смартфоны с зеленым роботом подвержены кражам? Android, Гаджеты, Смартфон, Броня, Google, FRP, Аккаунт, Привязка, Icloud, Девайс, Мобильные телефоны, Телефон, Apple, Электроника, Длиннопост, Agm (бренд)



В «пятерке», Google предприняли попытку защитить устройства от сброса через рекавери с помощью механизма FRP — Factory Reset Protection, который запрашивает Google-аккаунт, если устройство не было сброшено с помощьюсоответствующего пункта в настройках. Реализована функция была крайне просто, без каких-либо аппаратных привязок: на устройствах MediaTek и Spreadtrum достаточно было забить нулями определенный раздел памяти фирменным прошивальщиком, а иногда вход в аккаунт можно было обойти различными багами операционной системы. На более старых версиях Android, можно было с помощью adb или терминала просто установить свойство, которое отвечает за показ окна активации:

content insert --uri content://settings/secure --bind name:s:user_setup_complete --bind value:s:1

Суть была в том, что Android на этапе активации просто делает шторку неактивной и прячет виртуальные кнопки домой/меню. По факту, приложения могут отсылать любые Intent («действия» в терминологии Android) системе и открывать любые приложения поверх окна активации, без каких либо ограничений. Если перезапустить приложение активации, то появлялась и полноценная кнопка «домой» и «многозадачность». Таким образом, нехитрыми манипуляциями, на смартфонах Samsung (вся A и J серия, до 2017 года) можно было зайти в браузер и затем в настройки с помощью голосового помощника, на смартфонах Asus с помощью умной клавиатуры TouchPal можно было открыть настройки и сбросить устройство до заводских в пару кликов, а в смартфонах Xiaomi была возможность написать в каком-нибудь текстовом поле youtube.com, зажать на нем палец и открыть соответствующее приложение, откуда можно снова попасть в настройки… Вариантов действительно много!

Большая дыра в безопасности Android: Почему смартфоны с зеленым роботом подвержены кражам? Android, Гаджеты, Смартфон, Броня, Google, FRP, Аккаунт, Привязка, Icloud, Девайс, Мобильные телефоны, Телефон, Apple, Электроника, Длиннопост, Agm (бренд)



Недавно мне написал известный блогер с YouTube — MaddyMurk и рассказал занимательную историю: он нашёл «броневичок» AGM H3, который валялся в снегу и грязи несколько месяцев, абсолютно никому не нужный. Несмотря на тяжёлые условия, девайс полностью оправдал свой статус бронированного и остался полностью живым и целым! Однако, аппарат висел на графическом ключе и Миша по старой памяти решил скинуть его до заводских настроек, в надежде что владелец не входил в Google-аккаунт. После сброса, девайс повиснул на активации и Миша спросил у меня, что с ним можно сделать. По итогу, он предложил заслать девайс мне: «авось ты сможешь его оживить». Помимо AGM, Михаил прислал мне ещё кучу ништяков: несколько «сименсов» и «сонериков», кучу запчастей на iPhone 4-5, камеру и свою фирменную кассету с музыкой — за что ему спасибо :))

Большая дыра в безопасности Android: Почему смартфоны с зеленым роботом подвержены кражам? Android, Гаджеты, Смартфон, Броня, Google, FRP, Аккаунт, Привязка, Icloud, Девайс, Мобильные телефоны, Телефон, Apple, Электроника, Длиннопост, Agm (бренд)



Однако материал был бы неполным, если бы я не показал на практике, как можно обойти абсолютно неизвестный девайс, для которого нет гайдов по обходу активации — и тем самым не показал бы вам, насколько «дырявая» защита от кражи у Android с Google-сервисами… Переходим к практике!

❯ Обходим активацию багами



После включения, система встречает нас с предложением пройти первичную настройку. После подключения к Wi-Fi, нас встречает окно с предложением войти в аккаунт или ввести графических ключ прошлого владельца.

Большая дыра в безопасности Android: Почему смартфоны с зеленым роботом подвержены кражам? Android, Гаджеты, Смартфон, Броня, Google, FRP, Аккаунт, Привязка, Icloud, Девайс, Мобильные телефоны, Телефон, Apple, Электроника, Длиннопост, Agm (бренд)



Наша задача: выйти из экрана авторизации в какое-нибудь приложение, откуда можно открыть встроенный в систему браузер. Вариантов масса: на некоторых устройствах, как уже было сказано, можно открывать ссылки, просто выделив их (таким образом, нужно открывать youtube или иной сайт с ассоциированным приложением в системе). Из тех, что я подметил: приложение «Google Фото» и YouTube подходят лучше всего. У моего смартфона нашлась аппаратная кнопка камеры слева, которая сразу же открывала соответствующее приложение. Хоба: фотографируем что-нибудь, нажимаем на превьюшку фотографии и попадаем в Google Фото!

Большая дыра в безопасности Android: Почему смартфоны с зеленым роботом подвержены кражам? Android, Гаджеты, Смартфон, Броня, Google, FRP, Аккаунт, Привязка, Icloud, Девайс, Мобильные телефоны, Телефон, Apple, Электроника, Длиннопост, Agm (бренд)


Аппарат активно эксплуатировали до меня и хорошо затерли защитное стекло для камер — поэтому фото такое мутное.

Теперь нам нужно нажать «поделится объектом» и нажать «искать фотографию в Google». Лучше фотографировать что-то конкретное: например, другой смартфон или телевизор. Я снимал коробку от видеокарты и с помощью объектива нашёл обзор на неё на YouTube. Само собой, Google Поиск предложил мне открыть приложение YouTube для его просмотра!

Большая дыра в безопасности Android: Почему смартфоны с зеленым роботом подвержены кражам? Android, Гаджеты, Смартфон, Броня, Google, FRP, Аккаунт, Привязка, Icloud, Девайс, Мобильные телефоны, Телефон, Apple, Электроника, Длиннопост, Agm (бренд)



После этого, нам нужно открыть боковое меню, тапнуть на «Настройки» и попытаться открыть какую-нибудь ссылку: например, лицензия на открытый софт. Делать это нужно быстро — иначе YouTube начнёт жаловаться на то, что версия устарела и смартфон придётся обходить по новой! После этого, смартфон предлагает нам открыть полноценный браузер.

Большая дыра в безопасности Android: Почему смартфоны с зеленым роботом подвержены кражам? Android, Гаджеты, Смартфон, Броня, Google, FRP, Аккаунт, Привязка, Icloud, Девайс, Мобильные телефоны, Телефон, Apple, Электроника, Длиннопост, Agm (бренд)
Большая дыра в безопасности Android: Почему смартфоны с зеленым роботом подвержены кражам? Android, Гаджеты, Смартфон, Броня, Google, FRP, Аккаунт, Привязка, Icloud, Девайс, Мобильные телефоны, Телефон, Apple, Электроника, Длиннопост, Agm (бренд)



Уже бежите качать какой-нибудь лаунчер и открывать настройки? Не тут то было — Google предусмотрели этот нюанс. Вы не сможете ничего установить из скачанного — менеджер пакетов без активации не работает. Совсем. Поэтому, мы заходим в настройки Chrome -> Уведомления и тапаем по значку логотипа приложения. Мы уже в настройках!

Большая дыра в безопасности Android: Почему смартфоны с зеленым роботом подвержены кражам? Android, Гаджеты, Смартфон, Броня, Google, FRP, Аккаунт, Привязка, Icloud, Девайс, Мобильные телефоны, Телефон, Apple, Электроника, Длиннопост, Agm (бренд)



Сейчас сбрасывать устройство смысла нет: смартфон снова повиснет на активации (сброс сработает на устройствах с Android до 7 включительно). Однако есть забавный нюанс: если вовремя отключить Google-сервисы, то приложение активации просто начнёт считать, что мы активируем НОВОЕ устройство без СИМ-карты и предложит… пропустить шаг! Как забавно :)

Находим приложения с названиями а-ля «настройка системы» (кроме самого приложения Настройки) и всех их отключаем и снова включаем: у нас появятся все три кнопки навигации снизу и будет доступен диспетчер задач для более удобного процесса активации. Если у вашего устройства есть некое подобие Assistive Touch — оно тоже подойдет.

Теперь отключаем Google-сервисы и переключаемся на настройку системы. Жмём «Далее» и ждём пару секунд, но не дожидаемся ошибки Google-сервисов. Сразу же идём в настройки и включаем гуглосервисы обратно: по итогу, в один момент сервисы будут считать, что мы «оффлайн» и появится заветная кнопка «пропустить вход». Может получится не с первого раза. После этого, аппарат полностью «забудет» данные прошлого владельца и мы сможем без проблем войти в свой аккаунт :)

Большая дыра в безопасности Android: Почему смартфоны с зеленым роботом подвержены кражам? Android, Гаджеты, Смартфон, Броня, Google, FRP, Аккаунт, Привязка, Icloud, Девайс, Мобильные телефоны, Телефон, Apple, Электроника, Длиннопост, Agm (бренд)
Большая дыра в безопасности Android: Почему смартфоны с зеленым роботом подвержены кражам? Android, Гаджеты, Смартфон, Броня, Google, FRP, Аккаунт, Привязка, Icloud, Девайс, Мобильные телефоны, Телефон, Apple, Электроника, Длиннопост, Agm (бренд)



Если после этого у вас не устанавливаются приложения из обычных APK-пакетов, то тут два варианта решений: еще раз сбросить аппарат до заводских, либо устанавливать приложения с помощью adb — такой вариант тоже вполне работает:

Большая дыра в безопасности Android: Почему смартфоны с зеленым роботом подвержены кражам? Android, Гаджеты, Смартфон, Броня, Google, FRP, Аккаунт, Привязка, Icloud, Девайс, Мобильные телефоны, Телефон, Apple, Электроника, Длиннопост, Agm (бренд)
Большая дыра в безопасности Android: Почему смартфоны с зеленым роботом подвержены кражам? Android, Гаджеты, Смартфон, Броня, Google, FRP, Аккаунт, Привязка, Icloud, Девайс, Мобильные телефоны, Телефон, Apple, Электроника, Длиннопост, Agm (бренд)


Можно спокойно войти в свой гуглоакк.

Теперь аппарат полностью рабочий! Ретроспективу о нём не сделаешь: девайс относительно свеженький, работает на актуальной версии Android и имеет под капотом весьма неплохое железо:

  • Чипсет: Helio P22 с GPU PowerVR GE8320, с 8-ядрами Cortex-A53, 4 из которых работают на частоте до 2ГГц, а остальные 4 до 1.5ГГц.

  • ОЗУ: 4Гб

  • Память: 64Гб

  • Дисплей: 5.7 IPS-матрица. Не самая шустрая, конечно, но вполне ничего.

  • Аккумулятор: 5400мАч. Весьма бодро.

  • ОС: Android 11



В целом, весьма неплохие характеристики для современного бюджетника с приятным бонусом в виде бронированности. Уж что-что, а «бронежилет» аппарата выдержал явно многое :)
Авось кто-то из моих читателей когда-то его потерял?

❯ Заключение



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

Это не универсальный гайд и конкретный порядок действий может отличаться от версии Android и даже от версий оболочки. Но я рассказал, почему багами ОС можно обойти активацию и в общих принципах расписал то, почему гугловская защита такая плохая. А вы что думаете на этот счёт?

Материал подготовлен при поддержке TimeWeb Cloud. Подписывайтесь на меня и @Timeweb.Cloud, чтобы не пропускать новые статьи каждую неделю!

А ещё я завёл собственный Tg-канал, куда публикую различный бэкстейдж статей, анонсы новых материалов, опросы и ссылки на статьи в минуту выхода.

Показать полностью 18

Авторы на Пикабу - аккуратнее!

Те авторы, которые подключают донаты на Пикабу - будьте осторожнее! К сожалению, привязка к CloudTIps реализована кривовато и при смене номера, сотрудники саппорта не смогут вам перепривязать номер, а сотрудники CloudTips не смогут помочь с выводом при утере старого номера. Вот такие пироги ¯\_(ツ)_/¯

Отличная работа, все прочитано!