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

Игра в кальмара 2: новые испытания

Аркады, Казуальные, Для мальчиков

Играть

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

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

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

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

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

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

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

Linux + Одноплатный компьютер

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

Windows IT Программирование Ubuntu IT юмор Компьютер Программист Raspberry pi Гаджеты Электроника Покупка Все
12 постов сначала свежее
306
monobogdan
monobogdan
Посты о ремонте и моддинге ретрогаджетов.
TECHNO BROTHER
1 год назад

Делаем из битого планшета одноплатник: подключаем Android-устройства к дешевым микроконтроллерам через UART⁠⁠

Делаем из битого планшета одноплатник: подключаем Android-устройства к дешевым микроконтроллерам через UART Программирование, Гаджеты, Смартфон, Linux, Программа, Android, Java, Планшет, Своими руками, Моддинг, Девайс, Ништяки, Одноплатный компьютер, Длиннопост

В наше время, из-за санкций одноплатники стали стоить каких-то «конских» денег. Даже б/у RaspberryPi Zero стоит 2-3 тысячи рублей на барахолках, что, мягко скажем, не совсем лояльная цена для «самого дешевого одноплатного компьютера в мире». Конечно, Orange Pi Zero всё ещё можно купить в пределах 1.500-2.000 рублей, но как по мне и эта цена не слишком лояльна за те характеристики, который предлагает такой одноплатник. С другой стороны, Android-планшеты 10-летней давности продаются на барахолках по 100-300 рублей, что выглядит гораздо привлекательнее, причём на некоторые устройства практически без костылей можно установить полноценный дистрибутив Linux! Вероятно, многие читатели скажут мол «автор бомж» и будут правы: ведь в рамках этой статьи, я хочу рассказать о том, как использовать полурабочий древний планшет в качестве полноценного одноплатника путём подключения его к микроконтроллеру и выводу GPIO! Сегодня мы с вами: узнаем, как подключить микроконтроллер к шине UART в планшете и научимся работать с последовательной шиной в Android прямо из Java и нативных программ. Интересна моя концепция антикризисного одноплатника? Тогда добро пожаловать под кат!

❯ Зачем это нужно?


Пожалуй, нельзя сказать, что подобная концепция пристраивания старых планшетов — вопрос исключительно цены. 2-3 тысячи рублей не такие уж и большие деньги и при желании можно купить хотя-бы Б/У, но всё таки полноценный одноплатник с нормальной GPIO-гребенкой. Однако здесь стоит вопрос не столько дешевизны, сколько E-Waste: зачем выкидывать в помойку потенциально рабочие планшеты с живым процессором, если их можно пристроить куда-то ещё?

Делаем из битого планшета одноплатник: подключаем Android-устройства к дешевым микроконтроллерам через UART Программирование, Гаджеты, Смартфон, Linux, Программа, Android, Java, Планшет, Своими руками, Моддинг, Девайс, Ништяки, Одноплатный компьютер, Длиннопост

На самом деле, планшеты с ROOT-доступом уже из коробки могут выполнять весьма полезные задачи, как, например, хостинг http-сервера для домашней страницы, работать как панель с часиками и погодой, или, например, работать в качестве HMI-панели для оформления заказов в шаурмечной. Кроме того, многие планшеты на базе смартфонных чипсетов (MediaTek, Spreadtrum) имеют полноценный Bluetooth-модуль, что позволяет «подружить» планшет с микроконтроллером через радиоканал, что значительно расширяет возможный спектр применений.

Делаем из битого планшета одноплатник: подключаем Android-устройства к дешевым микроконтроллерам через UART Программирование, Гаджеты, Смартфон, Linux, Программа, Android, Java, Планшет, Своими руками, Моддинг, Девайс, Ништяки, Одноплатный компьютер, Длиннопост

Преимуществ у такого подхода много: у «пожилого» планшета уже есть большой, достаточно качественный (хороший TN, либо даже IPS) дисплей с тачскрином, который поддерживает мультитач, GPU для вывода 3D-графики, 3.5мм для вывода звука + встроенные динамики, а также весьма неплохое, по сравнению с дешевыми одноплатниками, железо. Звучит весьма вкусно для цены в 300 рублей: собрать хоть немного похожую конфигурацию на базе RPi выйдет в 10-15 тысяч рублей (учитывая дороговизну MIPI-матриц с тачскринами + цену самой «малинки» и обвязки для аудиотракта).

Делаем из битого планшета одноплатник: подключаем Android-устройства к дешевым микроконтроллерам через UART Программирование, Гаджеты, Смартфон, Linux, Программа, Android, Java, Планшет, Своими руками, Моддинг, Девайс, Ништяки, Одноплатный компьютер, Длиннопост

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

Делаем из битого планшета одноплатник: подключаем Android-устройства к дешевым микроконтроллерам через UART Программирование, Гаджеты, Смартфон, Linux, Программа, Android, Java, Планшет, Своими руками, Моддинг, Девайс, Ништяки, Одноплатный компьютер, Длиннопост

С таким подходом можно использовать как «голый» Linux, используя концепцию, которую я представил в этой статье, так и взаимодействовать из Java-приложений для Android (что даёт уже, как минимум, удобный GUI-фреймворк). Сегодняшняя статья будет «без воды», только чистая конкретика, поэтому давайте перейдем к реализации!

Делаем из битого планшета одноплатник: подключаем Android-устройства к дешевым микроконтроллерам через UART Программирование, Гаджеты, Смартфон, Linux, Программа, Android, Java, Планшет, Своими руками, Моддинг, Девайс, Ништяки, Одноплатный компьютер, Длиннопост


❯ Подготовка


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

Сама по себе концепция очень простая: многие китайские производители планшетов и смартфонов не только разводят UART в виде отдельного пятачка на плате, но и подписывают его, задействуя UART-канал как вывод для логов ядра, а иногда и предоставляя доступ к рутовой консоли! В свою очередь, из юзерспейса мы можем получить доступ к UART с помощью устройства/dev/ttyS<x>на подавляющем числе чипсетов и/dev/ttyMT<x>на MediaTek. Однако учтите, что в некоторых случаях придется патчить загрузчик, дабы редиректнуть логи ядра в /dev/null.

Делаем из битого планшета одноплатник: подключаем Android-устройства к дешевым микроконтроллерам через UART Программирование, Гаджеты, Смартфон, Linux, Программа, Android, Java, Планшет, Своими руками, Моддинг, Девайс, Ништяки, Одноплатный компьютер, Длиннопост

Однако наличие UART на плате — не всегда признак того, что он сконфигурирован в системе верно. Например, на смартфонах с чипсетами SC6820 нормально завести UART я так и не смог, а на некоторых устройствах на базе MT657x нужно патчить загрузчик, дабы он «увидел» нужный канал UART! В моём случае, героем статьи стал планшет Prestigio, у которого отказал тачскрин, но был доступен UART:

Делаем из битого планшета одноплатник: подключаем Android-устройства к дешевым микроконтроллерам через UART Программирование, Гаджеты, Смартфон, Linux, Программа, Android, Java, Планшет, Своими руками, Моддинг, Девайс, Ништяки, Одноплатный компьютер, Длиннопост

Конкретно в моём случае, после установки последней официальной прошивки планшет перестал слать логи на UART и устройство /dev/ttyMT3 оказалось доступным для наших операций, в вашем же случае может потребоваться настройка devicetree, или просто патчинг загрузчика, дабы редиректнуть консоль на другой вывод UART. Кроме того, необходимо обязательно получить root-доступ хотя-бы к adb shell, поскольку доступ к /dev/tty устройствам возможен только от имени суперпользователя. Как же проверить UART на возможность чтения/записи? Сначала нам необходимо взять ESP32 или любой UART-USB преобразователь, припаять сигнальные линии RX/TX и использовать любую программу для работы с последовательным портом, например Putty. Заходим в adb shell, и пишем что-нибудь в консоль:

Делаем из битого планшета одноплатник: подключаем Android-устройства к дешевым микроконтроллерам через UART Программирование, Гаджеты, Смартфон, Linux, Программа, Android, Java, Планшет, Своими руками, Моддинг, Девайс, Ништяки, Одноплатный компьютер, Длиннопост

Вуаля! Всё работает :)

Работает? Замечательно, значит мы сможем использовать планшет вместе с микроконтроллером! Переходим к практической реализации нашего приложения!

❯ Используем из Java


Я специально решил выделить для Java-подхода отдельный раздел, поскольку просто взять и открыть /dev/ttyMT3 с помощью FileInputStream не выйдет. Дело в том, что даже несмотря на наличие root-доступа, по факту ни одно Android-приложение его не имеет (за исключением подписанных системных в папке /system/app/) и для всех операций, требующих повышенных привилегий, либо распаковывают и запускают внешнюю нативную программу из под суперпользователя, либо с помощью специального костыля с запуском sh-программ читают/пишут нужные блочные устройства сами. Связано это с тем, что все Android-приложения работают в хост-процессе app_process, который форкается (отпочковывается) от «главного» процесса, который запущен из под «простого» пользователя, который не находится в группе system.

Здесь концепция также очень простая: su имеет аргумент -c, который позволяет запустить команду от имени root-пользователя и возвращает объект процесса, дабы мы потом могли перехватить stdout:

Делаем из битого планшета одноплатник: подключаем Android-устройства к дешевым микроконтроллерам через UART Программирование, Гаджеты, Смартфон, Linux, Программа, Android, Java, Планшет, Своими руками, Моддинг, Девайс, Ништяки, Одноплатный компьютер, Длиннопост

Таким образом, для чтения текстовых данных из UART'а нам достаточно лишь периодически «слушать» stdout команды cat и обрабатывать данные:

Делаем из битого планшета одноплатник: подключаем Android-устройства к дешевым микроконтроллерам через UART Программирование, Гаджеты, Смартфон, Linux, Программа, Android, Java, Планшет, Своими руками, Моддинг, Девайс, Ништяки, Одноплатный компьютер, Длиннопост

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

❯ Используем из C


Работа с последовательными портами в Linux не отличается от работы с любыми другими файлами и устройствами: вызовов open, read, write и close обычно хватает и лишь иногда к ним в довесок нужен ioctl.

int fd = open("/dev/ttyMT3", O_RDWR);
int result = write(fd, command, strlen(command));

Для работы с терминалом необходимо использовать модуль termio который предоставляет все необходимые структуры для настройки режима работы терминала, в т.ч и бодрейт. Дело в том, что изначально последовательное устройство настроено на режим работы в качестве терминала, т.е драйвер отдаст данные только после того, как устройство на UART пошлёт \n, или превысит размер внутреннего буфера для сообщения. Если вам нужно работать с бинарными данными и получать их «на лету» — необходимо настроить последовательный порт в «binary» режим:

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);

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

❯ Заключение


Вот таким образом можно использовать проводную шину в планшете для собственных нужд! Как видите, совершенно ничего сложного и используя эти наработки, я реализовал уже не один проект! Надеюсь, материал вам был интересен и полезен :) Пишите своё мнение, можно ли использовать дешевые планшеты по 300 рублей в качестве одноплатников?

Статья была подготовлена при поддержке TimeWeb Cloud. Подписывайтесь на меня и @Timeweb.Cloud, дабы не пропускать новые статьи каждую неделю! Ну а больше подробностей о будущем контенте, как обычно, в первом комменте! Также у меня есть свой Telegram-канал, куда я выкладываю свои мысли, советы по ремонту и моддингу различных гаджетов, а также вовремя публикую ссылки на новые статьи!

Показать полностью 10
[моё] Программирование Гаджеты Смартфон Linux Программа Android Java Планшет Своими руками Моддинг Девайс Ништяки Одноплатный компьютер Длиннопост
36
472
monobogdan
monobogdan
1 год назад
TECHNO BROTHER

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
[моё] Гаджеты Покупка Девайс Одноплатный компьютер Компьютер Минипк Raspberry pi Orange pi Дешево Своими руками Embedded Электронные сигареты Разработка Linux Nix Длиннопост
49
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

Попробовать мобильный офис

Перейти
Партнёрский материал Реклама
specials
specials

Мобильный офис до 100 тысяч рублей⁠⁠

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

Протестировали TECNO MEGABOOK K15S вместе со смартфоном TECNO CAMON 40 и наушниками TECNO в рабочих и бытовых сценариях от Zoom-звонков до перелета, а теперь рассказываем, как себя показала техника.

Первое впечатление от дизайна ноутбука

Первое, что заметно — это вес. При диагонали 15,6 дюйма и полностью металлическом корпусе K15S весит всего 1,7 кг. Это примерно на 15% меньше, чем аналоги. Устройство не обременяет ни в офисе, ни в такси. Ноутбук поместился в стандартный городской рюкзак, было удобно достать его в кафе за завтраком и по дороге в такси, чтобы быстро отработать клиентские правки.

1/4

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

Шарнир работает мягко: чтобы открыть крышку даже одной рукой, не нужно придерживать корпус. Чтобы показать коллеге или клиенту презентацию, достаточно раскрыть экран на 180°. Это удобно и для работы лежа, и для подставок, которые требуют определенного угла обзора.

Также отметим 9 портов: USB-A, USB-C, HDMI, слот для карты памяти — можно забыть о переходниках.

В TECNO MEGABOOK K15S предустановлен Windows 11. Ноутбук готов к работе сразу после включения. Никаких лишних установок и обновлений. Все настроено и оптимизировано для вашей многозадачности.

Экран: яркая картинка и комфорт ночью

Экран — 15,6 дюйма, IPS-матрица с разрешением Full HD. Углы обзора отличные: изображение остается четким, даже если смотреть сбоку, цвета не искажаются. Есть антибликовое покрытие. Тестировали ноутбук при разном освещении: можно спокойно работать у окна. Когда солнце бьет прямо в экран, текст по-прежнему остается читаемым, картинки не искажаются. Это редкость в бюджетных моделях.

1/2

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

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

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

Производительность: рендерим видео, открываем вкладки

Ноутбук работает на AMD Ryzen 7 5825U (опционально можно выбрать версию техники Intel Core i5-13420H). Восьмиядерный AMD с поддержкой 16 потоков подходит для ресурсоемких операций вроде рендеринга или работы с большими массивами данных. Встроенная графика Radeon справляется с редактированием видео в Full HD или играми.

1/4

Во время монтажа 30-минутного ролика в DaVinci Resolve и параллельной работе в Photoshop с несколькими большими PSD-файлами система сохраняла стабильность. Не было ни зависаний, ни заметного падения производительности. Ноутбук уверенно держит в фоне 10 приложений одновременно. Если запущены браузер с 20 вкладками, видеозвонок в Telegram, Excel с объемной таблицей и софт для монтажа, система не тормозит и не перегревается. Переход между окнами остается плавным, ничего не «проседает», даже при одновременном скачивании файлов и редактировании видео.

Базовая комплектация включает 16 ГБ оперативной памяти в двух слотах. При необходимости можно легко увеличить этот показатель до 32 ГБ, заменив стандартные модули на более емкие. Помимо установленного SSD на 1 ТБ предусмотрен дополнительный слот, поддерживающий диски объемом до 2 ТБ.

Чтобы во время нагрузки системы охлаждения не выходили из строя, в ноутбук встроен эффективный вентилятор, способный рассеивать до 35 Вт тепла. Устройство не греется, его спокойно можно держать на коленях. Это решение дополнено тремя режимами работы, которые переключаются простой комбинацией клавиш Ctrl+Alt+T. Тихий режим идеален для работы ночью или в общественных местах, сбалансированный подходит для повседневных задач. Производительный, на котором запускали рендеринг видео и игры, практически не шумит.

Автономность: 15 часов без подзарядки

Протестили автономность MEGABOOK K15S в условиях, знакомых каждому деловому путешественнику. Утром перед вылетом зарядили ноутбук до 100% и взяли его в рейс Москва — Калининград. В зале ожидания провели созвон, потом три часа смотрели сериал и в дороге до отеля редактировали документы. К моменту приезда оставалось 40% заряда: хватило бы еще на пару часов продуктивной работы.

1/3

MEGABOOK K15S может автономно работать до 15 часов и позволяет не оглядываться на индикатор заряда. Заявленное время достигается при типичном офисном использовании: одновременная работа с документами в Word и Excel, ведение переписки, видеоконференции, веб-серфинг.

Если все же понадобится, за  час восполняется до 70% батареи. Компактный адаптер мощностью 65 Вт на базе нитрида галлия поместился даже в карман пиджака. Один блок питания заряжает и ноутбук, и смартфон, и наушники. Экономия места: не нужно никаких дополнительных проводов.

Звук, который реально слышно

В TECNO MEGABOOK K15S установлены два мощных динамика по 2.5 Вт. Звук с глубокими низами, без пластикового дребезжания, объемный. Благодаря DTS можно смотреть видео даже в шумном помещении. В тестах специально включали сцены с шагами и выстрелами: локализация настолько точная, что в наушниках нет необходимости.

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

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

Для тех, кто предпочитает гарнитуру, идеально подойдут беспроводные наушники TECNO FreeHear 1 из экосистемы бренда. Когда не хотелось делиться разговорами с окружающими, подключали их. Чистый звук с акцентом на средние частоты, 11-мм драйверы, которые выдают неожиданную детализацию. Музыку слушать приятно: и фоновый плейлист на телефоне, и вечерний сериал на ноутбуке. Автономно работают наушники 6 часов, с кейсом — до 30 часов. 

1/2

Bluetooth 5.4 обеспечивает стабильное соединение на расстоянии до 10 метров. Удобная C-образная форма разработана специально для длительного ношения — после восьмичасового рабочего дня в ушах не возникает дискомфорта. Наушники поддерживают одновременное подключение к ноутбуку и смартфону. Переключение между устройствами происходит быстро и без заминок.

Через фирменное приложение Welife можно выбрать один из четырех эквалайзеров и отследить местоположение гарнитуры в случае утери. А еще кастомизировать виджет для управления наушниками. Функция настройки персонализированного дизайна доступна для устройств на Android и позволяет гибко изменить внешний вид окна подключения: вплоть до установки фоновой картинки или собственного фото.

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

Бесшовная синхронизация со смартфоном

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

Функция выручила, когда нужно было открыть приложение, у которого нет веб-версии. Удобно работает и буфер обмена: скопировал текст на одном устройстве — вставил на другом. Например, код, полученный в сообщении на телефоне, вводится в браузере на ноутбуке. Экономит минуты, а иногда и нервы. А когда в дороге пропал Wi-Fi, ноутбук сам подключился к мобильному интернету через смартфон.

1/2

TECNO CAMON 40 и сам по себе — мощный рабочий инструмент.  Смартфон выделяется камерой высокого качества 50 Мп, ярким AMOLED-экраном 120 Гц и множеством функций, которые упрощают процесс мобильной съёмки и использование искусственного интеллекта TECNO AI.

Телефон работает на HIOS 15.0.1 на базе Android 15.В фирменную оболочку встроен искусственный интеллект:

  • Голосовой помощник Ella. Отвечает на вопросы, помогает с задачами и управлением устройством.

  • Решение задач. Наводите камеру на задачу, ИИ решает ее.

  • AI Редактор фотографий. Интеллектуальная обработка в одно касание.

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

Технические характеристики

  • Процессор и память. 8 ядер, 16 потоков, Кэш L3 16 МБ, частота до 4.5 ГГц Графический процессор AMD Radeon™ graphics SSD 512 ГБ или 1 ТБ, М.2, 2280, PCle 3.0 Nvme DDR4 16 ГБ, 3200 МГц.

  • Дисплей. 15.6", TFT, Full HD (1920×1080), 16:9, 280нит, 45% NTSC, 16.7 млн цветов, 60 Гц, 141 ррі.

  • Веб-камера. 1 Мп, шторка приватности.

  • Порты. 9 портов: 1*TF Card (microSD), 1*HDMI 1.4, 1*USB-A 3.1,

    1*USB-A 3.2, 1*3.5mm аудиовход, *Ethernet RJ45 до 1 Гбит, 2*Туре-С (Full Function), 1*слот для замка Kensington.

  • Другое. Сканер отпечатка пальца в кнопке питания. Клавиатура с подсветкой (4 уровня яркости). Тачпад с поддержкой одновременно 4 касаний.

  • Батарея. 70 Вт∙ч (6150 мА∙ч), Li-Pol, 11.55 B 65 Вт Type-C GaN, 20 В, 3.25 А, кабель 1.8 м (Туре-С-Type-C).

  • Габариты. 17.3 мм (высота), 359.5 мм (ширина), 236 мм (глубина).

  • Вес. 1,7 кг.


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

КУПИТЬ НОУТБУК TECNO

Реклама TECNO Mobile Limited, Юридический адрес: Flat N, 16/F., Block B, Универсальный промышленный центр, 19-25 Shan MeiStreet, Fotan, New Territories, Гонконг

Показать полностью 17
Электроника Гаджеты Ноутбук Длиннопост
2021
monobogdan
monobogdan
1 год назад
TECHNO BROTHER

Подключаем дисплей к любому одноплатнику с SPI: Большой мануал о поиске экранчиков для ваших проектов⁠⁠

Подключаем дисплей к любому одноплатнику с SPI: Большой мануал о поиске экранчиков для ваших проектов Linux, Полезное, Гаджеты, C++, Своими руками, Программирование, Графика, 2D, Покупка, Orange Pi, Raspberry Pi, Одноплатный компьютер, Драйвер, Дисплей, Разработка, Длиннопост



Сейчас появилось достаточно много различных дешевых одноплатников с очень достойными характеристиками, которые вполне можно назвать экономичными и портативными. Однако очень часто встает вопрос вывода изображения на дисплей: к сожалению, в подобные устройства обычно ставят урезанные версии чипсетов без видеовыхода на обычные матрицы. Конечно в них практически всегда есть HDMI, но это совершенно не выход для портативного устройства: прожорливый чип скалера будет очень негативно влиять на время работы от АКБ. Да и сами подобные дисплеи очень дорогие: почти 2.000 рублей за матрицу со скалером — это действительно бьет по карману. Сегодня я расскажу Вам о существующих протоколах для дисплеев, подскажу, как применить экранчики от старых навигаторов/мобильников и мы подключим с вами SPI-дисплей к одноплатнику без видеовыхода. Причем мы реализуем как просто библиотеку, которая позволяет выводить произвольную графику из ваших программ, так
и службу, которая будет напрямую копировать данные из фреймбуфера и преобразовывать в формат для нашего дисплея. Интересно? Тогда жду вас в статье!

Предисловие


На самом деле, существует достаточно много различных физических протоколов для общения с дисплеями. На программном уровне, общение с ними относительно стандартизированно, однако на аппаратном уровне различий довольно много. Самые распространенные из них:

  • MIPI DSI — дифференциальный многоканальный LVDS протокол. Если говорить совсем условно — то это эдакий быстрый низковольтный SPI, который для передачи одного байта использует минимум 4 линии — D+, D-, CLK+, CLK-, где фактических линии две, но для подавления помех используются доп. линии инвертированной полярности, из которых затем вычитаются положительные. Этот протокол позволяет подключать дисплеи очень высокого разрешения и используется практически во всех современных смартфонах. Насколько мне известно, такие дисплеи имеют собственную видеопамять размером с буфер кадра (т.е для 1920х1080х3 дисплея — ~5мб).

  • TTL/RGB — относительно простой для реализации протокол, очень похож на VGA, но по сути является цифровым: для передачи пикселей используются отдельные линии — например, 5 битов красного, 6 битов синего и 5 битов зеленого (RGB565). Не требует инициализации и обычно не имеет системы команд — пиксели синхронизируются с помощью тактовых сигналов HSYNC/VSYNC. Эти крайне дешевые дисплеи можно встретить на старых китайских игровых консолях, планшетах (до 720p) и автомобильных навигаторах (о них ниже), а также КПК (но на них даташиты найти сложнее). На МК и одноплатниках их использовать можно, но для этого нужно большое кол-во пинов (~18). У таких дисплеев нет собственной памяти, поэтому обновлять картинку нужно всегда, иначе будет белый дисплей. Есть еще аналоговая разновидность, практически 1 в 1 похожая на VGA, используется в ранних автомобильных телевизорах — но ей управлять сложнее из-за кучи различных тактовых сигналов.

  • 8080 — 8 или 16-битная параллельная шина, именно этот протокол использовали большинство телефонов в середине-конце нулевых, а его 16-битная разновидность использовалась в ультрадешевых китайских смартфонах начала 2010-х (Fly Jazz, Explay N1, Fly Era Nano 1, Fly Wizard — дисплеи всех этих копеечных на вторичке телефонов можно использовать и в своих проектах!). Занимает минимум 11 пинов — 8 на данные, 2 на сигналы RD/WR (он определяет, хотим ли мы сейчас что-то прочитать или записать) и 1 DC (определяет, куда мы пишем данные — в регистры, или в видеопамять). Такие дисплеи имеют собственную ОЗУ, поэтому необязательно гонять в них данные постоянно.

  • SPI — популярный протокол, который используется и в DIY-проектах и возможно в китайских старых MP3-плеерах (информация пока не точная). Отличается тем, что требует всего 3 пина для подключения — MOSI (данные), CLK (тактовая частота) и DC (имеет ту же роль, что и в 8080 дисплеях). Он гораздо предпочтительнее для использования в домашних проектах, поскольку хардварный SPI есть во многих микроконтроллерах/одноплатниках, а частенько к нему в комплект идёт DMA, позволяя разгрузить процессор. Кроме того, эти дисплеи использовали в телефонах начала нулевых — Nokia и Siemens точно использовала именно их. Причём у Siemens сами пины не на шлейфе, а «прижимаются» — бери да подпаивайся, только бустер подсветки до 12в придётся сделать.

  • I2C — редкий протокол для дисплеев из-за медлительности. Сейчас используется в недорогих OLED-модулях низкого разрешения, использовался в мобильниках самого начала нулевых (Ericsson) и Motorola C350.


Я не стал упоминать «большие» протоколы типа HDMI или eDP — они так или иначе, в физическом плане близки к MIPI DSI. Как видите — протоколов много и самых разных, соответственно и дисплеи нужно искать в разных местах. Дешевые DIY-дисплеи можно найти за довольно разумные деньги на алике — 1.8" матрицы на момент написания статьи стоили ~200 рублей, 2.4 — ~400 рублей, 3.5 и выше — от 700 рублей и выше. Пичем Вы вольны выбирать интерфейс — кому-то удобнее SPI, кому-то удобнее 8080. Я лично выбрал SPI — поскольку он есть в «хардварном» виде на большинстве одноплатников и доступен для программирования как из обычного пользовательского режима (т.е можно пользоваться шиной из обычной программы), так и из драйверов.

Где найти дисплеи?


Однако есть способ найти дисплеи «бесплатно» — из старых и нерабочих устройств. Например, из автомобильных навигаторов. Недавно читатель с DTF предложил заслать с 10-ок подобных девайсов, я конечно же согласился! Что самое приятное в них — так это то, что дисплеи там обычно стандартизированы — как по размерам, так и по шлейфу. Суть вот в чем: китайские компании довольно долго производили 4" дисплеи с разрешением 480x232 и резистивным тачскрином.

Подключаем дисплей к любому одноплатнику с SPI: Большой мануал о поиске экранчиков для ваших проектов Linux, Полезное, Гаджеты, C++, Своими руками, Программирование, Графика, 2D, Покупка, Orange Pi, Raspberry Pi, Одноплатный компьютер, Драйвер, Дисплей, Разработка, Длиннопост



Поэтому Вы практически на 100% можете быть уверены, что один дисплей подойдет к другому навигатору и покажет картинку (а если нет — то открываем даташит на дисплей и корректируем тайминги). Эти дисплеи используютTTL/RGBпротокол, поэтому для того, чтобы с ними работать, вам понадобится либо много свободных пинов, либо превратить микроконтроллер в видеоконтроллер (Raspberry Pi Pico/ESP32 должен с этим справиться без проблем). Большинство из этих дисплеев работает в 16-битном режиме, т.е до 65536 цветов. Ниже прилагаю распиновку к ним:

Подключаем дисплей к любому одноплатнику с SPI: Большой мануал о поиске экранчиков для ваших проектов Linux, Полезное, Гаджеты, C++, Своими руками, Программирование, Графика, 2D, Покупка, Orange Pi, Raspberry Pi, Одноплатный компьютер, Драйвер, Дисплей, Разработка, Длиннопост



Для более удобно подключения, можно использоватьтакиеbreakout-платы для 40-пин шлейфов. Я себе заказал несколько, в том числе и для паябельных шлейфов от старых мобилок. Стоят на алике копейки — в среднем, 100 рублей за 5 плат (берите 40 пин/0.5мм).

Подключаем дисплей к любому одноплатнику с SPI: Большой мануал о поиске экранчиков для ваших проектов Linux, Полезное, Гаджеты, C++, Своими руками, Программирование, Графика, 2D, Покупка, Orange Pi, Raspberry Pi, Одноплатный компьютер, Драйвер, Дисплей, Разработка, Длиннопост



На некоторых одноплатниках уже есть готовый 40-пин коннектор для подключения ваших дисплеев. Большинство из них базируется на базе чипсетов AllWinner F1C100s/F1C200s/V3s и экран работает там «из коробки», за исключением тачскрина (с ним надо повозиться), известные мне — Lctech Pi, MangoPi (извиняюсь за плохое качество фото, это с моего сайд-проекта):

Подключаем дисплей к любому одноплатнику с SPI: Большой мануал о поиске экранчиков для ваших проектов Linux, Полезное, Гаджеты, C++, Своими руками, Программирование, Графика, 2D, Покупка, Orange Pi, Raspberry Pi, Одноплатный компьютер, Драйвер, Дисплей, Разработка, Длиннопост



Если Вам нужен маленький дисплей, то можно взять оный от старого нерабочего кнопочного телефона. Из самых простых — Siemens C65, S65, M65, A55, A65. Эти дисплеи работают по протоколу SPI и к ним легко подпаяться. Как еще один из вариантов — дисплей от «народного» Motorola C350, который работает через интерфейс SPI, но требует 12-битного формата на цвет:

Подключаем дисплей к любому одноплатнику с SPI: Большой мануал о поиске экранчиков для ваших проектов Linux, Полезное, Гаджеты, C++, Своими руками, Программирование, Графика, 2D, Покупка, Orange Pi, Raspberry Pi, Одноплатный компьютер, Драйвер, Дисплей, Разработка, Длиннопост



Обратите внимание, что для этих дисплеев нужно самому мастерить бустер подсветки: от 3.7в они не заведутся. Сименсовским дисплеям нужно 12в — связано это с тем, что светодиоды в подсветке подключены последовательно, дабы уменьшить потребление. Если есть желание — можно разобрать модуль и перепаять светодиоды параллельно, но «кушать» такая сборка будет ощутимо, проще взять step-up преобразователь до 12В с алика за пару соток.

MIPI дисплеи можно достать из копеечных старых смартфонов ZTE/Lenovo/МТС/Билайн и.т.п. Предпочтительнее здесь именно именитые бренды, поскольку и ZTE и Lenovo делятся исходниками прошивки — так что можно будет найти команды инициализации и самому запустить дисплей. Кроме инициализации дисплея, там же можно будет найти и драйвер тачскрина — обычно они общаются по протоколу I2C и при очень большом желании, можно будет заставит работать и его.

Подключаем дисплей к любому одноплатнику с SPI: Большой мануал о поиске экранчиков для ваших проектов Linux, Полезное, Гаджеты, C++, Своими руками, Программирование, Графика, 2D, Покупка, Orange Pi, Raspberry Pi, Одноплатный компьютер, Драйвер, Дисплей, Разработка, Длиннопост



Для работы с ними, я также рекомендую Breakout-платы, а схему на коннектор дисплея можно найти в сервисмануале или схеме устройства (если таковой имеется для вашего смартфона). Для Lenovo подобные ищутся без проблем, но для топовых Samsung S2/S3/S4 с крутыми OLED-дисплеями за MIPI-дисплеи придётся забыть, т.к схем в открытом доступе нет.

Подключаем дисплей к любому одноплатнику с SPI: Большой мануал о поиске экранчиков для ваших проектов Linux, Полезное, Гаджеты, C++, Своими руками, Программирование, Графика, 2D, Покупка, Orange Pi, Raspberry Pi, Одноплатный компьютер, Драйвер, Дисплей, Разработка, Длиннопост



8080 дисплеи можно достать из старых китайских «кнопочников». Ищите те модели, на которые есть сервис-мануал (Fly DS124 и другие модели, некоторые Explay), тогда Вы сможете прочесть ID дисплея из регистра 0x0 (вида 0x9325/0x7739 и.т.п), найти даташит на интересующий вас контроллер и использовать его в своем проекте. В этих дисплеях самое приятное — паябельный шлейф и подсветка 5в, которая будет работать и на 3.7в, но немного тусклее.

Подключаем дисплей к любому одноплатнику с SPI: Большой мануал о поиске экранчиков для ваших проектов Linux, Полезное, Гаджеты, C++, Своими руками, Программирование, Графика, 2D, Покупка, Orange Pi, Raspberry Pi, Одноплатный компьютер, Драйвер, Дисплей, Разработка, Длиннопост



Если же Вам хотелось бы экранчик побольше, с разрешением 480x320, то смотрите в сторону очень дешевых мобильников из начала 2010х — Explay N1, Fly Jazz, Fly Wizard. Вполне может быть так, что у Вас лежит подобный девайс будучи разбитым или утопленным, а дисплей остался. Кстати, если вдруг у вас лежит один из подобных ультрадешевых китайчиков, но вам они не нужны — пишите в ЛС, есть идеи для проектов с ними.

Подключаем дисплей к любому одноплатнику с SPI: Большой мануал о поиске экранчиков для ваших проектов Linux, Полезное, Гаджеты, C++, Своими руками, Программирование, Графика, 2D, Покупка, Orange Pi, Raspberry Pi, Одноплатный компьютер, Драйвер, Дисплей, Разработка, Длиннопост



Обратите внимание, что эти дисплеи используют 18-битный физический интерфейс, но для программного доступа должно хватать 16-бит. Кроме того, на этом шлейфе есть пин IM0 — он отвечает за установку режима работы контроллера дисплея. Если бы у нас был еще IM1 и IM2, то мы могли бы хоть режим SPI установить, но в данном случае, мы можем установить либо 8-битный режим, либо 16-битный. Можете отследить пин IM0 на шлейфе и если он идет к обвязке, где предположительно разрывается/соединяется IM1/IM2, то можете попробовать разорвать/кинуть на них высокий уровень. Насчет подсветки на таких дисплеях пока что не знаю. Если распиновки на телефон нет, то поищите диагностические пятачки под коннектором, с осциллографом или даже просто тестером можно попытаться найти распиновку.

Подключаем дисплей к любому одноплатнику с SPI: Большой мануал о поиске экранчиков для ваших проектов Linux, Полезное, Гаджеты, C++, Своими руками, Программирование, Графика, 2D, Покупка, Orange Pi, Raspberry Pi, Одноплатный компьютер, Драйвер, Дисплей, Разработка, Длиннопост

От слов к делу — userspace часть


На этом предлагаю перейти к практической реализации нашего драйвера дисплея. Как я уже говорил, реализовать его можно двумя способами: в виде user-space библиотеки для вывода картинки из обычных программ, так и kernel-mode драйвер, который будет реализовать framebuffer, что позволит выводить туда и X Window System, и SDL — что душе угодно.

У каждого подхода есть плюсы и минусы. Перечисляю их:

  • Универсальность: Библиотека сможет выводить только ту картинку, которая формирует для нее программа. Однако, она может это делать максимально эффективным для этого образом, да и никто не мешает написать сервис, который будет копировать из /dev/fb0 картинку на наш дисплей (однако это лишняя нагрузка на процессор), китайцы так и делают.

  • Производительность: Kernel-mode драйвер может быть теоретически быстрее, хотя по факту вся SPI-подсистема Linux выделен в удобный spidev.

  • Стабильность: По понятным причинам, User-space библиотека будет куда стабильнее драйвера и не крашнет систему в случае ошибки.


Работать мы будем с простеньким 1.8" дисплеем, который имеет разрешение 128x160, работает на контроллере ST7739.

В качестве одноплатника я взял Orange Pi One. Брал я его на вторичке за 1.000 рублей, однако продавец меня порадовал и положил не один, а два девайса — в благодарность за статьи о Orange Pi 3G IoT :) Сейчас старые модели RPi и Orange Pi (но не их Mini и Zero версии) стоят копейки.

Подключаем дисплей к любому одноплатнику с SPI: Большой мануал о поиске экранчиков для ваших проектов Linux, Полезное, Гаджеты, C++, Своими руками, Программирование, Графика, 2D, Покупка, Orange Pi, Raspberry Pi, Одноплатный компьютер, Драйвер, Дисплей, Разработка, Длиннопост



Накатываем систему на флэшку (я выбрал Debian с ядром 3.4 — то которое еще не имело поддержки DeviceTree) и идем изучать гребенку:

Подключаем дисплей к любому одноплатнику с SPI: Большой мануал о поиске экранчиков для ваших проектов Linux, Полезное, Гаджеты, C++, Своими руками, Программирование, Графика, 2D, Покупка, Orange Pi, Raspberry Pi, Одноплатный компьютер, Драйвер, Дисплей, Разработка, Длиннопост



Видим SPI? Он нам и нужен! Подключаем питание дисплея (3.3В на VCC, 5В на LED и не забываем землю), подключаем сигнальные линии (SCK — CLK, SDA — MOSI, A0 и RESET — цепляем на произвольный GPIO, на котором «ничего нет», я выбрал PA10 и PA20 пины). Если SPI Вам нужен только для дисплея, то можно просто поставить перемычку между CS и землей. Оставлять его «в воздухе» нельзя — иначе дисплей не будет работать.

Подключаем дисплей к любому одноплатнику с SPI: Большой мануал о поиске экранчиков для ваших проектов Linux, Полезное, Гаджеты, C++, Своими руками, Программирование, Графика, 2D, Покупка, Orange Pi, Raspberry Pi, Одноплатный компьютер, Драйвер, Дисплей, Разработка, Длиннопост



Если подключили все верно, то при включении одноплатника, Вы увидите подсветку.
Теперь для того, чтобы им управлять, нам нужно получить доступ к шине SPI и проинициализировать контроллер. Для этого убеждаемся в том, что у нас есть spidev в каталоге /dev/, где spidev0.0 — первый контроллер SPI с первой линией CS, spidev0.1 — первый контроллер SPI с второй линией CS. У OrangePi One в стоке он только один — а для CS предлагается использовать sysfs. Кроме этого, нам нужно «экспортировать» из задать направлением пинам, которые мы будем использовать для сигналов RESET и DC. Для этого пишем номера пинов на гребенке прямо в устройство /sys/class/gpio/export, например так:

echo 10 > /sys/class/gpio/export

echo 20 > /sys/class/gpio/export

echo out > /sys/class/gpio/gpio20/direction

echo out > /sys/class/gpio/gpio10/direction

Обратите внимание, что в свежих версиях ядра появилось нормальное API для доступа к GPIO из userspace, управлять пинами через sysfs — в какой-то степени считается плохим тоном.

Открываем устройство как обычный файл:

fd = open("/dev/spidev0.0", O_RDWR | O_NONBLOCK);

dcFd = open("/sys/class/gpio/gpio10/value", O_RDWR);

resetFd = open("/sys/class/gpio/gpio20/value", O_RDWR);

И отправляем контроллер дисплея в RESET:

gpHelperSetState(resetFd, 0);

usleep(250000); // 250ms

gpHelperSetState(resetFd, 1);

После этого, реализовываем методы для передачи данных через SPI. В Linux, общение через эту шину идёт посредством транзакции, причем размер одной транзакции ограничен конкретным SPI-контроллером. В случае AllWinner, тут от 64, до 128 байт. Для каждой транзакции можно установить тактовую частоту — AllWinner поддерживает до ~100мгц.

void CLCM::Command(unsigned char cmd) {

spi_ioc_transfer tf;

memset(&tf, 0, sizeof(tf));

tf.bits_per_word = 8;

tf.len = 1;

tf.speed_hz = 64000000;

tf.tx_buf = (unsigned long)&cmd;

gpHelperSetState(dcFd, 0);

if(ioctl(fd, SPI_IOC_MESSAGE(1), &tf) < 0) LOG("SPI transfer failed\n");

}

void CLCM::Data(unsigned char data) {

spi_ioc_transfer tf;

memset(&tf, 0, sizeof(tf));

tf.bits_per_word = 8;

tf.len = 1;

tf.speed_hz = 64000000;

tf.tx_buf = (unsigned long)&data;

gpHelperSetState(dcFd, 1);

if(ioctl(fd, SPI_IOC_MESSAGE(1), &tf) < 0) LOG("SPI transfer failed\n");

}

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

Линк на Pastebin, т.к код инита слишком большой.

Для передачи фреймбуфера, мы реализовываем отдельный метод, который разобьёт его на транзакции. В нашем случае, фреймбуфер занимает 128 * 160 * 2 = 40960 байт, делим на 64, получаем 640 транзакций на передачу одного кадра


void
CLCM::Bitmap(void* data, int len) {

gpHelperSetState(dcFd, 1);

for(int i = 0; i < len / 64; i++) {

spi_ioc_transfer tf; memset(&tf, 0, sizeof(tf));

tf.bits_per_word = 8;

tf.len = 64;

tf.speed_hz = 32000000;

tf.tx_buf = (unsigned long)data;

data += 64;

if(ioctl(fd, SPI_IOC_MESSAGE(1), &tf) < 0) LOG("SPI transfer failed\n");

}

}


Компилируем нашу программу, запускаем и видим: на дисплее появился мусор, а это значит, что он успешно проинициализирован. Если у Вас всё равно белый дисплей — смотрите подключение и убедитесь, что подключили сигнальные линии RESET/DC куда надо. После инициализации, на DC должен быть логический 0 (0В), на RESET — логический 1 (3.3В).

Пишем простенький загрузчик TGA и выводим картинку на экран:

CImage* img = CImage::FromFile("test.tga");

if(img) Bitmap(img->RGB, img->Width * img->Height * 2);


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

Выводим фреймбуфер на экран


Это всё конечно замечательно, однако зачастую есть необходимость отображать картинку, которые рисуют другие программы — X Window System, или, например, порт эмулятора денди на SDL1.2. Для этого, нам нужен способ выводить на наш дисплейчик то, что рисуется в главный фреймбуфер — /dev/fb0. И для этого, у нас есть целых два способа:

  • Реализация kernel-mode драйвера фреймбуфера: Это правильный вариант, однако при условии отсутствия dts, придется «подвигать» родной драйвер на другой фреймбуфер, либо перенастраивать уже имеющееся окружение на /dev/fb1.

  • Служба-прослойка, которая копирует фреймбуфер и вручную рисует на наш дисплей Этот способ я подсмотрел у китайцев: именно он реализован в драйвере дешевых дисплеев для Raspberry Pi. В целом, если так подумать, то это действительно довольно простой, портативный (не зависящий от версии ядра) и шустрый метод.


Именно второй способ мы и выберем в силу его некоторой диковинности. Фреймбуфер Linux имеет одну очень приятную особенность: он способен сам выполнять преобразования формата пикселей и динамически менять размер рабочего пространства. Мы можем просто попросить драйвер установить комфортный для нашего дисплея режим (128x160), цветность (RGB565) и читать уже готовые битмапы, по необходимости пересылая их на дисплей.

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

struct CLCM {

char* name;

int width,

height;

void(*init)();

void(*presentBuffer)(void* buf);

};

CLCM lcm7735

{

.name = "ST7735",

.width = 128,

.height = 160,

.init = &st7735Init,

.presentBuffer = &st7735Bitmap

};

CLCM* lcmList[] = { &lcm7735 };


Теперь у нашей службы есть некоторая гибкость. Захотели — поставили дисплей на базе ILI9341, захотели — на базе ILI9325, достаточно лишь портировать код инициализации.

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

bool setupFrameBuffer() {

LOG("Open framebuffer device");

fbDevice = open("/dev/fb0", O_RDWR);

if(!fbDevice) {

LOG("Failed to open primary framebuffer");

return false;

}

ioctl(fbDevice, FBIOGET_VSCREENINFO, &fbVar);

fbVar.xres = lcm->width;

fbVar.yres = lcm->height;

if(ioctl(fbDevice, FBIOPUT_VSCREENINFO, &fbVar) < 0) {

LOG("Unable to set framebuffer size :c");

return false;

}

ioctl(fbDevice, FBIOGET_VSCREENINFO, &fbVar); // Get yet another time for test

LOGF("Parent FB: %ix%i %i-bits", fbVar.xres, fbVar.yres, fbVar.bits_per_pixel);

ioctl(fbDevice, FBIOGET_FSCREENINFO, &fbFix);

fbMem = (char*)mmap(0, fbFix.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fbDevice, 0);

buf = (unsigned short*)malloc(lcm->width * lcm->height * 2);

if(!fbMem) {

LOG("mmap failed");

return false;

}

return true;

}


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

__inline unsigned short lcmTo565(unsigned int r, unsigned int g, unsigned int b) {

short ret = ((r & 0b11111000) << 8) | ((g & 0b11111100) << 3) | (b >> 3);

return bswap_16(ret);

}



Ну и переходим, собственно, к копированию фреймбуфера на наш дисплей:

void lcmCopyFramebuffer() {

int bpp = fbVar.bits_per_pixel / 8;

for(int i = 0; i < lcm->width; i++) {

for(int j = 0; j < lcm->height; j++) {

unsigned char* rgbData = (unsigned char*)&fbMem[(j * fbFix.line_length) + (i * bpp)];

buf[j * lcm->width + i] = lcmTo565(rgbData[0], rgbData[1], rgbData[2]);

}

}

lcm->presentBuffer(buf); }


Да, это вся программа. Тестируем наш результат:



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

Заключение


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

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

Показать полностью 14
[моё] Linux Полезное Гаджеты C++ Своими руками Программирование Графика 2D Покупка Orange Pi Raspberry Pi Одноплатный компьютер Драйвер Дисплей Разработка Длиннопост
130
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
1482
monobogdan
monobogdan
1 год назад
TECHNO BROTHER

Мы сделали вам плату, а дальше вы сами: Доводим дешевый одноплатник за "косарь" до ума!⁠⁠

Мы сделали вам плату, а дальше вы сами: Доводим дешевый одноплатник за "косарь" до ума! Гаджеты, Смартфон, Программирование, IT, Orange Pi, Одноплатный компьютер, Linux, Android, Raspberry pi, Минипк, Дешево, Покупка, Моддинг, Своими руками, Embedded, Длиннопост, Авторская неделя на Пикабу



В прошлой статье, мы с вами рассмотрели на что способен одноплатный компьютер, который стоит всего 1.000 рублей. Как мы выяснили, перспективы у данного девайса весьма неплохие, однако по факту, Orange Pi продаёт практически голую железку, которую нужно дорабатывать самому. Да, тут есть Ubuntu/Fedora, да, тут выведена гребенка с I2C/SPI — однако из коробки это всё работает криво-косо, либо не работает совсем. Даже обещанные шины SPI/I2C фактически не доступны в системе «из коробки». Материалов о доработке этого одноплатника в сети мало, поэтому я решил довести его до ума сам и поделится с вами — в том числе, готовыми бинарными образами! Интересно, на что способен доработанный одноплатник по цене ящика пива? :)

Над чем будем работать

В прошлой статье, мы с вами определились с потенциальными перспективами такого устройства. По цене 3х ESP32, производитель предлагает нам два полноценных вычислительных ARM-ядра, 256 мегабайт оперативной памяти, 512 мегабайт встроенной NAND-памяти, контроллер питания с возможностью работы от литий-ионных АКБ и 3G модем. Но в бочке меда нашлась ложка дегтя: никто не собирался это всё поддерживать и Orange Pi практически сразу «забили» на поддержку устройства, ограничившись портом Debian/Ubuntun на устройство.

Мы сделали вам плату, а дальше вы сами: Доводим дешевый одноплатник за "косарь" до ума! Гаджеты, Смартфон, Программирование, IT, Orange Pi, Одноплатный компьютер, Linux, Android, Raspberry pi, Минипк, Дешево, Покупка, Моддинг, Своими руками, Embedded, Длиннопост, Авторская неделя на Пикабу



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

Ко всему прочему, в Linux не работает GSM-стек. Да, совсем. Производитель даже не стал кооперироваться с MediaTek, чтобы попытаться реализовать работу с модемом на уровне системы. А ведь фактически, вся работа с модемом происходит лишь на уровне AT-команд. Так в чем же проблема была?

Мы сделали вам плату, а дальше вы сами: Доводим дешевый одноплатник за "косарь" до ума! Гаджеты, Смартфон, Программирование, IT, Orange Pi, Одноплатный компьютер, Linux, Android, Raspberry pi, Минипк, Дешево, Покупка, Моддинг, Своими руками, Embedded, Длиннопост, Авторская неделя на Пикабу



Со всем этим мне и предстоит разобраться! Клонируем репозиторий с исходниками ядра и бежим собирать!

Собираем ядро. I2C и SPI.

Вместо типичного Buildroot, Orange Pi использует свою собственную простую систему сборки на shell-скриптах: в качестве тулчейна используется уже готовый linaro. Отчасти, это связано с самими чипами, на которых работают их устройства — MediaTek, например, не использует Mainline ядро и в процессе сборке имеет ещё кучу шагов для подготовки финального образа. Там даже menuconfig не работает и все изменения приходится делать в уже сгенерированной когда-то конфигурации.

Клонируем репозиторий с системой сборки и запускаем скрипт:

git clone https://github.com/orangepi-xunlong/OrangePi_Build cd OrangePi_Build ./Build_OrangePi.sh

Мы сделали вам плату, а дальше вы сами: Доводим дешевый одноплатник за "косарь" до ума! Гаджеты, Смартфон, Программирование, IT, Orange Pi, Одноплатный компьютер, Linux, Android, Raspberry pi, Минипк, Дешево, Покупка, Моддинг, Своими руками, Embedded, Длиннопост, Авторская неделя на Пикабу



Выбираем нашу плату — 3G IoT и ждем, пока система сборки фактически скачает все необходимое для сборки — исходный код ядра, папки external (драйвера, загрузчик и порт linux MediaTek). Обратите внимание, OrangePi даже систему сборки завязали на конкретной версии системы: только Ubuntu 18.04, но на самом деле, ядро соберется без проблем практически где угодно. После того, как все было скачано, переходим в папку с скриптом сборки и запускаем скрипт сборки:

cd ../OrangePi3G_iot/
./build.sh


А нет, не запускаем — скрипт жалуется на то, что не может поставить некоторые пакеты. Не беда — ставим bsdtar и python minimal вручную и идем править код скрипта. Находится в он scripts/general.sh: убираем оттуда устаревшие имена пакетов.

Мы сделали вам плату, а дальше вы сами: Доводим дешевый одноплатник за "косарь" до ума! Гаджеты, Смартфон, Программирование, IT, Orange Pi, Одноплатный компьютер, Linux, Android, Raspberry pi, Минипк, Дешево, Покупка, Моддинг, Своими руками, Embedded, Длиннопост, Авторская неделя на Пикабу



После этого, компиляция ядра должна пройти успешно. Обратите внимание на версию вашей платы — те, что продают сейчас — именно A. Если пытаться подкинуть им ядро для B, то они будут уходить в kernel panic из-за отсутствия eMMC.

Мы сделали вам плату, а дальше вы сами: Доводим дешевый одноплатник за "косарь" до ума! Гаджеты, Смартфон, Программирование, IT, Orange Pi, Одноплатный компьютер, Linux, Android, Raspberry pi, Минипк, Дешево, Покупка, Моддинг, Своими руками, Embedded, Длиннопост, Авторская неделя на Пикабу



Если mkbootimg будет жаловаться на libstdc++6, то ставим его x86 версию из репозиториев.

Готовое ядро будет лежать вoutput/kernel/boot.img, которое можно прошить на устройство. С одним маленьким нюансом — оно рассчитано на загрузку из внутренней памяти, которой критически мало для дистрибутива Linux! У нас нет boot_sd.img, который есть в оригинальном дистрибутиве. Попытка разобрать образ стандартным AndImgTool не увенчалась успехом — рамдиск встроен прямо в образ zImage, а не отдельно, как это обычно бывает у Android-образов.

Мы сделали вам плату, а дальше вы сами: Доводим дешевый одноплатник за "косарь" до ума! Гаджеты, Смартфон, Программирование, IT, Orange Pi, Одноплатный компьютер, Linux, Android, Raspberry pi, Минипк, Дешево, Покупка, Моддинг, Своими руками, Embedded, Длиннопост, Авторская неделя на Пикабу



Покопавшись в скриптах сборки, я так и не понял логику создания boot_sd, ничего связанного с sd я не нашел даже grep'ом по всей папке. Ну что-ж, тогда попробуем обходным путем: скомпилируем нужные драйвера в виде загружаемых модулей (ko). Идём в наш конфиг, расположенный в linux/arch/arm/configs/3giot_defconfig и меняем CONFIG_I2C_CHARDEV и CONFIG_SPI_SPIDEV на m. Пояснение: y заставит систему сборки скомпоновать драйвер статически с ядром, а m выделит его в виде отдельного модуля ko, который затем можно загрузить черезinsmod.

Мы сделали вам плату, а дальше вы сами: Доводим дешевый одноплатник за "косарь" до ума! Гаджеты, Смартфон, Программирование, IT, Orange Pi, Одноплатный компьютер, Linux, Android, Raspberry pi, Минипк, Дешево, Покупка, Моддинг, Своими руками, Embedded, Длиннопост, Авторская неделя на Пикабу



Снова собираем ядро, на этот раз компиляция занимает не больше минуты. Нужные нам файлы появятся в linux/drivers/spi/spidev.ko и linux/drivers/i2c/i2c-d-ev.ko. Переносим их на хост-пк, а затем и на само устройство с помощью SSH:

Мы сделали вам плату, а дальше вы сами: Доводим дешевый одноплатник за "косарь" до ума! Гаджеты, Смартфон, Программирование, IT, Orange Pi, Одноплатный компьютер, Linux, Android, Raspberry pi, Минипк, Дешево, Покупка, Моддинг, Своими руками, Embedded, Длиннопост, Авторская неделя на Пикабу



Загружаем модули ядра:

insmod i2c-dev.ko


И та-дам! Целых две i2c шины появилось в системе (/dev/i2c-0, /dev/i2c-1). Устанавливаем i2c-tools и идем проверять с помощью i2cdetect: первая шина полностью свободна под наши проекты, а на второй по некоторым адресам висит периферия (FM-радио как вариант):

Мы сделали вам плату, а дальше вы сами: Доводим дешевый одноплатник за "косарь" до ума! Гаджеты, Смартфон, Программирование, IT, Orange Pi, Одноплатный компьютер, Linux, Android, Raspberry pi, Минипк, Дешево, Покупка, Моддинг, Своими руками, Embedded, Длиннопост, Авторская неделя на Пикабу



I2C теперь точно работает! Но как насчет SPI?

insmod spidev.ko
Device or resource busy.



Увы! spidev нельзя подгружать динамически, только статически линковать с ядром, чего мы сделать пока не можем. Однако техническая возможность заставить работать SPI есть: например, написать свой драйвер, который транслирует команды из юзерспейса в SPI API, которое работает на уровне ядра.

GPIO

В прошлой статье, я вкратце рассказал, как работать с gpio из user-space на уровне терминала. Однако, большинство разработчиков потенциально будет пользоваться нативным API для GPIO — ну не всерьез же им парсить вывод состояния в консоль? Поэтому я решил написать крошечную библиотеку для работы с GPIO, такую же простую, как и DigitalWrite/DigitalRead!

Давайте сначала разберемся, как именно работать с драйвером GPIO. Для этого открываем исходники ядра и смотрим внимательно, что нам предлагает драйвер: в нашем случае, это вызовы IOCTL, да еще и простые и понятные. Это просто отлично! Я написал single-header библиотеку минут за 10: без проверки ошибок, но работоспособная.

void gpioInit();

void gpioSetDir(int num, byte dir);

byte gpioGetDir(int num);

void gpioWrite(int num, byte value);

byte gpioGetState(int num); byte gpioRead(int num);

void gpioSetPullState(int num, byte enabled, byte up);



Пример использования (141 — крайний пин на гребенке):

#define GPIO_IMPL

#include "gpio.h"

#include <stdio.h>

void testPin(int pin)

{

printf("Pin state %i is %i\n", pin, gpioGetState(pin));

gpioSetDir(pin, 1);

gpioWrite(pin, 0);

printf("Pin state %i is %i\n", pin, gpioGetState(pin));

gpioWrite(pin, 1);

printf("Pin state %i is %i\n", pin, gpioGetState(pin));

}

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

gpioInit();

testPin(141);

}

Мы сделали вам плату, а дальше вы сами: Доводим дешевый одноплатник за "косарь" до ума! Гаджеты, Смартфон, Программирование, IT, Orange Pi, Одноплатный компьютер, Linux, Android, Raspberry pi, Минипк, Дешево, Покупка, Моддинг, Своими руками, Embedded, Длиннопост, Авторская неделя на Пикабу



Модем

Скажу сразу: пока что завести модем мне не удалось, но я активно работаю над этим. В этой части статьи я распишу свои находки и догадки касательно модемов на чипах MediaTek.

В устройствах MediaTek, драйвер для общения с GPS, A-GPS и модемом один — ccci, судя по всему cross chip communication interface. Именно ccci создает устройства, с в которые поступает вход с микрофона и выход на динамики, а также он создает управляющие интерфейсы для общения с различными модулями этого SoC.

При старте ядра, ccci создаёт много устройств — ccci_ioctl, ccci_ipc, ccci_fs и самое нужное нам —ttyC0/ttyC1/ttyC2— в зависимости от количества СИМ-карт в системе. Кроме ccci, в системе есть некий 6620_launcher — бинарник, который загружает прошивку Wi-Fi и gsm0710muxd — специальный сервис, который позволяет в GPRS-сетях одновременно разговаривать и сидеть в интернете.

На смартфонах MTK есть factory mode — так называемый тестовый режим, который гоняют на заводах. Вы, вероятно, когда-то видели китайские меню похожее на рекавери — это и есть factory mode. Из этого режима можно дозвонится в 911 и активировать модем без запуска Android и RIL. Как это работает? Идём читать исходники ядра!

В factory-режиме, для каждого теста, программа активирует модем заново. Для этого есть функции тестового режима для работы с AT-командами и для инициализации модема. Сначала, она открывает терминал /dev/ttyC0 — именно там происходит общение с модемом с помощью AT-команд:

Мы сделали вам плату, а дальше вы сами: Доводим дешевый одноплатник за "косарь" до ума! Гаджеты, Смартфон, Программирование, IT, Orange Pi, Одноплатный компьютер, Linux, Android, Raspberry pi, Минипк, Дешево, Покупка, Моддинг, Своими руками, Embedded, Длиннопост, Авторская неделя на Пикабу



После этого, программа выводит модем из режима сна с помощью команды «AT+ESLP=0», инициализирует СИМ-карту с помощью команды «AT+ESIMS» и задает режим работы с помощью «AT+EFUN=1» и «AT+CREG=1». После этого, модем начинает искать сеть и доступен для обычного общения с помощью AT-команд. Однако, написав тестовую софтину для общения с модемом из под Debian, я получал ошибки вида Device not found. Почему? Пока не знаю. Однако я продолжаю изучать данный вопрос!

Заключение

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

К счастью, довести гаджет до ума мы смогли своими силами. Весьма странно, что такой крупный и уважаемый производитель как Orange Pi, банально решил «забить» на поддержку собственного устройства. И я лично считаю, что не стоит закидывать в долгий ящик их тем читателям, которые купили когда-то себе подобный девайс и забили, смирившись с отсутствием гайдов.

Немного энтузиазма, опыта и видения будущего проекта — и все получится :)

Показать полностью 11
[моё] Гаджеты Смартфон Программирование IT Orange Pi Одноплатный компьютер Linux Android Raspberry pi Минипк Дешево Покупка Моддинг Своими руками Embedded Длиннопост Авторская неделя на Пикабу
149
1834
monobogdan
monobogdan
1 год назад
TECHNO BROTHER

Одноплатный компьютер с 3G «за косарь». Что Orange Pi предлагает по цене ящика пива?⁠⁠

Одноплатный компьютер с 3G «за косарь». Что Orange Pi предлагает по цене ящика пива? Гаджеты, Покупка, Сборка компьютера, Одноплатный компьютер, Android, Arm, Linux, Девайс, Минипк, Компьютер, Nix, Embedded, Длиннопост



Каждый год выпускается с десяток новых моделей одноплатных компьютеров. Свежие девайсы представляют как старые и уважаемые фирмы по типу Raspberry Pi, Orange Pi или Banana Pi, так и относительные новички на рынке — Repka Pi, или, например, Lctech Pi. Одноплатники работают на достаточно большом парке железа: кто-то использует чипы AllWinner, кто-то Amlogic, кто-то Beoadcom, а кто-то… мобильные! Пару лет назад Orange Pi отличились выпуском нескольких одноплатников на базе чипсетов очень бюджетных мобильников 2013-2015 годов — 2G IoT и 3G IoT. На данный момент, выпуск 3G IoT завершен, а компания предлагает купить абсолютно новый одноплатник с 3G, Bluetooth, Wi-Fi, GPS, поддержкой Linux и Android всего за 1.000 рублей (500 само устройство и 500 доставка). На что оно способно и стоит ли его брать — узнаем в статье!

Что за устройство?

IoT устройство уже прочно закрепились в нашей жизни. Сейчас уже есть возможность приобрести полноценный внешний GSM-модуль за пару сотен рублей, который способен будет выйти в сеть или обрабатывать SM. Однако, в мире одноплатников всё не так просто: большинство из этих устройств использует планшетные чипсеты, которые обычно не обладают встроенными модемами для работы в GSM-сетях. На помощь приходят внешние модули, но чем выше необходимое поколение связи, тем выше цена. И есть 200 рублей за 2G модуль — это совсем немного, то 3G, а тем более LTE модули могут влететь в копеечку. Конечно в мейнлайн дистрибутивах уже есть драйвера на некоторые модемы Huawei, благодаря чему можно просто воткнуть копеечный USB-свисток но это не совсем спортивно.

Одноплатный компьютер с 3G «за косарь». Что Orange Pi предлагает по цене ящика пива? Гаджеты, Покупка, Сборка компьютера, Одноплатный компьютер, Android, Arm, Linux, Девайс, Минипк, Компьютер, Nix, Embedded, Длиннопост



С весьма интересным решением пришла компания Orange Pi. Несколько лет назад они представили весьма занимательное устройство: 2G IoT, которое работало на базе давным-давно забытого мобильного чипсета RDA8810, который является родственником Spreadtrum SC6820 — чипа, который использовался в очень многих китайских ультрабюджетниках 2012-2014 годов. Устройство отличалось весьма неплохими характеристиками за низкий прайс:

  • Процессор: RDA8810, Cortex-A5, 1Ghz.

  • ОЗУ: 256 мегабайт DDR2.

  • ПЗУ: 512 мегабайт NAND памяти + возможность загрузки с MicroSD флэшек.

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

  • Питание: 5в от USB, до 2А нагрузки при работе с сетью, 3.7в от АКБ с встроенным контроллером питания.

  • Звук: Микрофон + встроенный в чипсет ЦАП для вывода звука из системы.

  • Интерфейсы: SPI, I2C, GPIO, UART, Wi-Fi, Bluetooth.

Одноплатный компьютер с 3G «за косарь». Что Orange Pi предлагает по цене ящика пива? Гаджеты, Покупка, Сборка компьютера, Одноплатный компьютер, Android, Arm, Linux, Девайс, Минипк, Компьютер, Nix, Embedded, Длиннопост



Причина низкой цены и хорошего функционала очень проста: Orange Pi просто взяли референсную плату ультрабюджетного смартфона за 1.500-2.000 рублей и развели из нее одноплатник, который затем начали производить. На момент выхода одноплатника, смартфоны на 8810 не производились, так что отпускная цена на чипы была копеечная, в то время как на AllWinner'ы спрос весьма хорош. Год назад они продавались по 700 рублей с учетом доставки, но сейчас их окончательно распродали и найти их можно только на вторичке.

Одноплатный компьютер с 3G «за косарь». Что Orange Pi предлагает по цене ящика пива? Гаджеты, Покупка, Сборка компьютера, Одноплатный компьютер, Android, Arm, Linux, Девайс, Минипк, Компьютер, Nix, Embedded, Длиннопост



3G IoT — следующая ветвь развития IoT линейки OPi, которая на этот раз работает на базе чипсета MediaTek и имеет полноценную поддержку 3G. По сути, возможности остались те же, однако возможности вывода на HDMI до сих пор нет — теперь производитель предлагает LVDS матрицу, опять же, втридорого. Однако схема есть, чисто теоретически есть возможно купить какой-нибудь бюджетник от ZTE/Huawei, найти схему платы и сделать переходник с шлейфа нашей матрицы на коннектор одноплатника. Драйвер матрицы можно взять в исходниках ядра и без изменений перенести. Работает девайс на базе чипа для бюджетных смартфонов, однако теперь в нашем распоряжении целых два ядра!

Одноплатный компьютер с 3G «за косарь». Что Orange Pi предлагает по цене ящика пива? Гаджеты, Покупка, Сборка компьютера, Одноплатный компьютер, Android, Arm, Linux, Девайс, Минипк, Компьютер, Nix, Embedded, Длиннопост



Характеристики девайса такие:

  • Процессор: 2х-ядерный MT6572, Cortex-A7, 1.2Ghz.

  • ОЗУ: 256мб.

  • ПЗУ: 512мб eMMC флэшка от Leahkinn + возможность загрузки с MicroSD.

  • Дисплей: MIPI DSI, LVDS.

  • Питание: 5в, до 2А в пике, 3.7в с контроллером питания.

  • Звук: всё так же, микрофон + ЦАП.

  • Интерфейсы: SPI, I2C, GPIO, UART, Wi-Fi, Bluetooth.



Весьма недурно, согласны? На момент выхода статьи, этот одноплатник можно заказать на всем известном сайте за 1.000 рублей — это с учетом доставки. Идет недели 3, поставляется в фирменной коробочке. Гребенка уже распаяна с завода.

Одноплатный компьютер с 3G «за косарь». Что Orange Pi предлагает по цене ящика пива? Гаджеты, Покупка, Сборка компьютера, Одноплатный компьютер, Android, Arm, Linux, Девайс, Минипк, Компьютер, Nix, Embedded, Длиннопост



Ну что-ж, предлагаю посмотреть, что может предложить нам такой одноплатник и стоит ли его вообще брать?

Накатываем систему

На выбор у нас есть Android и Linux. Учтите, что GSM стек работает только в Android! Теоретически есть возможность связаться с модемом из под Linux, но это требует дальнейшего изучения местного factory-режима. Впрочем, GSM под Android не так уж и плохо — нужное вам поведение, вероятно, можно реализовать в виде службы. Но управлять Android придется только, и только через ADB, если у вас нет дисплея.

Для установки ОС можно использовать как внутреннюю память (только Android, rootfs линукса туда не влезет), так и на MicroSD. Оба способа требуют прошивки eMMC с помощью фирменого флэшера — SP Flash Tool. Суть в том, что выбор варианта загрузки с SD/NAND реализован здесь в виде настройки точки монтирования: ядро так или иначе будет находится на eMMC, но в зависимости от выбранного образа boot, будет загружать систему с соответствующего носителя. Примерно как это реализовано здесь.
Мы будем ставить Linux: качаем SP Flash Tool, выбираем scatter-файл и ставим Format All + Download. Осторожно, форматирование сотрет NVRAM и IMEI, так что лучше сделать бэкапы (хотя их все равно можно легко перебить из системы вручную):

Одноплатный компьютер с 3G «за косарь». Что Orange Pi предлагает по цене ящика пива? Гаджеты, Покупка, Сборка компьютера, Одноплатный компьютер, Android, Arm, Linux, Девайс, Минипк, Компьютер, Nix, Embedded, Длиннопост



На первом проходе, флэшер переразметит внутреннюю память, но ругнется на отсутствующий раздел System. После этого, нужно вернуть режим Download only, снять галку с System и прошить устройство еще раз — после этого, плата будет загружаться с MicroSD:

Одноплатный компьютер с 3G «за косарь». Что Orange Pi предлагает по цене ящика пива? Гаджеты, Покупка, Сборка компьютера, Одноплатный компьютер, Android, Arm, Linux, Девайс, Минипк, Компьютер, Nix, Embedded, Длиннопост



Теперь нужно записать саму систему на флэшку. Образы записываются как обычно — берем флэшку на 4-8гб, вставляем в кард-ридер и записываем образ через Win32DiskImager. Флэшку желательно брать 10-класса, но у меня и «пятерка» работала с адекватной производительностью:

Одноплатный компьютер с 3G «за косарь». Что Orange Pi предлагает по цене ящика пива? Гаджеты, Покупка, Сборка компьютера, Одноплатный компьютер, Android, Arm, Linux, Девайс, Минипк, Компьютер, Nix, Embedded, Длиннопост



После записи, вставляем флэшку в устройство и запитываем его. Возможны варианты питания как напрямую от БП, так и от аккумулятора — в таком случае, при подключении БП, контроллер питания будет заряжать аккумулятор, а за статусом зарядки можно следить через устройство battery в /sys/class/power_supply/ (и в Linux, и в Android).

Для общения с системой через консоль, нам понадобится UART-преобразователь. Я для этого использую плату ESP32-WROOM с выпаянным чипом ESP32. Подтыкиваемся (или подпаиваемся) к UART'у, запускаем putty, ставим бодрейт 115200 и вперед наблюдать за консолью!

Одноплатный компьютер с 3G «за косарь». Что Orange Pi предлагает по цене ящика пива? Гаджеты, Покупка, Сборка компьютера, Одноплатный компьютер, Android, Arm, Linux, Девайс, Минипк, Компьютер, Nix, Embedded, Длиннопост
Одноплатный компьютер с 3G «за косарь». Что Orange Pi предлагает по цене ящика пива? Гаджеты, Покупка, Сборка компьютера, Одноплатный компьютер, Android, Arm, Linux, Девайс, Минипк, Компьютер, Nix, Embedded, Длиннопост



Настраиваем Linux

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

Итак, система запустилась и требует логин, а кроме этого — сыпет логами в UART. Стандартный логин — root, пароль orangepi, лучше смените пароль сразу. Надоели логи? Пишем:

dmesg -n 1

Одноплатный компьютер с 3G «за косарь». Что Orange Pi предлагает по цене ящика пива? Гаджеты, Покупка, Сборка компьютера, Одноплатный компьютер, Android, Arm, Linux, Девайс, Минипк, Компьютер, Nix, Embedded, Длиннопост



Можно сразу записать эту команду в rc.local, если не хотите после каждого ребута писать команду по новой.

После этого, нам нужно настроить Wi-Fi. В системе предустановлен wpa_supplicant, поэтому для подключения мы идем в /etc/network/ и редактируем с помощью nano файл interfaces:

nano interfaces

... Дописываем

auto wlan0

iface wlan0 inet dhcp

wpa-ssid "Имя вашей сети"

wpa-psk "Пароль вашей сети"

Жмем Ctrl + X, сохраняем и перезапускаем сервис networking service networking restart Возникли проблемы? wpa_supplicant жалуется на существующий контекст? Удаляем wpa_supplicant из /run/, если все равно не работает - отправляем систему в ребут, должно заработать.



Имейте ввиду: плата без проблем питается от стандартных 5В/0.5А USB-порта ПК, но если подключить к ней USB-устройство во время работы — то плата начнет уходить в ребут при попытке поднять Wi-Fi, даже если вытащить флэшку. Лечится легко: обесточиваем плату, затем включаем снова.

Одноплатный компьютер с 3G «за косарь». Что Orange Pi предлагает по цене ящика пива? Гаджеты, Покупка, Сборка компьютера, Одноплатный компьютер, Android, Arm, Linux, Девайс, Минипк, Компьютер, Nix, Embedded, Длиннопост



Подключиться можно хоть к точке Wi-Fi от вашего смартфона, дабы объединить их в локальную сеть. Тогда с помощью VNC можно будет вывести изображение с одноплатника на экран разбитого сяоми — чем не применение старому гаджету? Пингуем гугл, сеть есть — отлично!

Теперь ставим icewm из репозиториев, tightvnc и пошло поехало… ан нет! Debian Stretch уже выкинули из официальных репозиториев, перенеся его в архив. Пользовались старыми версиями убунты/дебиана? Тогда следующая операция для вас будет знакома:


nano /etc/apt/sources.list

...

Меняем ftp2.cn.debian.org на archive.debian.org во всех строках. Ctrl + X, сохраняем.

Пишеv apt-get update. Ждём обновления списка пакетов.

Одноплатный компьютер с 3G «за косарь». Что Orange Pi предлагает по цене ящика пива? Гаджеты, Покупка, Сборка компьютера, Одноплатный компьютер, Android, Arm, Linux, Девайс, Минипк, Компьютер, Nix, Embedded, Длиннопост



Теперь мы можем ставить официальные бинарные пакеты из репозиториев. Нам доступна куча софта, в том числе с более старших Raspberry Pi и Orange Pi — ABI то одно! Можно поставить TightVNCServer, запустить его и без проблем подключиться к нашей машинке (5900 — базовый порт, 5901 — будет для первого дисплея и.т.п).

Одноплатный компьютер с 3G «за косарь». Что Orange Pi предлагает по цене ящика пива? Гаджеты, Покупка, Сборка компьютера, Одноплатный компьютер, Android, Arm, Linux, Девайс, Минипк, Компьютер, Nix, Embedded, Длиннопост



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

Одноплатный компьютер с 3G «за косарь». Что Orange Pi предлагает по цене ящика пива? Гаджеты, Покупка, Сборка компьютера, Одноплатный компьютер, Android, Arm, Linux, Девайс, Минипк, Компьютер, Nix, Embedded, Длиннопост



GPIO

У устройства есть гребенка с 40 пинами, часть из которых мы без проблем можем использовать для наших целей. Друзья, если вы уже имели опыт с другими одноплатниками, то знаете что для Broadcom/AllWiiner и других иных чипсетов уже есть готовые библиотеки для работы с GPIO. Под MediaTek их нет, но ничего сложного в работе с ними из user-space нет. Рассмотрим схему подробнее и два способа работы с ними:

Одноплатный компьютер с 3G «за косарь». Что Orange Pi предлагает по цене ящика пива? Гаджеты, Покупка, Сборка компьютера, Одноплатный компьютер, Android, Arm, Linux, Девайс, Минипк, Компьютер, Nix, Embedded, Длиннопост



Первый из официального мануала, подразумевает чтение и запись в специальное виртуальное устройство — mt_gpio, а вернее — в его дебаг-режим. В него можно писать хоть из shell-скрипта при желании. Виртуальное устройство расположено по пути/sys/devices/virtual/misc/mtgpio/pin. Если просто начать читать из него, то мы получим список всех пинов и их состояние:



PIN: [MODE] [PULL_SEL] [DIN] [DOUT] [PULL EN] [DIR] [INV] [IES]
0:1000000-1
1:1000000-1
...

Чтобы записать состояние, нам нужно послать специальную строку:

echo -wdout<номер пина> > 1/0

Чтобы выбрать направление пина, нам нужно послать:

echo -wdir<номер пина> > 1/0, где 0 - вход

Чтобы получить состояние пина, нужно прочитать все строки устройство pin и потом распарсить, например, с sscanf (хотя поскольку одно поле — один char, можно взять абсолютное смещение от начала строки). Если читаем — то 3 столбец после двоеточия будет состоянием нашего пина. Я уже все проверил, все точно работает без каких либо проблем, главное не забывайте за режим GPIO :)

Одноплатный компьютер с 3G «за косарь». Что Orange Pi предлагает по цене ящика пива? Гаджеты, Покупка, Сборка компьютера, Одноплатный компьютер, Android, Arm, Linux, Девайс, Минипк, Компьютер, Nix, Embedded, Длиннопост



Пожалуйста, согласовывайте уровни! GPIO у MT6572 имеют лог. уровень 1.6в. Часть периферии чипсета работает на стандартных 3.3в.
Как это работает? См.в исходниках ядра.

Такой способ подойдет для приложений, где не требуется сильно высокая скорость работы. Для шелл-скриптов или даже полноценных нативных приложений таким методом можно управлять пинами без проблем — если вы конечно не реализовываете SPI софтварно :)

Есть и второй способ — использовать mt-gpio напрямую через вызов ioctl. Я этот режим пока еще не пробовал, но он гораздо быстрее — для юзерспейса самое то, а работать с ним довольно легко. См. исходники драйвера здесь.

UART

Это второй способ коммуникации с внешним миром, доступный из коробки. На устройстве целых два канала UART, которые могут работать как минимум со скоростью 921600б/с (или 115200 килобайт в секунду). лучше всего использовать эту шину для общения с другими микроконтроллерами или ПК.

Одноплатный компьютер с 3G «за косарь». Что Orange Pi предлагает по цене ящика пива? Гаджеты, Покупка, Сборка компьютера, Одноплатный компьютер, Android, Arm, Linux, Девайс, Минипк, Компьютер, Nix, Embedded, Длиннопост



Получить доступ к UART можно благодаря соответствующему character-устройству /dev/ttyMTxx. При стандартных настройках (921600б/с), можно без проблем работать с UART из shell-скриптов, как с самым обычным терминалом: echo для записи, cat — для чтения. Из нативных программ, есть такая же возможность открыть ttyMT и читать/писать при стандартных настройках, а если конфигурацию необходимо изменить, то на помощь приходит termios.

SPI/I2C

А вот тут уже все гораздо интереснее. Как известно, в Linux драйвера шин делятся на два типа: kernel-mode, для работы с драйвером SPI/I2C из других драйверов (например, драйвер камеры хочет получить информацию о модуле через i2c) и user-space i2c-dev/spi-dev. Последние два есть из коробки в большинстве дистрибутивов для «взрослых» одноплатников, но их забыли включить в текущий релиз ядра 3G IoT. Почему? Не ясно — драйвера для i2c и spi у MediaTek точно есть.

На гребенке есть один I2C и один SPI. Исходники ядра для платы можно найти на гитхабе OrangePi. Чуть позже надо будет попробоваать скомпилировать i2cdev и spidev в виде отдельных модулей ядра, которые можно будет загрузить через modprobe.

Я хочу бэйр-метал, а не эти ваши линуксы!!!

И такая возможность есть, но лишь частично. Orange Pi открыли исходники вторичного загрузчика MediaTek — lk (альтернатива u-boot) или Little Kernel. При некоторой модификации логики lk, можно реализовать свою прошивку используя почти всю мощь чипсета. За этим — сюда.

Для чего он еще может пригодится?

Давайте смотреть сами. У нас есть полноценный десктопный Linux, есть Android, есть 2 неплохих ARMv7 ядра, работающих на частоте 1.2ггц, есть 256 мегабайт ОЗУ. Чем он может еще пригодится:

  • Сервер: Нет, речь конечно же не о NAS. Однако поднять простенькую домашнюю страницу, или попытаться реализовать на нем умный дом можно вполне.

  • Сбор информации с датчиков: В паре с микроконтроллером, на таком устройстве можно собирать, обрабатывать и хранить довольно большое количество данных с высокой скоростью опроса.

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

  • Хитрая и дешевая сигнализация с GPS: В целом, для сигнализации такую плату можно рассматривать как System On Module: сразу и линух есть, и GPS из коробки, и 3G. Выйдет дешевле, чем купить отдельно GPS, ESP32 и 3G модуль.



В целом, можно найти еще кучу всяких разных применений данной плате в embedded.

Схема платы доступна здесь:drive.google.com/drive/folders/19R66eFtCDVDVGs7P_WTTBaHTfshnIIqK

Заключение

Я считаю, что подобных ультрадешевых плат должно быть гораздо больше на рынке, ведь не все готовы платить несколько тысяч рублей за одноплатники. Однако, такие решения не подойдут для тех людей, которые хотят «купить и чтобы работало, с кучей гайдов» — у таких плат банально околонулевая поддержка. Да, Orange Pi уважаемая компания, они предоставляют полный исходный код не только ядра, но и загрузчиков — чего они делать не обязаны были, но по сути они просто произвели на свет эту плату, а разбираться в ней придется конечному пользователю. Без мануалов, без гайдов.

Одноплатный компьютер с 3G «за косарь». Что Orange Pi предлагает по цене ящика пива? Гаджеты, Покупка, Сборка компьютера, Одноплатный компьютер, Android, Arm, Linux, Девайс, Минипк, Компьютер, Nix, Embedded, Длиннопост



Стоит ли такую себе брать? Я лично не пожалел :) Плата очень перспективная, а ковыряться в исходниках ядра я люблю. Попробую сделать из неё что-то полезное!

Показать полностью 19
[моё] Гаджеты Покупка Сборка компьютера Одноплатный компьютер Android Arm Linux Девайс Минипк Компьютер Nix Embedded Длиннопост
270
Блог компании Партнёрский материал Реклама
practicum.yandex
practicum.yandex
16 дней назад

Python, 1С, тестирование и еще один курс для тех, кто хочет стартовать в IT⁠⁠

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

Python, 1С, тестирование и еще один курс для тех, кто хочет стартовать в IT IT, Онлайн-курсы, Программист, Программирование, Обучение, Длиннопост, Блоги компаний

Тестировщик

Сколько учиться: 5 месяцев

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

На курсе вы изучите 12 инструментов, которые потребуются в работе. Например, Python и язык запросов SQL, графический редактор Figma и инструмент для тестирования API Postman. К концу обучения у вас в портфолио будет семь проектов.

Первый модуль можно пройти бесплатно — поймете, подходит ли вам это направление.

Начать учиться бесплатно>>


Разработчик 1С

Сколько учиться: есть базовый курс на 6 месяцев и расширенный — на 8.

1С — язык программирования для работы с продуктами одноименной компании. Он помогает автоматизировать бизнес-процессы и разрабатывать бизнес-ориентированные приложения. В России с 1С работают и большинство компаний, как небольших, так и крупных.

За полгода вы научитесь работать с платформой и писать код на языке 1С, поработаете с отчетами и системой компоновки данных, научитесь создавать механизмы бухгалтерского учета. Вас ждет девять итоговых работ и выпускной проект.

Начать учиться бесплатно>>


Python-разработчик буткемп

Сколько учиться: 4 месяца

Курс включает восемь блоков. Первый и второй — знакомство с Python, остальные — более глубокое погружение в тему. Например, бэкенд на Django, изучение алгоритмов и структуры данных, разбор асинхронностей и нюансов работы с Flask.

Формат буткемп — это интенсивное обучение. Нагрузка в неделю составит около 30 часов, вы можете рассчитывать на поддержку наставников.

Начать учиться бесплатно>>


Системный администратор

Сколько учиться: 6 месяцев

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

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

Начать учиться бесплатно>>


Чем интенсивнее курс, тем быстрее начинается этап поиска работы. В нашем Карьерном центре мы поддерживаем студентов: помогаем оформлять резюме и портфолио, проходить собеседования, предлагаем вакансии и стажировки от 4000+ партнеров. Стартуйте в IT уверенно!

Реклама ООО «Яндекс», ИНН: 7736207543

Показать полностью
IT Онлайн-курсы Программист Программирование Обучение Длиннопост Блоги компаний
18
11
Redfern89
Redfern89
2 года назад

Сборка Kali Linux для Orange PI PC (armhf)⁠⁠

Доброго времени суток!
Это краткая инструкция о том, как собрать Kali Linux (можно и любой другой дистрибутив) для Orange PI PC.

Небольшое отступление. Я все действия производил на виртуальной машине, ибо мне было так удобно. Виртуальная машина с Kali Linux на VM Ware. Если Вам будет удобно это делать из домашней ОС (Linux, разумеется) - Вам никто не запрещает, можно и так.. У меня домашняя ОС - это Windows 10. Кстати на системе с ядром версии 6.0.0 у меня на отрез отказывался монтироваться образ системы Armbian с ошибкой суперблока. Так-же при записи загрузчика (u-boot) на образ новой системы - образ в дальнейшем тоже отказывался монтироваться. На ядре 5.18.1 таких проблем обнаружено не было. Так-же крайне желательно обладать хотя-бы скудными познаниями в linux-командах, что-бы потом понять, что и где пошло не так! БЕЗДУМНОЕ КОПИРОВАНИЕ КОМАНД НЕ ПОМОЖЕТ В ДАННОМ СЛУЧАЕ! ЭТО ОЧЕНЬ ВАЖНО!!!

Все авторы, причастные к данному дистрибутиву, администрация форума, а так-же автор данного поста не несут никакой ответственности за ваши противоправные действия и оборудование, примененное в злоумышленных целях! Оценивайте все свои действия в здравом уме! ВЫ ВСЕ ДЕЛАЕТЕ НА СВОЙ СТРАХ И РИСК! Так-же автор данного поста не побуждает Вас и кого-либо еще совершать какие-либо незаконные действия !!! Эта сборка была создана и портированна в ознакомительных и образовательно-научных целях! Несите добро в этот мир!

Подготовка рабочего окружения


# Для сборки необходимо установить несколько важных зависимостей в систему из которой будет производиться сборка

apt install parted dosfstools e2fsprogs debootstrap crossbuild-essential-armhf bison flex libssl-dev bc libncurses5-dev libncursesw5-dev libtool swig python3-setuptools python3-pip crossbuild-essential-arm64 crossbuild-essential-armhf crossbuild-essential-armel gcc-arm-none-eabi u-boot-tools

# Так-же крайне желательно наличие преобразователя USB <> UART для отладки.

Шаг 1. Подготовка образа диска


# Этот этап можно пропустить, если Вы работаете из домашней системы и все необходимые действия можно выполнять на прямую с SD-картой

# Создание образа на 15GB
dd if=/dev/zero of=vhd.img bs=1 count=0 seek=15G

# Создание файловой системы
parted -s vhd.img mklabel msdos
parted -s vhd.img mkpart primary ext4 4MiB 100%
partprobe

# Интерпретируем как блочное устройство
losetup -f vhd.img

# Смотрим, какое название разделу присвоила система
losetup -a
/dev/loop0p1 (/home/kali/dev/vhd.img)

# Форматируем в ext4
mkfs.ext4 -L kali_root /dev/loop0p1

# Монтируем
mkdir /mnt/kali_root && mount /dev/loop0p1 /mnt/kali_root

Шаг 2. Сборка ядра Linux


# Для начала скачиваем последнее ядро с kernel.org

wget "https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.0.8.tar..."

# Распаковываем
tar -xvf linux-6.0.8.tar.xz

# Переходим в папку с ядром
cd linux-6.0.8

# Очищаем
make clean && make distclean && make mrproper

# Нам нужно найти конфигурационный файл от нашей платы (sun8iw7p1_mainline_defconfig) и положить его по пути arch/arm/configs
wget "https://raw.githubusercontent.com/orangepi-xunlong/orangepi_..."
mv sun8iw7p1_mainline_defconfig arch/arm/configs/sun8iw7p1_mainline_defconfig

# Создадим первоначальную конфигурацию ядра с указанием архитектуры и кросс-компилятора
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- sun8iw7p1_mainline_defconfig

# Соберем дерево устройств
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs

# Переходим в конфигурацию
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

(настраиваем все, что нам надо и выходим с сохранением настроек)

# Собираем ядро в 4 потока
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4

# Собираем модули
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules

Шаг 4. Сборка загрузчика u-boot


# Клонируем u-boot последней версии с github

git clone https://github.com/u-boot/u-boot.git

# Переходим в директорию
cd u-boot

# Указываем нашу плату
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- orangepi_pc_defconfig

# Переходим в конфигурацию
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

(настраиваем все, что нам надо и выходим с сохранением настроек)

# Собираем загрузчик в 4 потока
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4

Шаг 5. uInitrd


# Данный шаг самый простой. Образ загрузчика initramfs можно взять из любой подобной операционной системы. Я к примеру взял из armbian

# Что-бы его от туда достать - качаем образ с официального сайта для нашей платы, монтируем образ как диск
mkdir /mnt/armbi_root && mount Armbian_22.08.2_Orangepipc_jammy_current_5.15.69.img /mnt/armbi_root

# Копируем
mkdir /mnt/kali_root/boot && cp /mnt/armbi_root/boot/uInitrd-5.15.69-sunxi /mnt/kali_root/boot/uInitrd-5.15.69-sunxi

# Так-же можем вытянуть boot.cmd и armbianEnv.txt
cp /mnt/armbi_root/boot/boot.cmd /mnt/kali_root/boot/boot.cmd
cp /mnt/armbi_root/boot/armbianEnv.txt /mnt/kali_root/boot/uboot.env

Шаг 6. Подготовка


# Копируем файл ядра в образ

mkdir /mnt/kali_root/boot && cp linux-6.0.8/arch/arm/boot/zImage /mnt/kali_root/boot/linux-6.0.8

# Копируем дерево устройств
mkdir /mnt/kali_root/boot/dtb-6.0.8 && cp linux-6.0.8/arch/arm/boot/dts/*.dtb /mnt/kali_root/boot/dtb-6.0.8

# Узнаем UUID нашего раздела (/dev/loop0p1)
blkid
/dev/loop0p1: LABEL="kali_root" UUID="9facb21c-e5e1-404c-8c46-babbf90af2c9" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="df63022b-01"
/dev/sda1: LABEL="root" UUID="ea15ea92-0b42-4db4-bb97-b4e86a29542a" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="4419f333-0
1"

# Копируем значение 9facb21c-e5e1-404c-8c46-babbf90af2c9 и заменяем его в uboot.env
# В файле boot.cmd меняем все значения с armbianEnv.txt на uboot.env

# Копируем загрузчик в раздел
dd if=u-boot/u-boot-sunxi-with-spl.bin of=/dev/loop0 bs=1024 seek=8

# Переходим в директорию загрузчика
cd /mnt/kali_root/boot

# Соберем boot.scr
mkimage -C none -A arm -T script -d boot.cmd boot.scr

# Создадим симлинки для загрузчика
ln -s uInitrd-5.15.69-sunxi uInitrd
ln -s linux-6.0.8 zImage
ln -s dtb-6.0.8 dtb

Шаг 7. Сборка системы


# Для начала нужно собрать основу для системы, воспользуемся debootstrap с репозиториями kali-rolling и установим qemu-user-static

debootstrap --foreign --include=qemu-user-static --arch armhf kali-rolling /mnt/kali_root http://http.kali.org/kali
chroot /mnt/kali_root /debootstrap/debootstrap --second-stage

# Теперь можно сделать chroot в собранную систему
chroot /mnt/kali_root /bin/bash

# Монтируем /proc
mount -t proc /proc /proc

# Выполним необходимые минимальные настройки
passwd root # Пароль root

adduser <username> # Добавим пользователя
usermod -a -G <username> sudo # Добавим его в группу sudo

# Задаём имя хоста
echo 'kali' > /etc/hostname
sed -i '2 i 127.0.0.1 kali' /etc/hosts

# Создаем автомонтирование в fstab (9facb21c-e5e1-404c-8c46-babbf90af2c9 - меняем на свой UUID)
cat <<EOF > /etc/fstab
UUID=9facb21c-e5e1-404c-8c46-babbf90af2c9 / ext4 defaults,noatime,commit=600,errors=remount-ro 0 1
tmpfs /tmp tmpfs defaults,nosuid 0 0

EOF

# Обновим репозитории
echo 'deb http://http.kali.org/kali kali-rolling main contrib non-free' > /etc/apt/sources.list
apt update

# Ставим пакеты
apt install ca-certificates iw parted sudo wpasupplicant command-not-found fontconfig kali-defaults kali-menu \
kali-tweaks netcat-traditional tmux unrar vim wireless-regdb zsh zsh-autosuggestions \
zsh-syntax-highlighting apt-transport-https dialog ifupdown inxi kali-linux-core \
libnss-systemd man-db mlocate net-tools network-manager pciutils psmisc rfkill screen \
snmp snmpd tftp triggerhappy usbutils whiptail zerofree apache2 atftpd openvpn ssh tightvncserver \
bluelog blueranger bluesnarfer bluez-tools bridge-utils cmake darkstat dnsmasq htop libusb-1.0-0-dev \
locate mailutils pure-ftpd tigervnc-standalone-server wifiphisher kali-linux-default kali-desktop-xfce \
alsa-utils xfonts-terminus xinput xserver-xorg-video-fbdev xserver-xorg-input-libinput ntpdate u-boot-tools \
passing-the-hash winexe aircrack-ng hydra john sqlmap wireshark libnfc-bin mfoc \
abootimg cgpt fake-hwclock

# Выходим из chroot
exit

# Устанавливаем модули ядра
cd linux-6.0.8
make CROSS_COMPILE=arm-linux-gnueabihf- modules_install INSTALL_MOD_PATH=/mnt/kali_root

✔ Получившийся в итоге образ vhd.img - и будет тем самым образом для записи на SD-карточку

Сборка Kali Linux для Orange PI PC (armhf) Kali linux, Arm, Linux, Длиннопост, Одноплатный компьютер, Orange pi
Сборка Kali Linux для Orange PI PC (armhf) Kali linux, Arm, Linux, Длиннопост, Одноплатный компьютер, Orange pi
Сборка Kali Linux для Orange PI PC (armhf) Kali linux, Arm, Linux, Длиннопост, Одноплатный компьютер, Orange pi
У меня все эти манипуляции заняли 5 дней (я просто не особо умный), было много разных ошибок, наступал на кучу разных гребель и ломал их себе об голову, начинал крыть псих, самооценка стремилась к нулю.... Вот кстати - если кто-то возьмется объяснить мне - как собрать образ initramfs - буду дико благодарен. Пока что я его беру из сторонней системы. По поводу ядра. Я может слишком погорячился, взяв версию 6.0.8 (последняя на 13.11.2022) ?
Показать полностью 3
[моё] Kali linux Arm Linux Длиннопост Одноплатный компьютер Orange pi
5
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии