Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Я хочу получать рассылки с лучшими постами за неделю
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
Создавая аккаунт, я соглашаюсь с правилами Пикабу и даю согласие на обработку персональных данных.
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр
Красочная расслабляющая игра в жанре маджонг - Накорми Попугая! Собирайте плитки с фруктами, набирайте очки, побеждайте!

Накорми Попугая

Аркады, Маджонг, Казуальные

Играть

Топ прошлой недели

  • AlexKud AlexKud 38 постов
  • SergeyKorsun SergeyKorsun 12 постов
  • SupportHuaport SupportHuaport 5 постов
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая кнопку «Подписаться на рассылку», я соглашаюсь с Правилами Пикабу и даю согласие на обработку персональных данных.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня

Unix

С этим тегом используют

Linux IT Windows Операционная система Гаджеты Программирование Все
142 поста сначала свежее
ttt.prostokvasha
ttt.prostokvasha
1 год назад

Жесты мышкой для Линукс (стандартные)⁠⁠

Для ЛЛ
Как в Archlinux настроить жесты мышкой стандартными средствами?

Жесты мышкой для Линукс (стандартные) Linux, Мышь, Компьютерная мышка, Жесты, Вопрос, GNU, Unix, Gui, Arch, Скриншот

Не для ЛЛ
Кто то пробовал это использовать?
Я пробовал для примера создать жест
С функцией win+D

Но не нашёл где можно выбрать
Нажать win
Отпустить win

Может там как по другому это делается?
Как то прописать надо?

Что такое Команда D-Bus
Тоже не совсем понял


Но я пробовал заходить во все три категории меню
1 команда или адрес
2 Команда D-Bus
3 имитация ввода с клавиатуры

Но что то ничего не заработало


Подскажите пожалуйста как правильно настроить тут жесты мышкой?

Офф топ
На скрине наверное кубунку но на Арчлинуксе в меню так также (спасибо человеку за скрин)

Показать полностью
Linux Мышь Компьютерная мышка Жесты Вопрос GNU Unix Gui Arch Скриншот
12
ttt.prostokvasha
ttt.prostokvasha
1 год назад

Жесты мышкой для Линукса⁠⁠

Для лл
как сделать жесты мышкой на Линуксе?
или как заставить эту программу
github.com/jersou/mouse-actions
работать?

Жесты мышкой для Линукса Linux, Arch, Мышь, Жесты, GNU, Unix, Gui, Вопрос, Скриншот

Не для лл
Здравствуйте
Пробую Линукс совсем недавно
Кроме винды ничего не видел
Скачал программу
github.com/jersou/mouse-actions

на винде подобные программы работают и настраиваются внутри самой программы
(если можно так сказать)

А тут как будто что бы настроить жест нужно
создать жест в самой программе
И потом написать путь к файлу
Уже в котором описать действие для этого жеста
я вообще правильно рассуждаю?

И если да
То как написать в файле действия
win+D (например)

Как это сделать?


Вообщем подскажите пожалуйста с какого бока лучше подойти к такой программе ?
И правильно ли я понимаю в целом ее использование и настройку?

Показать полностью 1
Linux Arch Мышь Жесты GNU Unix Gui Вопрос Скриншот
40
108
monobogdan
monobogdan
1 год назад
TECHNO BROTHER

Гиковский КПК за копейки: как китайцы сделали ARM-ноутбук за 40$ с железом от… навигатора?⁠⁠

Гиковский КПК за копейки: как китайцы сделали ARM-ноутбук за 40$ с железом от… навигатора? Девайс, Гаджеты, Linux, Unix, Arm, Кпк, Нетбук, Ноутбук, Длиннопост



Китайские инженеры не перестают удивлять. Практически каждый год они умудряются в очередной раз уронить планку цены ниже плинтуса и представить рабочее полноценное устройство за довольно небольшие деньги. Примеров тому достаточно: новые кнопочные телефоны с цветными дисплеями по 500 рублей, планшеты со здоровыми 10" матрицами по 2-3 тысячи рублей, полнофункциональные смартфоны за 2 тысячи рублей. Недавно мне удалось пощупать ещё один плод сумрачного гения из Китая: миниатюрный нетбук с дисплеем 7" из далекого 2011-2012 года, который продавалсяновымза 40$. Да, это полноценное устройство: с аккумулятором, дисплеем, клавиатурой, Ethernet, Wi-Fi и тачпадом! Более того, устройство поддерживает дуалбут в Windows CE, Linux, Android, а ещё у устройства есть множество интерфейсов к внешнему миру, что превращает его в очень дешевый и довольно перспективный «одноплатник». Интересно, что за девайс придумали китайцы? Тогда добро пожаловать под кат!

❯ Как они вообще появились?


Ещё в середине нулевых с момента появления первых интернет-планшетов, за подобными девайсами широко закрепилось названиеMID— Mobile Internet Device. Это были миниатюрные устройства, которые имели довольно широкие мультимедийные возможности и необходимый минимум для доступа в интернет: Wi-Fi/Bluetooth/Ethernet и встроенный браузер, позволявший грузить полноценный Web 2.0 страницы.

Гиковский КПК за копейки: как китайцы сделали ARM-ноутбук за 40$ с железом от… навигатора? Девайс, Гаджеты, Linux, Unix, Arm, Кпк, Нетбук, Ноутбук, Длиннопост



MID были довольно дорогими устройствами и предназначались скорее для гиков, нежели для обычных людей. Примерно к 2010 году на рынке дешевых и довольно производительных чипсетов уже появилось, как минимум, несколько игроков: Ingenic с MIPS-чипсетами JZxxx (известные как процессоры журнала VOGUE и чипсет Dingoo A320), Actions Semiconductor со своими MIPS-чипами для MP5-плееров, в некоторой степени SiRF со своими SoC для навигаторов на Windows CE (тоже, если не ошибаюсь, MIPS) и тайваньский гигант VIA Technologies, который уже был известен как один из немногих производителей x86 процессоров. Помимо разработки x86 процессоров, у компании VIA было подразделение, ответственное за разработку ARM-чипсетов —WonderMedia Technologies.

Гиковский КПК за копейки: как китайцы сделали ARM-ноутбук за 40$ с железом от… навигатора? Девайс, Гаджеты, Linux, Unix, Arm, Кпк, Нетбук, Ноутбук, Длиннопост



В задачи этого подразделения входила разработка высоко-интегрированных решений, которые можно было бы использовать в нетбуках и планшетах — очень популярный сегмент рынка в конце 2000-х начале 2010-х годов. Тайваньские и китайские инженеры хотели сделать действительно очень дешевые нетбуки, где взаимозаменяемо всё: материнские платы, дисплеи, клавиатуры, динамики и разъёмы. Так и произошло: на dealextreme, aliexpress и иных онлайн-маркетплейсах появилось довольно большое количество различных нетбуков по 50 баксов, что по тем деньгам было около 1.500-1.700 рублей. Однако работали они далеко не всегда на WM8650: я встречал устройства и на иных чипах, иногда совершенно мне неизвестных. Но подавляющее число подобных буков работали именно на WM8650 — именно по названию процессора их до сих пор иногда можно найти на онлайн-барахолках за копейки.

Гиковский КПК за копейки: как китайцы сделали ARM-ноутбук за 40$ с железом от… навигатора? Девайс, Гаджеты, Linux, Unix, Arm, Кпк, Нетбук, Ноутбук, Длиннопост



Судя по утекшей схеме на WM8650, разработкой референса занималась сама WonderMedia и давала производителям электроники практически готовую платформу, на базе которой те могли разрабатывать свои устройства. И всё бы ничего, однако компания, судя по всему, поставляла сразу готовые процессорные модули (также известные как System on Module — системы на модуле) с определенной конфигурацией по NAND и ОЗУ, которые оставалось припаять к основной плате, на которой уже будет разведена необходимая периферия. Это кардинально снижало сложность выпуска уже готового устройства. При желании, плату для WM8650 можно хоть дома протравить, запаять на неё модуль и попытаться запустить!

Гиковский КПК за копейки: как китайцы сделали ARM-ноутбук за 40$ с железом от… навигатора? Девайс, Гаджеты, Linux, Unix, Arm, Кпк, Нетбук, Ноутбук, Длиннопост



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

Гиковский КПК за копейки: как китайцы сделали ARM-ноутбук за 40$ с железом от… навигатора? Девайс, Гаджеты, Linux, Unix, Arm, Кпк, Нетбук, Ноутбук, Длиннопост



Когда девайс пришёл, я осмотрел его и понял, что проблемы гораздо серьёзнее, чем казалось на первый взгляд: АКБ уже не держит, петли разболтаны до ужаса, а матрицу кто-то разбил прям «в хлам» (вероятно, кулаком). Давайте разберем его и рассмотрим поближе!

❯ Что внутри?


Несмотря на то, что это ультрадешёвое устройство, разбирается оно вполне как и обычные ноутбуки: откручиваем задние винты крышки аккумулятора, отключаем АКБ (осторожно, на таких устройствах они очень дутые, хоть и посажены в ноль), вытаскиваем клавиатуру, отщелкивая несколько клипс, отключаем шлейф и снимаем поддон, отключив шлейф тачпада.

Гиковский КПК за копейки: как китайцы сделали ARM-ноутбук за 40$ с железом от… навигатора? Девайс, Гаджеты, Linux, Unix, Arm, Кпк, Нетбук, Ноутбук, Длиннопост



А вот и наша основная плата. Однако самое интересное здесь с обратной стороны: давайте сначала глянем на шлейф дисплея и разберем рамку. В устройстве используется TN-матрица с 50pin шлейфом (они стандартизированы), TTL-интерфейсом и разрешением 480х800. Такие матрицы найти не проблема: в основном, встречаются они найти в планшетах 2011-2012 года и в современных 7" игровых консолях. Не исключено, что вы сможете найти их в автомобильных телевизорах, магнитолах, или, например, домофонах. Сразу же нашлась причина слабых петель: винтики банально вылетели из резьбы, однако сама резьба была целой (вероятно, что-то очень резко дёрнул устройство со психу).

Гиковский КПК за копейки: как китайцы сделали ARM-ноутбук за 40$ с железом от… навигатора? Девайс, Гаджеты, Linux, Unix, Arm, Кпк, Нетбук, Ноутбук, Длиннопост
Гиковский КПК за копейки: как китайцы сделали ARM-ноутбук за 40$ с железом от… навигатора? Девайс, Гаджеты, Linux, Unix, Arm, Кпк, Нетбук, Ноутбук, Длиннопост



Замена нашлась сразу: я взял дисплей с китайской реплики iPad тех же лет и… на том же WM8650! Обратите внимание на модуль Wi-Fi: сам он выполнен в виде USB-свистка и расположен около матрицы, а от него идёт 4 провода прямо к пятачкам USB на плате. Здесь много что реализовано на USB. :)

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

Дальше устройство разбирается крайне просто: мы откручиваем петли, откладываем экран в сторону и вытаскиваем плату. Судя по ручной пайке периферии, девайс собирался либо в подвальных, либо в полуподвальных условиях, но здесь есть много интересного! Первым делом мы смотрим на процессорный модуль, который припаивался поверх основной платы: на его выводах есть подписанные пятачки, а на сам модуль есть схема в интернете. При желании, его можно выпаять и попробовать запустить его самому. А можно подпаяться к его интерфейсам (i2c/spi/uart) и получить к ним доступ из под Linux или WinCE!

Помимо чипсета WM8650, на плате также можно найти NAND-память и две банки ОЗУ по 128Мб, а также SPI флэш-память с записанным на неё «BIOS» этого устройства — SPL и загрузчиком U-Boot.

Гиковский КПК за копейки: как китайцы сделали ARM-ноутбук за 40$ с железом от… навигатора? Девайс, Гаджеты, Linux, Unix, Arm, Кпк, Нетбук, Ноутбук, Длиннопост



Дальше на плате встречается чарджер АКБ, контроллер клавиатуры от производителя процессора Тетриса — Holtek HT82B40A (вероятно, USB), USB-хаб GL850G (чуть ли не второй по важности чип в этом устройстве, почему — читайте позже), сетевой контроллер VIA VT6113, сетевой контроллер физических уровней (по простому — именно этот чип преобразует байты в дифференциальные сигналы Ethernet) S16013LF, кодек VT1603A. Да, это всё :) Конечно на плате дисплея есть ещё бустер напряжения подсветки, но в целом — это практически весь нетбук. Да, такой простой! Его и дома при большом желании развести можно — благодаря простоте платы, в целом можно было наладить простенькое производство плат и масок и вручную собирать подобные девайсы в условиях настоящего подвала!

Гиковский КПК за копейки: как китайцы сделали ARM-ноутбук за 40$ с железом от… навигатора? Девайс, Гаджеты, Linux, Unix, Arm, Кпк, Нетбук, Ноутбук, Длиннопост



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

  • Чипсет: ARMv5 600мгц, одно ядро, нет GPU, но есть 2D-ускоритель и блок декодирования видео.

  • NAND: 4гб

  • ОЗУ: 256Мб DDR2

  • Дисплей: 7" TN-матрица 800x480, TTL 50pin.

  • Интерфейсы: USB, I2C, SPI, UART. Сеть: Ethernet, Wi-Fi


С аппаратной частью разобрались. Мне лично очень понравилась простота конструкции данного девайса. Учитывая, что некоторые пятачки подписаны, есть возможность превратить девайс в эдакий одноплатник — только с уже готовым дисплеем, клавиатурой и тачпадом. Давайте посмотрим, что же это за девайс в программном плане!

❯ Софт


В программном плане девайс тоже весьма интересен. Для WonderMedia есть порт аж 3 ОС: Windows CE, Linux и Android (тесно связанный с портом Linux). Windows CE считается основной: её есть возможность как дуалбутить с USB-флэшки (чем пользовались некоторые вендоры для тотальной экономии и вместо NAND-чипа распаивали 2гб USB-флэшку… почему это было дешевле — мне неизвестно), так и с NAND или SD. Кроме того, вендоры часто предоставляли возможность перепрошивки устройства на Android 2.2. Бегает он здесь не очень быстро, но достаточно сносно: по крайней мере, в своё время этого хватало для базового сёрфинга интернета и просмотра мультимедиа. А порт дистрибутивов Linux, насколько я понимаю, развивали уже сторонние разработчики. Прошивки всё ещё можно найти на профильных сайтах типа 4pda — и никаких проблем с их поиском не будет.

Гиковский КПК за копейки: как китайцы сделали ARM-ноутбук за 40$ с железом от… навигатора? Девайс, Гаджеты, Linux, Unix, Arm, Кпк, Нетбук, Ноутбук, Длиннопост



Прошивки можно легко модифицировать и миксовать между собой, не забывая сохранять ядро вашего устройства — поскольку половина девайса выполнена в виде USB-модулей, никакой devicetree не нужен. Однако, прошивка для 10" нетбука не встанет на 7" — у вас будет белый экран из-за несовместимости драйверов дисплея. Теоретически, можно попробовать воткнуть прошивку от китайского айпада на этом чипсете, но это уже близко к извращению.

Мы же посмотрим на WinCE такой, каким его представляет нам производитель. Китайцы довольно сильно заморочились, дабы устройство походило на обычный нетбук на старой доброй Windows XP и даже дописали свой софт!

Девайс включается довольно долго — около 3-4 минут при «холодном старте». Занимательно, что даже анимацию загрузки U-Boot замаскировали под эдакий «типа Windows». :) Видно что инженеры хотели сделать что-то типа OLPC (One Laptop Per Child).

Гиковский КПК за копейки: как китайцы сделали ARM-ноутбук за 40$ с железом от… навигатора? Девайс, Гаджеты, Linux, Unix, Arm, Кпк, Нетбук, Ноутбук, Длиннопост



После загрузки девайс работает весьма сносно. Производительность далека от современных девайсов и находится примерно на уровне… Win98 машин на Pentium III. Но в целом, за свою цену машинка работает весьма сносно. Другой вопрос, что в 2011-2012 году, настоящий ноутбук на P III можно было взять в пределах тех же 2-х тысяч рублей, а то и дешевле!

Гиковский КПК за копейки: как китайцы сделали ARM-ноутбук за 40$ с железом от… навигатора? Девайс, Гаджеты, Linux, Unix, Arm, Кпк, Нетбук, Ноутбук, Длиннопост



В девайсе из коробки работает и Wi-Fi и Ethernet, никаких внешних манипуляций не нужно. В целом, машинка может весьма пригодится как терминал: устройство очень компактное и легкое, живет от нормально АКБ относительно долго, а под устройство есть как клиенты RDP/VNC, так и SSH/Telnet (порт Putty).

Девайс может пригодится не только сисдаминам и DIY-щикам, но и стать «гаражным» нетбуком или резервным устройством для просмотра кино или… даже игр! В WM8650 (но не в WM8505) есть аппаратный декодер h263 видео, вплоть до 720p. Поскольку сам дисплей здесь 480p, то какого-либо смысла в дисплеях высокого разрешения нет.

Гиковский КПК за копейки: как китайцы сделали ARM-ноутбук за 40$ с железом от… навигатора? Девайс, Гаджеты, Linux, Unix, Arm, Кпк, Нетбук, Ноутбук, Длиннопост


Когда-то здесь был даже YouTube!

Гиковский КПК за копейки: как китайцы сделали ARM-ноутбук за 40$ с железом от… навигатора? Девайс, Гаджеты, Linux, Unix, Arm, Кпк, Нетбук, Ноутбук, Длиннопост


Знакомо?

А что касается игр — ну, тут самое время вспомнить hpc.ru и раздел Windows Mobile на 4pda. Так уж вышло, что многие приложения для Windows Mobile без проблем запускается и на WinCE без изменений — даже программы на .NET! Тут мы и можем разгуляться.

На устройство можно накатить и десктопный дистрибутив Linux! Правда, готовьтесь к тому, что часть софта придется собирать вручную — armv5 и armv6 уже очень давно не поддерживаются в основных дистрибутивах. Поскольку материнская компания WonderMedia, VIA — уважаемая компания, которая (вроде бы) ни разу не нарушала GPL, с релизом устройств был опубликован исходный код порта ядра Linux 2.6 для Android. Путем правки конфигов конфига и сборки ядра, пригодного для десктопных дистрибутивов Linux, энтузиастам удалось портировать Debian (есть только в виде полупустой системы с нужными модулями, без GUI, однако пакеты можно поставить, добавив armlf архивы в sources.list) и arch (с GUI-интерфейсом). Обе системы накатываются на флешку за 5 минут и не заменяют собой WinCE: можно легко сделать дуалбут.

Гиковский КПК за копейки: как китайцы сделали ARM-ноутбук за 40$ с железом от… навигатора? Девайс, Гаджеты, Linux, Unix, Arm, Кпк, Нетбук, Ноутбук, Длиннопост


Не было скриншотера в репозиториях :(

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

Гиковский КПК за копейки: как китайцы сделали ARM-ноутбук за 40$ с железом от… навигатора? Девайс, Гаджеты, Linux, Unix, Arm, Кпк, Нетбук, Ноутбук, Длиннопост

❯ Заключение


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

Гиковский КПК за копейки: как китайцы сделали ARM-ноутбук за 40$ с железом от… навигатора? Девайс, Гаджеты, Linux, Unix, Arm, Кпк, Нетбук, Ноутбук, Длиннопост


Касательно аппаратного моддинга — это тема для отдельной статьи. С «процессорной платы» выходят несколько протоколов, которые потенциально можно заюзать для своих проектов — как минимум, I2C и UART. Я не уверен насчет возможности использования i2c в юзерспейсе на Windows CE, но вот UART (если он не занят системой) можно будет использовать без проблем. Под Linux всё ещё проще: можно «выкинуть» устройства, которые используют SPI/I2C и подгрузить i2cdev/spidev прямо в юзерспейс! Таким образом, можно попробовать смастерить всякую всячину.

Я лично думал впаять сюда SIM800 и написать фронтэнд для него, а затем попробовать походить как с телефоном. А что, нетбук реально крошечный и легко поместится в карман зимней куртки! Звучит как дикий изврат но я, bodyawm, люблю подобное. :) Иначе не стал бы пилить прошивку под NoName-смартфон 2012 года!

Показать полностью 18
[моё] Девайс Гаджеты Linux Unix Arm Кпк Нетбук Ноутбук Длиннопост
26
1
Pubertatnichek
Pubertatnichek
1 год назад

Когда в башке перепутались Unix с Чиграковым⁠⁠

А не написать бы мне драйвер

о любви?

И не забыть выставить точку восстановления)

[моё] Чиж Unix Любовь Счастье Текст
1
5670
monobogdan
monobogdan
1 год назад
TECHNO BROTHER

Сам себе Linux смартфон: Как я выкинул Android и написал свою прошивку с нуля⁠⁠

Сам себе Linux смартфон: Как я выкинул Android и написал свою прошивку с нуля Гаджеты, Смартфон, Телефон, Покупка, Китайцы, Fly, Моддинг, Программирование, 2D, Своими руками, Одноплатный компьютер, Raspberry pi, Orange pi, Инженерия, Электроника, Android, Linux, Unix, iPhone, Мобильные телефоны, Видео, Без звука, YouTube, Длиннопост



К огромному сожалению, старые смартфоны всё чаще и чаще находят своё пристанище в мусорном баке. К прошлым, надежным «друзьям» действует исключительно потребительское отношение — чуть устарел и сразу выкинули, словно это ненужный мусор. И ведь люди даже не хотят попытаться придумать какое-либо применение гаджетам прошлых лет! Отчасти, это вина корпораций — Google намеренно тормозит и добивает довольно шустрые девайсы. Отчасти — вина программистов, которые преследуют исключительно бизнес-задачи и не думают об оптимизации приложений совсем. В один день я почувствовал себя Тайлером Дёрденом от мира IT и решил бросить вызов проприетарщине: написать свою прошивку для уже существующего смартфона с нуля. А дабы задачка была ещё интереснее, я выбрал очень распространенную и дешевую модель из 2012 года — Fly IQ245 (цена на барахолках — 200-300 рублей). Кроме того, у этого телефона есть сразу несколько внешних шин, к которым можно подключить компьютер или микроконтроллер, что даёт возможность использовать его в качестве ультрадешевого одноплатника для DIY-проектов. Получилось ли у меня реализовать свои хотелки? Читайте в статье!

Мотивация


Честно сказать, идея попытаться реализовать свою прошивку мне пришла ещё давно. Однако, дабы не завлекать опытного читателя кликбейтом, я сразу поясню, в чём заключается «прошивка с нуля»:

  1. Мы всё ещё используем Linux: в качестве ядра мы продолжаем использовать образ Linux, предоставленный нам производителем. Написание прошивки полностью с нуля заняло бы очень много времени (особенно без схемы на устройство). Однако, мы вообще не загружаем Android никаким образом.

  2. Мы не используем библиотеки AOSP: наша прошивка без необходимости не использует никаких библиотек уже имеющегося образа Android. Вся работа с железом происходит с помощью низкоуровневого API Linux. Это значит, что отрисовка графики, звук, управление ресурсами и питанием ложится полностью на нас.

  3. Прошивка может запускать только нативные программы: да, это тоже камень в сторону Android. Изначально, наша прошивка умеет запускать только нативные программы, написанные на C. Причём она экспортирует собственное C API — дабы приложения могли использовать всю мощь нашего смартфона в виде простого и понятного набора методов.

Сам себе Linux смартфон: Как я выкинул Android и написал свою прошивку с нуля Гаджеты, Смартфон, Телефон, Покупка, Китайцы, Fly, Моддинг, Программирование, 2D, Своими руками, Одноплатный компьютер, Raspberry pi, Orange pi, Инженерия, Электроника, Android, Linux, Unix, iPhone, Мобильные телефоны, Видео, Без звука, YouTube, Длиннопост



Проектов по выкидыванию Android из, собственно, Android-смартфонов как минимум несколько: UBPorts — бывший Ubuntu Touch, FireFox OS и его наследник Kai OS и конечно же, postmarketOS. Отчасти можно сюда отнести и Sailfish OS — но там образы имеются в основном на смартфоны от Sony. Все эти проекты объединяет сложность портирования и невозможность их завести на устройствах без исходного кода ядра. Даже если у вас есть исходный код ядра, но, например, устройство использует ядро 2.6 — навряд-ли вы сможете завести современный дистрибутив на нём.

Другой вопрос в том, что можно использовать полу-baremetal подход, когда от Linux берется практически минимальный функционал. Всё, что мы имеем — busybox, libc и низкоуровневый доступ к железу, благодаря API самого ядра. Как под это всё программировать — я рассказывал впрошлойстатье. Этот же подход мы будем использовать и сейчас — как иллюстрация реального применения подобного способа.

Итак, что наша прошивка должна уметь:

  • Отрисовывать произвольную графику: графическая подсистема нашей прошивки должна работать с фиксированным форматом пикселя, уметь загружать прозрачные и непрозрачные изображения, отрисовывать картинки с альфа-блендингом и т. п.

  • Уметь звонить и работать с модемом: общение с модемом происходит посредством AT-команд — общепринятого в индустрии стандарта. Однако в случае нашего устройства, есть м-а-а-а-ленький нюанс, о котором я расскажу позже.

  • Иметь механизм приложений: мы ведь не будем хардкодить все «экраны» в прошивке в виде кучи стейтов, верно? Для этого у нас должен быть простой и понятный механизм слинкованных с прошивкой приложений.

  • Обрабатывать ввод: обработка тачскрина и жестов — это задача подсистемы ввода.

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


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

Аппаратная часть


В качестве смартфона для нашего проекта, я выбрал популярную бюджетную модель из 2012 года — Fly IQ245 Wizard. Это простенький китайский смартфон, который работал на базе популярного в прошлом 2G-чипсета: MediaTek MT6573, да и стоил около 2х тысяч рублей новым. Однако вот в чём суть: мне удалось заставить работать «медиатековский» модем и даже позвонить с него на свой основной телефон, но… только ввод и вывод данных из звукового тракта модема происходит через звуковую подсистему Android — к которой доступа у нас нет!

Сам себе Linux смартфон: Как я выкинул Android и написал свою прошивку с нуля Гаджеты, Смартфон, Телефон, Покупка, Китайцы, Fly, Моддинг, Программирование, 2D, Своими руками, Одноплатный компьютер, Raspberry pi, Orange pi, Инженерия, Электроника, Android, Linux, Unix, iPhone, Мобильные телефоны, Видео, Без звука, YouTube, Длиннопост



Именно поэтому, мы идём на очень хитрый и занимательный костыль: мы распаяем внешний модем сами! В качестве радиомодуля у нас выступит модуль SIM800 от компании SIMCOM. И даже он очень близок к нашему смартфону в аппаратном плане: ведь в основе этого модуля лежит популярнейший чипсет из кнопочников тех лет: MediaTek MT6261D. Преимущество SIM800 в его цене — он стоит пару сотен рублей, так что по карману выбор модема не влияет.

Сам себе Linux смартфон: Как я выкинул Android и написал свою прошивку с нуля Гаджеты, Смартфон, Телефон, Покупка, Китайцы, Fly, Моддинг, Программирование, 2D, Своими руками, Одноплатный компьютер, Raspberry pi, Orange pi, Инженерия, Электроника, Android, Linux, Unix, iPhone, Мобильные телефоны, Видео, Без звука, YouTube, Длиннопост


На весу паять крайне неудобно. В финальном варианте перепаяю нормально.

Но как его подключать? SIM800 общается с другими устройствами посредством протокола UART — универсальный асинхронный приемо-передатчик. И вот тут мы включаем смекалочку. Разбираем устройство и видим то, что я пытаюсь долгое время донести до моих читателей — аж два канала UART: один практически посередине, второй справа. Нам нужны пятачки TXD4 и RXD4:

Сам себе Linux смартфон: Как я выкинул Android и написал свою прошивку с нуля Гаджеты, Смартфон, Телефон, Покупка, Китайцы, Fly, Моддинг, Программирование, 2D, Своими руками, Одноплатный компьютер, Raspberry pi, Orange pi, Инженерия, Электроника, Android, Linux, Unix, iPhone, Мобильные телефоны, Видео, Без звука, YouTube, Длиннопост



Обычно на этот канал UART летят логи ядра, которые можно без проблем отключить минорной правкой U-Boot в HEX-редакторе. Впрочем, модем никак не реагирует на «мусор» из консоли и просто отвечает ошибками — хватит лишь очистить буфер сообщений для того, чтобы все работало нормально. Подпаиваемся к UART'у с помощью преобразователя — у меня оным выступает ESP32 с выпаянным чипом.

Сам себе Linux смартфон: Как я выкинул Android и написал свою прошивку с нуля Гаджеты, Смартфон, Телефон, Покупка, Китайцы, Fly, Моддинг, Программирование, 2D, Своими руками, Одноплатный компьютер, Raspberry pi, Orange pi, Инженерия, Электроника, Android, Linux, Unix, iPhone, Мобильные телефоны, Видео, Без звука, YouTube, Длиннопост
Сам себе Linux смартфон: Как я выкинул Android и написал свою прошивку с нуля Гаджеты, Смартфон, Телефон, Покупка, Китайцы, Fly, Моддинг, Программирование, 2D, Своими руками, Одноплатный компьютер, Raspberry pi, Orange pi, Инженерия, Электроника, Android, Linux, Unix, iPhone, Мобильные телефоны, Видео, Без звука, YouTube, Длиннопост


Увидели логи? Замечательно, пора попытаться что-то отправить на ПК и с ПК. UART работают без тактовых сигналов и зависит исключительно от старт/стоп битов и бодрейта, который на устройствах MediaTek равен 921600. TXD4 и RXD4 обнаруживаются в системе на консоли/dev/ttyMT3. Пробуем что-то отправить: всё работает!

Сам себе Linux смартфон: Как я выкинул Android и написал свою прошивку с нуля Гаджеты, Смартфон, Телефон, Покупка, Китайцы, Fly, Моддинг, Программирование, 2D, Своими руками, Одноплатный компьютер, Raspberry pi, Orange pi, Инженерия, Электроника, Android, Linux, Unix, iPhone, Мобильные телефоны, Видео, Без звука, YouTube, Длиннопост



Вот теперь-то можно подключить наш внешний модем и попытаться пообщаться с ним, отправив тестовую командуAT. Модем отвечаетOK! На этот раз я работаю с смартфоном из режимаFactory mode— практически тоже самое, что и режим recovery, но позволяющий, например, получить доступ к камере устройства. Простая и понятная схема, поясняющая что и куда подключать:

Сам себе Linux смартфон: Как я выкинул Android и написал свою прошивку с нуля Гаджеты, Смартфон, Телефон, Покупка, Китайцы, Fly, Моддинг, Программирование, 2D, Своими руками, Одноплатный компьютер, Raspberry pi, Orange pi, Инженерия, Электроника, Android, Linux, Unix, iPhone, Мобильные телефоны, Видео, Без звука, YouTube, Длиннопост



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

Заставляем смартфон запускать нашу прошивку


На этот раз я решил загружать смартфон из режима рекавери. Однако никто не мешает в будущем просто прошить раздел recovery вместо boot и получить прямую загрузку прямо в нашу прошивку. Время такой загрузки будет заниматься ~3-4 секунды с холодного старта. Очень даже ничего.

Сам себе Linux смартфон: Как я выкинул Android и написал свою прошивку с нуля Гаджеты, Смартфон, Телефон, Покупка, Китайцы, Fly, Моддинг, Программирование, 2D, Своими руками, Одноплатный компьютер, Raspberry pi, Orange pi, Инженерия, Электроника, Android, Linux, Unix, iPhone, Мобильные телефоны, Видео, Без звука, YouTube, Длиннопост



Я взял уже готовый образ TWRP для своего смартфона и пропатчил его, дабы сам рекавери не мешал своим интерфейсом. Для этого я распаковал образ recovery.img с помощью MtkImgTools и убрал в init.rc запуск службы /sbin/recovery. После этого, я залил прошивку обратно на устройство и получил подобную свободу действий — консоль через USB и чистый холст в виде смартфона! Старые смартфоны на чипсетах MediaTek шьются через USB только после замыкания тест-поинта — на моем аппарате его местонахождение очевидно. Замыкаем контакты между собой, подключаем смартфон без АКБ к ПК и ждем прошивки:

Сам себе Linux смартфон: Как я выкинул Android и написал свою прошивку с нуля Гаджеты, Смартфон, Телефон, Покупка, Китайцы, Fly, Моддинг, Программирование, 2D, Своими руками, Одноплатный компьютер, Raspberry pi, Orange pi, Инженерия, Электроника, Android, Linux, Unix, iPhone, Мобильные телефоны, Видео, Без звука, YouTube, Длиннопост



Теперь можно деплоить программы! Важный нюанс: в отличии от Makefile из прошлой статьи, для Android 2.3 параметр -fPIE нужно убрать — иначе динамический линкер (/sbin/linker) будет вылетать в segmentation fault.

Сам себе Linux смартфон: Как я выкинул Android и написал свою прошивку с нуля Гаджеты, Смартфон, Телефон, Покупка, Китайцы, Fly, Моддинг, Программирование, 2D, Своими руками, Одноплатный компьютер, Raspberry pi, Orange pi, Инженерия, Электроника, Android, Linux, Unix, iPhone, Мобильные телефоны, Видео, Без звука, YouTube, Длиннопост

❯ Графическая подсистема


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

Сам себе Linux смартфон: Как я выкинул Android и написал свою прошивку с нуля Гаджеты, Смартфон, Телефон, Покупка, Китайцы, Fly, Моддинг, Программирование, 2D, Своими руками, Одноплатный компьютер, Raspberry pi, Orange pi, Инженерия, Электроника, Android, Linux, Unix, iPhone, Мобильные телефоны, Видео, Без звука, YouTube, Длиннопост



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

В случае с этим устройством (и большинством старых устройств), формат пикселя оказался RGB565 — т. е. 5 бит красный, 6 бит синий, 5 бит зеленый. Конвертация форматов пикселей всегда была занозой в заднице для программных рендереров, поскольку занимает дополнительное время, которое обратно зависимо от размера дисплея. Изначально я решил выделить буфер в том же формате, что и фреймбуфер, но затем решил сделать классический и самый портативный формат — RGB888 (24х-битный цвет), а при копировании кадра на экран, на лету делать преобразования цвета:

Сам себе Linux смартфон: Как я выкинул Android и написал свою прошивку с нуля Гаджеты, Смартфон, Телефон, Покупка, Китайцы, Fly, Моддинг, Программирование, 2D, Своими руками, Одноплатный компьютер, Raspberry pi, Orange pi, Инженерия, Электроника, Android, Linux, Unix, iPhone, Мобильные телефоны, Видео, Без звука, YouTube, Длиннопост

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

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

Сам себе Linux смартфон: Как я выкинул Android и написал свою прошивку с нуля Гаджеты, Смартфон, Телефон, Покупка, Китайцы, Fly, Моддинг, Программирование, 2D, Своими руками, Одноплатный компьютер, Raspberry pi, Orange pi, Инженерия, Электроника, Android, Linux, Unix, iPhone, Мобильные телефоны, Видео, Без звука, YouTube, Длиннопост

Загрузчик TGA сильно не поменялся: я таскаю его в неизменном виде из проекта в проект. Он поддерживает любые форматы пикселя, кроме палитровых, но я его искусственн ограничиваю на RGB888 и RGBA8888 — для поддержки обычных картинок и картинок с альфа-каналом. После этого, я написал не очень шустрые, но достаточно универсальные методы для отрисовки картинок. Для больших участков кода, я буду использовать pastebin, поскольку на Пикабу до сих пор не добавили ни подсветки синтаксиса, не нормальный перенос форматирования табов :(

__inline void __ClipPrimitive(CFrameBuffer* fbDesc, int* dw, int* dh){ if - Pastebin.com

PutPixel желательно заинлайнить в будущем. В целом, сама отрисовка работает достаточно быстро, но поскольку рендеринг выполняется на ЦПУ — рано или поздно мы упремся в количество картинок на экране. Есть некоторые оптимизации: например, непрозрачные картинки можно просто коприовать сканлайнами прямо в задний буфер.

Сразу же реализовываем методы для рисования шрифтов: они у нас будут совсем простенькими — только моноширинные (все символы имеют одинаковую ширину) и растровыми (для каждого размера придется «запекать» несколько шрифтов). Для этого я написал маленькую программку, которая рисует виндовые шрифты прямо в наш самопальный формат:

Сам себе Linux смартфон: Как я выкинул Android и написал свою прошивку с нуля Гаджеты, Смартфон, Телефон, Покупка, Китайцы, Fly, Моддинг, Программирование, 2D, Своими руками, Одноплатный компьютер, Raspberry pi, Orange pi, Инженерия, Электроника, Android, Linux, Unix, iPhone, Мобильные телефоны, Видео, Без звука, YouTube, Длиннопост

Формат примитивнейший:

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

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

Теперь у нас есть отображение картинок и текста! Что с этим можно сделать?

❯ Обработка ввода

Сам себе Linux смартфон: Как я выкинул Android и написал свою прошивку с нуля Гаджеты, Смартфон, Телефон, Покупка, Китайцы, Fly, Моддинг, Программирование, 2D, Своими руками, Одноплатный компьютер, Raspberry pi, Orange pi, Инженерия, Электроника, Android, Linux, Unix, iPhone, Мобильные телефоны, Видео, Без звука, YouTube, Длиннопост
Сам себе Linux смартфон: Как я выкинул Android и написал свою прошивку с нуля Гаджеты, Смартфон, Телефон, Покупка, Китайцы, Fly, Моддинг, Программирование, 2D, Своими руками, Одноплатный компьютер, Raspberry pi, Orange pi, Инженерия, Электроника, Android, Linux, Unix, iPhone, Мобильные телефоны, Видео, Без звука, YouTube, Длиннопост

Пока что здесь не хватает обработки «хардварных» кнопок — домой, меню, назад и т. п. Однако в будущем это всё можно реализовать!

❯ Анимация


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

Аниматор напоминает оный из ранних версий Android: он имеет фиксированный набор свойств, которые умеет интерполировать в промежутках определенного времени. Если простыми словами: то он оперирует линейными отрезками времени a и b, в промежутке которых мы имеем значение «прогресса» — которое даёт нам результат от 0.0f (начало анимации) до 1.0f (конец анимации). Пока время тикает до необходимого интервала (duration), аниматор интерполирует заранее назначенные ему поля до нужных значений.

Именно так и получается плавность! Похожим образом реализованы анимационные системы во многих играх и мобильных ОС, только там они гораздо более комплексны: есть сериализация/десериализация из файлов, поддержка кейфреймов (несколько последовательных состояний на одном промежутке времени), поддержка кастомных свойств и т. п.

Сам себе Linux смартфон: Как я выкинул Android и написал свою прошивку с нуля Гаджеты, Смартфон, Телефон, Покупка, Китайцы, Fly, Моддинг, Программирование, 2D, Своими руками, Одноплатный компьютер, Raspberry pi, Orange pi, Инженерия, Электроника, Android, Linux, Unix, iPhone, Мобильные телефоны, Видео, Без звука, YouTube, Длиннопост


❯ Модем


Как я уже говорил раннее, работа с модемом происходит посредством AT-команд. Лучше всего обрабатывать ввод-вывод модема из отдельного потока, поскольку он может отвечать довольно медленно и тормозить UI-поток основной программы, вызывая лаги. В SIM800 уже реализован весь GSM-стек, в том числе декодирование и вывод звука через встроенный усилитель с фильтром — остается только подключить динамики и микрофон от нашего телефона. Пока что я подсобрал аудиотракт на том, что было под рукой — микрофон от нерабочего смартфона и динамик от планшета, но для проверки этого хватает:

Сам себе Linux смартфон: Как я выкинул Android и написал свою прошивку с нуля Гаджеты, Смартфон, Телефон, Покупка, Китайцы, Fly, Моддинг, Программирование, 2D, Своими руками, Одноплатный компьютер, Raspberry pi, Orange pi, Инженерия, Электроника, Android, Linux, Unix, iPhone, Мобильные телефоны, Видео, Без звука, YouTube, Длиннопост

Важный нюанс: по умолчанию, tty-устройства в Linux работают по терминальному принципу — т. е. дробят транзакции по символу окончания строки (\n), имеют ограниченный буфер и т. д. Для нормальной работы в условиях модема — когда фактически длина ответа неизвестна, а в сам ответ могут «вклиниваться» Unsolicited-команды (своеобразные флаги о состоянии от модема, которые могут прийти в произвольное время — т. е. при входящем звонке, модем начнёт флудить RING в терминал), необходимо иметь возможность точно прочитать весь буфер до конца и парсить данные «по месту». Для этого используется raw-режим терминала:

tcgetattr(modemFd, &tio);

tio.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);

tio.c_oflag &= ~(OPOST);

tio.c_cflag |= (CS8);

tio.c_lflag &= ~(ECHO | ICANON | IEXTEN | ISIG);

tcsetattr(modemFd, TCSAFLUSH, &tio);

После чего можно запросить состояние модема:

Сам себе Linux смартфон: Как я выкинул Android и написал свою прошивку с нуля Гаджеты, Смартфон, Телефон, Покупка, Китайцы, Fly, Моддинг, Программирование, 2D, Своими руками, Одноплатный компьютер, Raspberry pi, Orange pi, Инженерия, Электроника, Android, Linux, Unix, iPhone, Мобильные телефоны, Видео, Без звука, YouTube, Длиннопост

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

void CModem::Dial(char* number){ if(strlen(number) > 32) return; cha - Pastebin.com

Пытаемся позвонить с помощью метода Dial и видим, что всё работает! Это очень круто! А теперь, конечно же, самое время переходить к реализации того, чего вы ждали — пользовательского интерфейса!

❯ Главный экран


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

Сам себе Linux смартфон: Как я выкинул Android и написал свою прошивку с нуля Гаджеты, Смартфон, Телефон, Покупка, Китайцы, Fly, Моддинг, Программирование, 2D, Своими руками, Одноплатный компьютер, Raspberry pi, Orange pi, Инженерия, Электроника, Android, Linux, Unix, iPhone, Мобильные телефоны, Видео, Без звука, YouTube, Длиннопост



Начал я с разделения главного экрана на модули и продумывания архитектуры основного «лаунчера». У нас есть статусбар, который рисуется поверх всех приложений, полка с приложениями — AppDrawer и сами экраны приложений, унаследованные от суперкласса CScreen.

class CScreen{protected: CAnimator* windowAnimator;public: CScreen(); - Pastebin.com

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

void CLauncher::DrawAppDrawer(){ for(int i = 0; i < sizeof(Apps) / sizeof(CA - Pastebin.com

Практически сразу я решил обкатать анимационную «систему» и добавить первые анимашки — выезжающий статусбар и анимация а-ля айфон:

animator = new CAnimator();

animator->SetTranslation(0, -imFiller->Height, 0, 0);

animator->Run();

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

gLauncher->Graphics->DrawImage(imFiller, animator->X, animator->Y);

gLauncher->Graphics->DrawImage(imBattery[(int)gLauncher->PowerManager->GetBatteryLevel()], imFiller->Width - imBattery[0]->Width - 5, animator->Y + 5);

char timeFmt[64];

time_t _time = time(0);

tm* _localTime = localtime(&_time);

strftime((char*)&timeFmt,

sizeof(timeFmt), "%R", _localTime);

gLauncher->Graphics->DrawString(gLauncher->Font, (char*)&timeFmt, 0, 0);

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

Обратите внимание на удобство примененного подхода Immediate GUI. Нам понадобился новый элемент интерфейса, который описывает кнопку номеронабирателя? Мы просто реализовываем ещё один метод, который берет за основу стандартную кнопку и дорисовывает к ней текст. Всё крайне просто и понятно, хотя на данный момент слишком захардкожено. :)

❯ Звоним!


Пришло время совершить первый звонок с нашей по настоящему кастомной прошивки. Набираем номерок и…

Сам себе Linux смартфон: Как я выкинул Android и написал свою прошивку с нуля Гаджеты, Смартфон, Телефон, Покупка, Китайцы, Fly, Моддинг, Программирование, 2D, Своими руками, Одноплатный компьютер, Raspberry pi, Orange pi, Инженерия, Электроника, Android, Linux, Unix, iPhone, Мобильные телефоны, Видео, Без звука, YouTube, Длиннопост



Да, всё работает и мы без проблем можем дозвониться :)

❯ Заключение


Конечно же, это далеко не весь функционал, необходимый любому современному смартфону. Здесь много чего еще нужно реализовать хотя бы для соответствия уровню бюджетных кнопочных телефонов: телефонную книгу, поддержку СМС/ММС, мультимедийный функционал с играми. Однако начало уже положено и самая необходимая часть модулей реализована. Этот проект очень занимательный для меня и я горд, что смог не на словах, а на деле показать вам, моим читателям, возможности моддинга совершенно NoName-устройств, без каких либо опознавательных знаков…

Моя задача заключается в том, чтобы показать вам возможности использования старых телефонов не только в потребительских, но и в гиковских DIY-сферах. Судите сами: огромный классный дисплей, емкостной тачскрин, готовый звук, камера — и всё это за каких-то пару сотен рублей. Главное показать людям, как всю эту мощь использовать в своих целях и делать совершенно новые устройства из существующих, а не выбрасывать их на помойку!
Сейчас смартфоны, подобные Fly из этого поста стоят копейки, а портировать на них прошивку можно без каких-либо трудностей. Я очень надеюсь, что после этого поста читатели попытаются сделать что-то своё из старых смартфонов, благо свои наработки я выкладываю на GitHub!

Показать полностью 23 2
[моё] Гаджеты Смартфон Телефон Покупка Китайцы Fly Моддинг Программирование 2D Своими руками Одноплатный компьютер Raspberry pi Orange pi Инженерия Электроника Android Linux Unix iPhone Мобильные телефоны Видео Без звука YouTube Длиннопост
442
938
monobogdan
monobogdan
1 год назад
TECHNO BROTHER

Исходники закрыты, но мы не сдадимся: Пишем полностью нативное GUI-приложение под No-Name смартфон без Android⁠⁠

Исходники закрыты, но мы не сдадимся: Пишем полностью нативное GUI-приложение под No-Name смартфон без Android Гаджеты, Смартфон, Linux, Телефон, IT, Хакеры, Hacking, Программирование, Embedded, C++, Одноплатный компьютер, Nix, Unix, Ядро, Kernel, Android, Длиннопост



Для многих разработчиков приложений далеко не секрет, что экосистема Android не предполагает написание полностью нативных приложений: в этой платформе очень многое завязано на Java и без ART можно запустить только простые службы без какого-либо интерфейса. Однако, есть один способ писать практически под «голый» Linux, не перекомпилируя ядро и при этом пользоваться самыми интересными фишками устройства без оверхеда в виде тяжелого Android: ускорение 3D-графики (OpenGLES), микшер звука, ввод с различных устройств, OTG, Wi-Fi и если очень постараться — даже 3G. Это открывает множество разных интересных применений старым устройствам: «железо» смартфонов зачастую гораздо мощнее современных недорогих одноплатников. Сегодня я покажу вам, как написать и запустить программу, которая полностью написанное на C без Android, на No-Name Android-смартфоне практически без модификаций. Интересно? Жду вас в статье!

❯ Что нам нужно знать?


Даже относительно старые устройства флагманского сегмента обладают весьма неплохими характеристиками. Зачастую они гораздо мощнее современных дешевых одноплатников и могут выполнять самые разные задачи: эмуляция консолей, работа в качестве плееров, да даже просто сделать настольные часики самому было бы здорово. Но есть одно но — это Android. Платформа от Google может тормозить даже на достаточно мощном железе, что резко ограничивает потенциально возможные применения подобных гаджетов. Да и многие программисты не особо хотят заморачиваться и учить API Android для реализации каких-то своих проектов.

Исходники закрыты, но мы не сдадимся: Пишем полностью нативное GUI-приложение под No-Name смартфон без Android Гаджеты, Смартфон, Linux, Телефон, IT, Хакеры, Hacking, Программирование, Embedded, C++, Одноплатный компьютер, Nix, Unix, Ядро, Kernel, Android, Длиннопост


Но конечно же, есть один способ писать нативные программы, при этом используя все ресурсы смартфона/планшета. Для этого нужно понимание, как работает процесс загрузки на многих Android-гаджетах:

  1. Первичный загрузчик (BootROM) инициализирует какую-то часть периферии и загружает вторичный загрузчик (U-boot/LK).

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

  3. После загрузки ядра Linux и подключения ramdisk начинается выполнение процессов системы.


Как раз в третьем пункте и лежит ключ к способу, который будем использовать мы. Дело в том, что в смартфоне обычно есть несколько boot-разделов и у каждого свой образ ядра Linux со своим ramdisk. Первый из них — это знакомый моддерамboot.img, который отвечает за загрузку системы и инициализирует железо/монтирует разделы/подготавливает окружение к работе (.rc файлы) и запускает главный процесс Android —zygote. При этом используется собственная реализация init от Android.

Исходники закрыты, но мы не сдадимся: Пишем полностью нативное GUI-приложение под No-Name смартфон без Android Гаджеты, Смартфон, Linux, Телефон, IT, Хакеры, Hacking, Программирование, Embedded, C++, Одноплатный компьютер, Nix, Unix, Ядро, Kernel, Android, Длиннопост


Второй, не менее знакомый многим раздел —recovery, отвечает за так называемый режим восстановления, в котором мы можем сбросить данные до заводских настроек/очистить кэши или прошить кастомную прошивку. Вероятно, многие из вас замечали, насколько быстро ваш девайс загружает этот режим, гораздо быстрее, чем загрузка обычного Android. И именно в его реализацию нам нужнозаглянуть(я намеренно выбрал бранч версии 2.3 — т.е Gingerbread для простоты):

Исходники закрыты, но мы не сдадимся: Пишем полностью нативное GUI-приложение под No-Name смартфон без Android Гаджеты, Смартфон, Linux, Телефон, IT, Хакеры, Hacking, Программирование, Embedded, C++, Одноплатный компьютер, Nix, Unix, Ядро, Kernel, Android, Длиннопост


А recovery оказывается самой обычной нативной программой, написанной на C со своим небольшим фреймворком для работы с графикой и вводом. В процессе загрузки режима recovery, скрипт запускает одноименную программу в /sbin/, благодаря которому мы видим простую и понятную менюшку. Так почему бы не использовать этот раздел в своих целях и не написать какую-нибудь нативную программу самому?

Как я уже говорил выше, в этом режиме доступны многие аппаратные возможности вашего смартфона, за исключением модема. Используя полученную информацию, предлагаю написать наше небольшое приложение под Android-смартфон без Android сами!

❯ Подготавливаем окружение


В первую очередь, хотелось бы отметить, что программы под «голый» смартфон можно писать не только на C/C++. Нам доступен как минимум FPC, который довольно давно умеет компилировать голые бинарники под Android. Кроме того, мы можем портировать маленькие embedded-версии интерпретаторов таких языков, как lua, micropython и duktape (JS).

Однако в случае нативных программ, есть два важных правила, которые необходимо понимать. Во-первых, в Android используется собственную реализацию стандартной библиотеки libc — bionic, в то время как на десктопных дистрибутивах используется glibc. Между собой они не совместимы — именно поэтому вы не можете просто взять и запустить консольную программу для Raspberry Pi, например.

Исходники закрыты, но мы не сдадимся: Пишем полностью нативное GUI-приложение под No-Name смартфон без Android Гаджеты, Смартфон, Linux, Телефон, IT, Хакеры, Hacking, Программирование, Embedded, C++, Одноплатный компьютер, Nix, Unix, Ядро, Kernel, Android, Длиннопост


А второе правило заключается в том, что начиная с версии 4.1, Androidтребует, чтобы все нативные программы были скомпилированы в режиме -fPIE — т. е. выходной код должен не зависеть от адреса загрузки программы в виртуальную память. Для этого достаточно добавить ключ -fPIE, однако учтите, что если вы разрабатываете программу под Android 4.0 и ниже, то fPIE наоборот необходимо убрать — старые версии Androidнеподдерживают такой способ генерации кода и будут вылетать с Segmentation fault.

Для разработки нам понадобится ndk — там есть все необходимые заголовочники и компиляторы для нашей работы. Я используюndk r9c, поскольку в свежих версиях Google регулярно может что-то сломать.
ndk-build, к сожалению, здесь работать не будет, поэтому Makefile придется написать самому. Я составил полностью рабочий Makefile, который без проблем скомпилирует валидную программу, вам остаётся лишь поменять NDK_DIR.

NDK_DIR = D:/android-ndk-r11c/

TOOLCHAIN_DIR = $(NDK_DIR)toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64/bin/

GCC = $(TOOLCHAIN_DIR)arm-linux-androideabi-g++

PLAT_DIR = $(NDK_DIR)platforms/android-17/arch-arm/usr/

LINK_LIBS = -l:libEGL.so -l:libGLESv1_CM.so

OUTPUT_NAME = cmdprog

build:

$(GCC) -I $(PLAT_DIR)include/ -L $(PLAT_DIR)lib/ -fPIE -Wl,-dynamic-linker=/sbin/linker $(LINK_LIBS) -static -o $(OUTPUT_NAME) main.cpp micro2d.cpp


После этого пишем простенькую программу, которая должна вывести «Test» и компилируем её.

❯ Деплоим на устройство


Несмотря на то, что грузиться мы будем в режим recovery, нам всё равно будет доступен adb, через который мы сможем запускать и отлаживать нашу программу. Это очень удобно, однако по умолчанию adb включен только в TWRP, который нужно сначала найти или портировать под ваш девайс (на большинство старых брендовых устройств порты есть, на нонейм придется портировать самому — гайды есть в интернете). Под ваше устройство есть TWRP? Отлично, распаковываете recovery.img с помощью так называемой «кухни» (MTKImgTools как вариант):

Исходники закрыты, но мы не сдадимся: Пишем полностью нативное GUI-приложение под No-Name смартфон без Android Гаджеты, Смартфон, Linux, Телефон, IT, Хакеры, Hacking, Программирование, Embedded, C++, Одноплатный компьютер, Nix, Unix, Ядро, Kernel, Android, Длиннопост


Открываете init.recovery.service.rc и убираете оттуда запуск одноименной службы (можно просто оставить файл пустым).

Исходники закрыты, но мы не сдадимся: Пишем полностью нативное GUI-приложение под No-Name смартфон без Android Гаджеты, Смартфон, Linux, Телефон, IT, Хакеры, Hacking, Программирование, Embedded, C++, Одноплатный компьютер, Nix, Unix, Ядро, Kernel, Android, Длиннопост


Запаковываем образ обратно тем же MTKImgTools и прошиваем флэшером для вашего устройства — в моём случае, это SP Flash Tool (MediaTek):

Исходники закрыты, но мы не сдадимся: Пишем полностью нативное GUI-приложение под No-Name смартфон без Android Гаджеты, Смартфон, Linux, Телефон, IT, Хакеры, Hacking, Программирование, Embedded, C++, Одноплатный компьютер, Nix, Unix, Ядро, Kernel, Android, Длиннопост


Заходим в режим рекавери и видим зависшую заставку устройства и звук подключения устройства к ПК. Если у вас установлены драйвера, то вы сможете без проблем зайти в adb shell и попасть в терминал для управления устройством. Теперь можно закинуть программу — прямо в корень рамдиска (записывается программа в ОЗУ, но при переполнении, телефон уйдет в ребут — осторожнее с этим). Пишем:

adb push cmdprog /: adb shell chmod 777 cmdprog ./cmdprog


И видим результат. Наша программа запускается и работает!

Исходники закрыты, но мы не сдадимся: Пишем полностью нативное GUI-приложение под No-Name смартфон без Android Гаджеты, Смартфон, Linux, Телефон, IT, Хакеры, Hacking, Программирование, Embedded, C++, Одноплатный компьютер, Nix, Unix, Ядро, Kernel, Android, Длиннопост


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

❯ Выводим графику


Для вывода графики без оконных систем, мы будем использовать API фреймбуфера Linux, которое позволяет нам получить прямой доступ к массиву пикселей на экране. Однако учтите, что этот способ полностью программный и может оказаться тормозным для вашего приложения: скорость работы прямо-пропорциональна разрешению дисплея вашего устройства. Чем выше разрешение, тем ниже филлрейт. В моём случае, матрица была с разрешением 960x540, 32млн цветов, IPS — очень недурно, согласны?

Фреймбуфер Linux может работать с самыми разными форматами пикселя, имейте это ввиду. На некоторых устройствах может быть 16-битный формат (262 тысячи цветов, RGB565), на моём же оказался 32х-битный с выравниванием по строкам (имейте это также ввиду). 32х битный формат. Работать с ним легко: открываем устройство /dev/graphics/fb0, получаем параметры (разрешение, формат пикселя), делаем mmap для отображения буфера с пикселями на экране в память нашего процесса и выделяем второй буфер для двойной буферизации дабы избежать неприятных мерцаний.

void m2dAllocFrameBuffer()

{

fbDev = open(PRIMARY_FB, O_RDWR);

fb_var_screeninfo vInfo; fb_fix_screeninfo fInfo;

ioctl(fbDev, FBIOGET_VSCREENINFO, &vInfo);

ioctl(fbDev, FBIOGET_FSCREENINFO, &fInfo); fbDesc.width = vInfo.xres;

fbDesc.height = vInfo.yres;

fbDesc.pixels = (unsigned char*)mmap(0, fInfo.smem_len, PROT_WRITE, MAP_SHARED, fbDev, 0); f

bDesc.length = fInfo.smem_len; fbDesc.lineLength = fInfo.line_length;

backBuffer = (unsigned char*)malloc(fInfo.smem_len); memset(backBuffer, 128, fInfo.smem_len);

printf("Framebuffer is %s %ix%ix%i\n", (char*)&fInfo.id, fbDesc.width, fbDesc.height, vInfo.bits_per_pixel, fInfo.type);

}


Если не сделать предыдущий шаг и запускать нашу программу параллельно с recovery, то они обе будут пытаться друг друга «перекрыть» — эдакий race condition:

Исходники закрыты, но мы не сдадимся: Пишем полностью нативное GUI-приложение под No-Name смартфон без Android Гаджеты, Смартфон, Linux, Телефон, IT, Хакеры, Hacking, Программирование, Embedded, C++, Одноплатный компьютер, Nix, Unix, Ядро, Kernel, Android, Длиннопост


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

__inline void pixelAt(int x, int y, byte r, byte g, byte b, float alpha)

{

if(x < 0 || y < 0 || x >= fbDesc.width || y >= fbDesc.height) return;

unsigned char* absPtr = &backBuffer[(y * fbDesc.lineLength) + (x * 4)];

if(alpha >= 0.99f)

{

absPtr[0] = b;

absPtr[1] = g;

absPtr[2] = r;

}

else {

absPtr[0] = (byte)(b * alpha + absPtr[0] * (1.0f - alpha));

absPtr[1] = (byte)(g * alpha + absPtr[1] * (1.0f - alpha));

absPtr[2] = (byte)(r * alpha + absPtr[2] * (1.0f - alpha));

} absPtr[3] = 255; }

for(int i = 0; i < image->height; i++)

{

for(int j = 0; j < image->width; j++)

{

byte* ptr = &image->pixels[((image->height - i) * image->width + j) * 3]; pixelAt(x + j, y + i, ptr[0], ptr[1], ptr[2], alpha);

}

}


И загрузчик TGA:

CImage* m2dLoadImage(char* fileName) {

FILE* f = fopen(fileName, "r");

printf("m2dLoadImage: Loading %s\n", fileName);

if(!f)

{

printf("m2dLoadImage: Failed to load %s\n", fileName);

return 0;

}

CTgaHeader hdr;

fread(&hdr, sizeof(hdr), 1, f);

if(hdr.paletteType)

{

printf("m2dLoadImage: Palette images are unsupported\n");

return 0;

}

if(hdr.bpp != 24) {

printf("m2dLoadImage: Unsupported BPP\n");

return 0;

}

byte* buf = (byte*)malloc(hdr.width * hdr.height * (hdr.bpp / 8));

assert(buf);

fread(buf, hdr.width * hdr.height * (hdr.bpp / 8), 1, f);

fclose(f);

CImage* ret = (CImage*)malloc(sizeof(CImage));

ret->width = hdr.width;

ret->height = hdr.height;

ret->pixels = buf;

printf("m2dLoadImage: Loaded %s %ix%i\n", fileName, ret->width, ret->height);

return ret;

}


И попробуем вывести картинку:

m2dInit();

test = m2dLoadImage("test.tga");

test2 = m2dLoadImage("habr.tga");

while(1)

{

m2dClear();

m2dDrawImage(test, 0, 0, 1.0f);

m2dDrawImage(test2, tsX - (test2->width / 2), tsY - (test2->height / 2), 0.5f);

m2dFlush();

}

Исходники закрыты, но мы не сдадимся: Пишем полностью нативное GUI-приложение под No-Name смартфон без Android Гаджеты, Смартфон, Linux, Телефон, IT, Хакеры, Hacking, Программирование, Embedded, C++, Одноплатный компьютер, Nix, Unix, Ядро, Kernel, Android, Длиннопост



Не забываем про порядок пикселей в TGA (BGR, вместо RGB), меняем канали b и r местами в pixelAt и наслаждаемся картинкой на большом и классном IPS-дисплее:

Исходники закрыты, но мы не сдадимся: Пишем полностью нативное GUI-приложение под No-Name смартфон без Android Гаджеты, Смартфон, Linux, Телефон, IT, Хакеры, Hacking, Программирование, Embedded, C++, Одноплатный компьютер, Nix, Unix, Ядро, Kernel, Android, Длиннопост
Исходники закрыты, но мы не сдадимся: Пишем полностью нативное GUI-приложение под No-Name смартфон без Android Гаджеты, Смартфон, Linux, Телефон, IT, Хакеры, Hacking, Программирование, Embedded, C++, Одноплатный компьютер, Nix, Unix, Ядро, Kernel, Android, Длиннопост


Производительность отрисовки не очень высокая, однако если оптимизировать код (копировать непрозрачные картинки сразу сканлайнами и убрать проверки в инлайнах), то будет немного шустрее. Google для подобных целей сделали собственный простенький софтрендер —libpixelflinger.

Есть вариант для быстрой и динамичной графики: использовать GLES, который без проблем доступен и из recovery. Однако, насколько мне известно (в исходники драйверов посмотреть не могу), указать фреймбуфер в качестве окна не получится, поэтому в качестве Surface для рендертаргета у нас будет служить Pixmap (так называемый off-screen rendering), которому нужно задать правильный формат пикселя (см. документацию EGL). Рисуем туда картинку с аппаратным ускорением и затем просто копируем в фреймбуфер с помощью memcpy.

❯ Обработка нажатий


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

Каждое устройство, которое может передавать данные о нажатиях, находится в папке /dev/input/ и имеет имя вида event. Как узнать нужный нам event? Нам нужен mtk-tpd — реализация драйвера тачскрина от MediaTek (у вашего чипсета может быть по своему), для этого загружаемся в Android и пишем getevent. Он покажет доступные в системе устройства ввода — в моём случае, это event2:

Исходники закрыты, но мы не сдадимся: Пишем полностью нативное GUI-приложение под No-Name смартфон без Android Гаджеты, Смартфон, Linux, Телефон, IT, Хакеры, Hacking, Программирование, Embedded, C++, Одноплатный компьютер, Nix, Unix, Ядро, Kernel, Android, Длиннопост


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

// Open input device evDev = open(INPUT_EVENT_TPD, O_RDWR | O_NONBLOCK);


После этого, читаем события с помощью read и обрабатываем их. На устройствах с резистивным тачскрином, передается просто ABS_POSITION_X, на устройствах с поддержкой нескольких касаний — используетсяпротокол MT. Когда пользователь нажал на экран, посылается нажатие BTN_TOUCH с значением 1, а когда отпускает — соответственно BTN_TOUCH с значением 0. Разные драйверы тачскрина используют разные координатные системы (насколько я понял), в случае MediaTek — это абсолютные координаты на дисплее (вплоть до ширины и высоты). На данный момент, я реализовал поддержку только одного касания, но при желании можно добавить трекинг нескольких нажатий:

void m2dUpdateInput()

{

input_event ev;

int ret = 0;

while((ret = read(evDev, &ev, sizeof(input_event)) != -1))

{

if(ev.code == ABS_MT_POSITION_X) tsState.x = ev.value;

if(ev.code == ABS_MT_POSITION_Y) tsState.y = ev.value;

if(ev.code == BTN_TOUCH) tsState.isPressed = ev.value == 1;

}

tsState.cb(tsState.isPressed, tsState.x, tsState.y); }


Теперь мы можем «возить» логотип Хабра по всему экрану:

void onTouchUpdate(bool isTouching, int x, int y) {

if(isTouching)

{

tsX = x;

tsY = y;

}

}

int main(int argc, char** argv) {

printf("Test\n");

m2dInit();

test = m2dLoadImage("test.tga");

test2 = m2dLoadImage("habr.tga");

printf("Volume: %i %i\n", vol, muteState);

m2dAttachTouchCallback(&onTouchUpdate);

while(1) {

m2dUpdateInput();

m2dClear();

m2dDrawImage(test, 0, 0, 1.0f);

m2dDrawImage(test2, tsX - (test2->width / 2), tsY - (test2->height / 2), 0.5f);

m2dFlush();

}

return 0;

}

Исходники закрыты, но мы не сдадимся: Пишем полностью нативное GUI-приложение под No-Name смартфон без Android Гаджеты, Смартфон, Linux, Телефон, IT, Хакеры, Hacking, Программирование, Embedded, C++, Одноплатный компьютер, Nix, Unix, Ядро, Kernel, Android, Длиннопост



В целом, это уже можно назвать минимально-необходимым минимумом для взаимодействия с устройством и использованию всех его возможностей на максимум без Android. Более того, такой метод заработает почти на любом устройстве, в том числе и китайских NoName, где ни о каких исходниках ядра и речи нет. Теперь вы можете попытаться использовать ваше старое Android-устройство для чего-нибудь полезного без необходимости изучать API Android.

❯ Звук, модем и другие возможности


Для звука нам придётся использовать ALSA — поскольку эта подсистема звука сейчас используется в большинстве устройств на Linux. Судя по всему, тут есть режим эмуляции старого и удобного OSS, поскольку устройства /dev/snd/dsp присутствует. Однако, вывод в него какого либо PCM-потока не даёт ничего, поэтому нам пригодится ALSA-lib.

Другой вопрос касается модема и сети. И если Wi-Fi ещё можно поднять (wpa_supplicant можно взять из раздела /system/), то с модемом будут проблемы — нет единого протокола по общению с ним и кое-где, чтобы его заставить работать, нужно будет немного попотеть. Не стесняйтесь изучать исходники ядра (MediaTek охотно делится реализацией вообще всего — там и RIL, и драйвер общения с модемом) и смотреть интересующие вас фишки!

❯ Заключение


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

Не стесняйтесь лезть и изучать вендорские исходники — это даёт понимание, как работают устройства изнутри. Собственно, благодаря такому ежедневному копанию исходников системы и появилась данная статья! :)

Показать полностью 14
[моё] Гаджеты Смартфон Linux Телефон IT Хакеры Hacking Программирование Embedded C++ Одноплатный компьютер Nix Unix Ядро Kernel Android Длиннопост
138
777
monobogdan
monobogdan
1 год назад
TECHNO BROTHER

Nokia N9 — уникальный Linux-смартфон, опередивший своё время на много лет вперед⁠⁠

Nokia N9 — уникальный Linux-смартфон, опередивший своё время на много лет вперед Гаджеты, Смартфон, Разработка, Linux, Android, Nokia, Meego, Nix, Unix, Мобильные телефоны, Операционная система, Железо, Microsoft, Windows Phone, Nokia Lumia, Видео, Вертикальное видео, Длиннопост



Многие из нас помнят компанию Nokia, как одного из лидеров мобильного рынка и производителя самых разных, необычных устройств, которые опережали свое время на много лет вперед! К сожалению, нынешняя Nokia — это уже совсем не та компания, которую мы любили и которой отдавали предпочтение при выборе мобильного девайса. Однако ещё во времена перехода под крыло Microsoft, практически под самый закат, финны сделали шедевральное устройство на десктопном Linux, которое до сих пор находит отголоски в современном мире смартфонов. И имя этому шедевру — Nokia N9! Недавно мне написал почётный хабровчанинdlinyjи предложил подарить этого красавца мне: причём с полным комплектом! Почему он оказался прорывным и что общего имеет с Lumia 800? Читайте подробнее в статье!

❯ Что за гаджет?


Когда-то у Nokia было две основных платформы, на базе которых они выпускали свои портативные гаджеты: S40, на которой работали функциональные Java-телефоны, сейчас их называют «фичефонами», и S60 — версия Symbian, на которой работало большинство смартфонов этой компании. Финская корпорация смогла занять серьезный процент практически в каждом сегменте рынка: бюджетники (1110, 1202 «фонарик», 2700c), средний класс (5310 XpressMusic, 5230/5228, 6300), флагманы (N95, N91, N72/N73) и, конечно же, бизнес-сегмент (8800 Arte/Luna, E90, в каком-то смысле Vertu).


Однако помимо выпуска девайсов на стандартных платформах была у Nokia и команда разработчиков, отвечавшая за гиковские устройства, которые были предназначены исключительно для энтузиастов. Началось всё с выпуска одного из первых устройств в классе «интернет-планшетов», имя которому было Nokia 770 Internet Tablet. Устройство, вышедшее за 5 лет до появления iPad, предоставляло обычному пользователю почти все возможности портативного компьютера тех лет: серфинг интернета через Wi-Fi, прослушивания музыки и просмотр видео с флэшек RS-MMC, а также работа с документами.

Nokia N9 — уникальный Linux-смартфон, опередивший своё время на много лет вперед Гаджеты, Смартфон, Разработка, Linux, Android, Nokia, Meego, Nix, Unix, Мобильные телефоны, Операционная система, Железо, Microsoft, Windows Phone, Nokia Lumia, Видео, Вертикальное видео, Длиннопост



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

Nokia N9 — уникальный Linux-смартфон, опередивший своё время на много лет вперед Гаджеты, Смартфон, Разработка, Linux, Android, Nokia, Meego, Nix, Unix, Мобильные телефоны, Операционная система, Железо, Microsoft, Windows Phone, Nokia Lumia, Видео, Вертикальное видео, Длиннопост



В то время это было как глоток свежего воздуха. Конечно же, уже существовали КПК на базе Windows Mobile, где пользователи вовсю кастомизировали прошивки: подменяли драйвера из устройства в устройство, делали патчи и твики реестра/ядра, русифицировали и подменяли встроенные программы. Однако WinMobile оставалась проприетарной операционной системой, где хоть и был доступ к исходному коду ядра для любого желающего (Platform Builder), без BSP (Board Support Package — порт системы на определенную материнскую плату) в этом практически не было смысла. Другое дело — пользователи планшетов от Nokia: там была полная свобода во всем!

Nokia N9 — уникальный Linux-смартфон, опередивший своё время на много лет вперед Гаджеты, Смартфон, Разработка, Linux, Android, Nokia, Meego, Nix, Unix, Мобильные телефоны, Операционная система, Железо, Microsoft, Windows Phone, Nokia Lumia, Видео, Вертикальное видео, Длиннопост



Отдельной особенностью Maemo оставалось то, что даже пользовательский интерфейс строился по принципам обычного ПК и на базе тех же библиотек. В качестве официальной библиотеки интерфейса, Nokia предлагала GTK с набором виджетов для построения общего Look&Feel системы, но никто не мешал использовать Qt, или, например, wxWidgets.

И вот так, из года в год, выходили всё новые и новые устройств на базе Maemo. После 770 был успешный N800, а позднее в том же году появился и N810 с QWERTY-клавиатурой. В репозиториях появлялось всё больше и больше софта и, хотя едва ли обычный пацаненок с района мог увидеть у кого-то в руках такое устройство, именно они, в паре с КПК, стали прообразами современных смартфонов. Но был ещё один важный нюанс: ни один из интернет-планшетов от Nokia не имел радиомодуля. Выходить в интернет предлагалось с помощью Wi-Fi или через Bluetooth. Таким образом, эти девайсы нельзя было назвать полноценными коммуникаторами и смартфонами…

Nokia N9 — уникальный Linux-смартфон, опередивший своё время на много лет вперед Гаджеты, Смартфон, Разработка, Linux, Android, Nokia, Meego, Nix, Unix, Мобильные телефоны, Операционная система, Железо, Microsoft, Windows Phone, Nokia Lumia, Видео, Вертикальное видео, Длиннопост



До 2009 года. Ведь именно в этом году Nokia представляет коммуникатор N900 с QWERTY-клавиатурой, который снабдили радиомодулем, благодаря которому он оказался способен как звонить, так и выходить в интернет через 3G. Кроме того, у N900 были все характеристики современного смартфона: достаточно мощный ARM-чипсет TI OMAP с частотой 600мгц, способный запустить Linux; 256 мегабайт оперативной памяти (топовые коммуникаторы имели 128мб); GPU PowerVR SGX530 (что вообще было редкостью в мобильниках тех лет и только Qualcomm встраивали Adreno вообще во все свои чипы); магазин приложений и, конечно же, тачскрин, пусть и резистивный! Подробнее про N900 читайте в моей соответствующей статье.


В 2010-2011 годах Android уже начал идти победоносной поступью, будучи предустановленным на самые разные гаджеты: от телефонов и планшетов до тв-боксов и электронных книг. iPhone уже успел полностью согнуть свою линию и доказать, что за гаджетами с емкостными тачскринами и мощным железом будущее. Symbian уже было тяжело конкурировать с мастодонтами рынка: не помогал даже Qt, а о нативном API системы говорить вообще не стоит (оно неплохое, но своеобразное), нужно было думать, куда двигаться дальше. Сделать свой Android смартфон? Продолжать работу над Maemo? Microsoft уже начали потихоньку потирать руки и пытаться прибрать мобильное подразделение Nokia к себе: сначала поставили в кресло CEO Стивена Элопа, а затем сменили курс компании с Symbian/Maemo на Windows Phone.

Nokia N9 — уникальный Linux-смартфон, опередивший своё время на много лет вперед Гаджеты, Смартфон, Разработка, Linux, Android, Nokia, Meego, Nix, Unix, Мобильные телефоны, Операционная система, Железо, Microsoft, Windows Phone, Nokia Lumia, Видео, Вертикальное видео, Длиннопост



Symbian развивали и поддерживали до последнего, до 2012 года, когда Nokia совсем сдалась и прекратила выпускать серьезные апдейты, коим стал Symbian Bella. Nokia уже успела выпустить первые смартфоны линейки Lumia на базе Windows Phone и пыталась удержаться на плаву. Но у компании припасен ещё один козырь за пазухой. О котором знали в Microsoft, который действительно имел все шансы перевернуть мобильный рынок с ног на голову, и который развивали вместе с Intel. И имя ему — MeeGo!

Nokia N9 — уникальный Linux-смартфон, опередивший своё время на много лет вперед Гаджеты, Смартфон, Разработка, Linux, Android, Nokia, Meego, Nix, Unix, Мобильные телефоны, Операционная система, Железо, Microsoft, Windows Phone, Nokia Lumia, Видео, Вертикальное видео, Длиннопост



Nokia действительно могла перевернуть мобильный мир, если бы ей не мешала Microsoft. И не нужны были бы ей смартфоны на Android, когда у них самих была такая классная система. И ведь кто-то подумает «ну было и было», ан-нет, отголоски MeeGo раздаются и сейчас. Часть инженеров Nokia ушли развивать MeeGo в виде отдельной компании Jolla с смартфонами на базе Sailfish OS — дальнейшее развитие перспективной системы от Nokia. И как бы необычно это не звучало, сейчас Sailfish развивают в… России! Ростелеком выкупил контрольный пакет акций Jolla, что позволило реализовать свой форк под знакомым многим из вас названием Aurora OS! Я даже рискнул оставить заявку на закрытое бета-тестирование, авось и я смогу подержать в руках устройство на Авроре и даже что-то запилить на него, например, 3D-игрушку! :)

Nokia N9 — уникальный Linux-смартфон, опередивший своё время на много лет вперед Гаджеты, Смартфон, Разработка, Linux, Android, Nokia, Meego, Nix, Unix, Мобильные телефоны, Операционная система, Железо, Microsoft, Windows Phone, Nokia Lumia, Видео, Вертикальное видео, Длиннопост



Nokia N9 стал первым и последним гаджетом на базе MeeGo, на который будет крайне интересно взглянуть и… понять, что мы пришли ко всему тому, что Nokia реализовала много лет назад! N9 мне подарил мой читатель, наставник авторского дела и просто крутой мужик Сергей "@dlinyj" Долин! Этот человек сыграл довольно большую роль в становлении меня, как автора: давал советы касательно фотографий, стилистики текста, кое-где поправлял меня. И в один день он скинул фотографию N9 в родной коробочке со словами «хочешь же?))», заранее зная мой ответ! Сергей и сам успел поработать над Авророй, поэтому наличие у него N9 не вызывает вопросов.
Этот материал я решил подготовить на круглую и праздничную для меня дату — день рождения моего блога! Ровно год назад, 16 июля 2022 года, я написал свою первую статью — обзор на Samsung X450. :)

❯ Распаковываем...


Поставлялся девайс в большой коробочке, фирменного синего цвета и с гравировкой логотипа, как и свойственно всем флагманам Nokia. В N900 на коробке гравировали даже кнопки QWERTY-клавиатуры на силуэте устройства — даже над дизайном такой мелочи поработали знатно. Нас сразу встречает заветная надпись: Nokia N Series!

Nokia N9 — уникальный Linux-смартфон, опередивший своё время на много лет вперед Гаджеты, Смартфон, Разработка, Linux, Android, Nokia, Meego, Nix, Unix, Мобильные телефоны, Операционная система, Железо, Microsoft, Windows Phone, Nokia Lumia, Видео, Вертикальное видео, Длиннопост



Открываем коробочку и видим там комплект из: смартфона, буклетов, наушников и ЗУ. Всё весьма компактно и в чем то даже напоминает стиль iPhone.

Nokia N9 — уникальный Linux-смартфон, опередивший своё время на много лет вперед Гаджеты, Смартфон, Разработка, Linux, Android, Nokia, Meego, Nix, Unix, Мобильные телефоны, Операционная система, Железо, Microsoft, Windows Phone, Nokia Lumia, Видео, Вертикальное видео, Длиннопост



Основные интерфейсные разъемы устройства расположены сверху: там и слот под SIM, и разъем для ЗУ, причем на магнитах (!).

Что самое интересное — у N9 был параллельный «собрат» на Windows Phone в виде Lumia 800. Несмотря на то, что работают они на совершенно разных чипсетах и имеет немного отличающийся тачскрин, у этих девайсов очень похожий дизайн корпуса, конструкция, полностью совместимые дисплеи с немного разной диагональю, у них даже есть некоторые сходства в разводке материнской платы.

Характеристики нашего устройства такие:

  • Чипсет: TI OMAP 3630, одно ядро Cortex A8 на частоте 1ггц.

  • GPU: PowerVR SGX530. Весьма неплохое видеоядро по тем годам, немного более мощное использовалось, например, в первом iPad. Есть поддержка OpenGL ES 2.0.

  • ОЗУ: 1гб. Очень серьёзный объем по тем временам, некоторые флагманы комплектовались лишь 512мб ОЗУ, что было стандартом индустрии в 2012-2013 годах.

  • ПЗУ: 16 или 64гб. По тем временам, очень серьезный объем памяти.

  • Камера: 8мп фотокамера с оптикой от Carl Zeiss. Данная оптика стала стандартом и визитной карточкой многих камерафонов от Nokia. Помимо съемки фото, смартфон способен записывать видео в 720p при 30 кадрах в секунду.

  • Дисплей: 3.9" AMOLED матрица 854x480.

Nokia N9 — уникальный Linux-смартфон, опередивший своё время на много лет вперед Гаджеты, Смартфон, Разработка, Linux, Android, Nokia, Meego, Nix, Unix, Мобильные телефоны, Операционная система, Железо, Microsoft, Windows Phone, Nokia Lumia, Видео, Вертикальное видео, Длиннопост



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

❯ Патчим в программном плане


Поскольку MeeGo — это по сути, полноценный десктопный Linux, адаптированный под мобильные платформы, он точно также, как и Maemo, использует менеджер пакетов dpkg. Все приложения для этих систем распространяются в виде знакомым большинству линуксоидов пакетов .deb.

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

Nokia N9 — уникальный Linux-смартфон, опередивший своё время на много лет вперед Гаджеты, Смартфон, Разработка, Linux, Android, Nokia, Meego, Nix, Unix, Мобильные телефоны, Операционная система, Железо, Microsoft, Windows Phone, Nokia Lumia, Видео, Вертикальное видео, Длиннопост


Установить файловый менеджер можно скачав соответствующий .deb и скинув его через Bluetooth. Я выбрал FileBox. Затем его можно установить в списке переданных файлов обычным тапом. Обратите внимание, что пакеты для MeeGo имеют подпись а-ля Symbian, поэтому если у вас не устанавливается ничего — проверьте дату и время.

Nokia N9 — уникальный Linux-смартфон, опередивший своё время на много лет вперед Гаджеты, Смартфон, Разработка, Linux, Android, Nokia, Meego, Nix, Unix, Мобильные телефоны, Операционная система, Железо, Microsoft, Windows Phone, Nokia Lumia, Видео, Вертикальное видео, Длиннопост


Некоторые программы можно установить только в терминале, вручную вызвав dpkg -i с необходимым пакетом .deb. Для активации режима разработчика, который добавляет возможность связи с ПК и эмулятор терминала, нам нужно сначала обновить зеркала репозиториев с пакетами, установивэтот .debи затем активировать девмод в настройках. Смартфон докачает и установит нужные пакеты, перезагрузится, и мы сможем свободно пользоваться терминалом.

Nokia N9 — уникальный Linux-смартфон, опередивший своё время на много лет вперед Гаджеты, Смартфон, Разработка, Linux, Android, Nokia, Meego, Nix, Unix, Мобильные телефоны, Операционная система, Железо, Microsoft, Windows Phone, Nokia Lumia, Видео, Вертикальное видео, Длиннопост


Теперь гаджет полностью работает и может оказаться весьма полезным. Так в чем же N9 оказалась шедевральна? Какие её концепции до сих пор заимствуют?

❯ Смотрим на MeeGo


В первую очередь, MeeGo ещё в 2011 году вводила концепцию полного управления системой жестами. Здесь вообще нет никаких кнопок «домой», «назад», «диспетчер приложений» — все это инженеры Nokia посчитали не нужным и реализовали всё взаимодействие благодаря простым и понятным свайпам. Обратите внимание, ничего не напоминает? Неужто кто-то с выходом десятки полностью позаимствовал фишку финского гиганта?



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

Nokia N9 — уникальный Linux-смартфон, опередивший своё время на много лет вперед Гаджеты, Смартфон, Разработка, Linux, Android, Nokia, Meego, Nix, Unix, Мобильные телефоны, Операционная система, Железо, Microsoft, Windows Phone, Nokia Lumia, Видео, Вертикальное видео, Длиннопост


UX системы вообще очень необычный. Он пытается сочетать все лучшее из iOS, WP и отчасти Android. Да, здесь есть шторка уведомлений, но выглядит она максимально минималистично и единственная настройка — громкость звука. Да, часть параметров приложений можно найти в настройках — прямо как в iOS. Да, здесь уже был относительно строгий полу-Flat стиль, немного напоминающий стиль iOS 7 (который вышел на 2 года позже MeeGo). Даже меню опций нет, лишь значки действий снизу — как и в N8 на Symbian.

Nokia N9 — уникальный Linux-смартфон, опередивший своё время на много лет вперед Гаджеты, Смартфон, Разработка, Linux, Android, Nokia, Meego, Nix, Unix, Мобильные телефоны, Операционная система, Железо, Microsoft, Windows Phone, Nokia Lumia, Видео, Вертикальное видео, Длиннопост


Кроме того, здесь довольно удобно реализован диспетчер задач. В Android он только-только появился в 3.0 Honeycomb, а в iOS он был реализован жутко неудобно. Однако, судя по всему, MeeGo не умеет сама закрывать или отправлять в сон приложения, как это делает Android и iOS — такова нативная линуксовая натура системы. Из-за этого, если открыть слишком много приложений, можно наблюдать небольшие лаги. Вообще, система действительно не сказать что работает уж очень плавно: яблочки тех лет работали гораздо шустрее и плавнее, однако по тем временам плавность системы достаточно приемлема.

Nokia N9 — уникальный Linux-смартфон, опередивший своё время на много лет вперед Гаджеты, Смартфон, Разработка, Linux, Android, Nokia, Meego, Nix, Unix, Мобильные телефоны, Операционная система, Железо, Microsoft, Windows Phone, Nokia Lumia, Видео, Вертикальное видео, Длиннопост


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

В системе есть браузер на базе WebKit — тот самый браузерный движок, что используется и в Safari на iOS, и долгое время использовался в стандартном браузере Android. Благодаря дисплею, страницы выглядят очень сочно, но только те, которые загрузятся :) И дело даже не в веб-стандартах, большинство страниц браузер сможет худо-бедно переварить. Однако встает проблема с сертификатами — браузер их не умеет игнорировать, если они просрочены, и вываливается в ошибку, отказываясь загружать сайт. Кроме того, браузер не поддерживает SSL 1.2, который использует большинство сайтов на данный момент.

Nokia N9 — уникальный Linux-смартфон, опередивший своё время на много лет вперед Гаджеты, Смартфон, Разработка, Linux, Android, Nokia, Meego, Nix, Unix, Мобильные телефоны, Операционная система, Железо, Microsoft, Windows Phone, Nokia Lumia, Видео, Вертикальное видео, Длиннопост


Зато в системе полностью функционирует почтовый клиент, причем довольно удобный. И здесь открывается еще одна фишка системы: один менеджер для всех аккаунтов на устройстве. Подобную концепцию имеет Android почти с самого начала, но в MeeGo она выделена в отдельное приложение. Не исключено, что в будущем туда хотели добавить и менеджер паролей — было бы весьма удобно!

Что же касается самого клиента почты, то его без проблем можно настроить на Яндекс почту, и на gmail — только не забываем включить SSL (по умолчанию отключен) и использовать одноразовые пароли — двухэтапную аутентификацию большинство старых гаджетов не поддерживает.

Nokia N9 — уникальный Linux-смартфон, опередивший своё время на много лет вперед Гаджеты, Смартфон, Разработка, Linux, Android, Nokia, Meego, Nix, Unix, Мобильные телефоны, Операционная система, Железо, Microsoft, Windows Phone, Nokia Lumia, Видео, Вертикальное видео, Длиннопост
Nokia N9 — уникальный Linux-смартфон, опередивший своё время на много лет вперед Гаджеты, Смартфон, Разработка, Linux, Android, Nokia, Meego, Nix, Unix, Мобильные телефоны, Операционная система, Железо, Microsoft, Windows Phone, Nokia Lumia, Видео, Вертикальное видео, Длиннопост


И, конечно же, девайс подойдет для прямого применения — звонков. Помимо весьма удобного приложения номеронабирателя, N9 полностью поддерживает Nokia PC Sync и без проблем позволяет синхронизировать как контакты из vcf/outlook, так и фото/видео/музыку. Есть поддержка и CalDAV и некоторых других сервисов для синхронизации по сети.

Помимо всего прочего, у девайса отличный аудиотракт. Музыка в наушниках звучит отлично, кроме того, есть улучшалки от Dolby, благодаря чему девайс вполне можно юзать как плеер. Сергей похоже так и юзал его, судя по трекам в плейлисте. Само приложение не менее удобное и создавалось для взаимодействие с Ovi Music — аналогом iTunes от Nokia. Уже потом, музыкальный сервис от Nokia начали использовать в устройствах на WP.

Nokia N9 — уникальный Linux-смартфон, опередивший своё время на много лет вперед Гаджеты, Смартфон, Разработка, Linux, Android, Nokia, Meego, Nix, Unix, Мобильные телефоны, Операционная система, Железо, Microsoft, Windows Phone, Nokia Lumia, Видео, Вертикальное видео, Длиннопост


А ещё устройство неплохо подойдет в качестве камеры. На 2011 год качество снимков весьма на уровне! Как уже сказано выше, девайс умеет записывать и видео в 720p при 30 FPS.

Nokia N9 — уникальный Linux-смартфон, опередивший своё время на много лет вперед Гаджеты, Смартфон, Разработка, Linux, Android, Nokia, Meego, Nix, Unix, Мобильные телефоны, Операционная система, Железо, Microsoft, Windows Phone, Nokia Lumia, Видео, Вертикальное видео, Длиннопост
Nokia N9 — уникальный Linux-смартфон, опередивший своё время на много лет вперед Гаджеты, Смартфон, Разработка, Linux, Android, Nokia, Meego, Nix, Unix, Мобильные телефоны, Операционная система, Железо, Microsoft, Windows Phone, Nokia Lumia, Видео, Вертикальное видео, Длиннопост

Полный фотосет есть на imgur.

А ещё смартфон сможет статьи отличной платформой для прохождения отличных мобильных игр — без доната и таймеров!

Nokia N9 — уникальный Linux-смартфон, опередивший своё время на много лет вперед Гаджеты, Смартфон, Разработка, Linux, Android, Nokia, Meego, Nix, Unix, Мобильные телефоны, Операционная система, Железо, Microsoft, Windows Phone, Nokia Lumia, Видео, Вертикальное видео, Длиннопост

❯ Заключение


N9 получился первым гиковским устройством, которое могли без проблем использовать и обычные пользователи. Nokia вложили много сил и времени для того, чтобы привнести в N9 революционные по тем временам идеи, да так, что некоторые фишки потом у неё «позаимствовали» сами гиганты индустрии!

И очень хорошо, что история MeeGo не закончилась на этом. Кто знает, быть может эта система когда-нибудь сделает камбэк и скинет обросший кучу легаси Android? А вы как считаете? Жду ваше мнение в комментариях!

Показать полностью 23 1
[моё] Гаджеты Смартфон Разработка Linux Android Nokia Meego Nix Unix Мобильные телефоны Операционная система Железо Microsoft Windows Phone Nokia Lumia Видео Вертикальное видео Длиннопост
126
4
vodokak
vodokak
2 года назад
Рабочий стол

Для этого сообщества⁠⁠

Нашел еще одну очень старую фотку (2009 год). Это мой первый ноут, рисовала жена. Фоткал на мобильник, возможно, даже не смартфон.

Для этого сообщества Ноутбук, Unix
[моё] Ноутбук Unix
2
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии