Ставим Arch c mainline ядром на экшен камеру Aceline S60

от автора

Прыгать надо, а не думать

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

Прошу учитывать! Используются мастер ветки — в зависимости от фазы луны и погоды на юпитере может не собраться и придётся допиливать руками!

Собственно гайд
  • Ставим докер.

  • Качаем заранее подготовленный репозиторий [1].

    git clone https://github.com/WicRus/aceline_s60.git 
  • Осматриваемся, проверяем скрипты, читаем доки, смотрим фотки.

  • Готовим докер контейнер, скачиваем исходники linux, u-boot, драйвер на вафлю, образ арча.

    ./docker_create_container.sh ./docker_prepare.sh 
  • Запускаем контейнер.

    ./docker_bash.sh 
  • Собираем uboot, kernel, dtb.

    ./compile_uboot.sh ./compile_kernel.sh ./compile_dtb.sh 
  • Запускаем сборку образа.

    ./arch-arm-img-create.sh 
  • Если хочется что-то поправить рукам, можно сделать чрут в образ.

    ./arch-arm-img-edit.sh 
  • Записываем на сд-карту через dd или rufus.

    dd if=sdk/binary/ArchLinuxARM-armv7-latest.img of=/dev/sdX bs=1M oflag=dsync status=progress; sync 

Как всё начиналось

Листая уценку ДНСа, наткнулся на экшн камеры с чипами Allwinner V3. Было это несколько лет назад, гугл сказал, что чипы поддерживаются ядром, на них даже есть какие-то отладки, а если есть отладки значит и я смогу запуститься. Кому интересно, эти камеры на декабрь 2024 года есть в продаже в ДНСе [2]. Можно ещё посмотреть на Авито [3].

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

Изучаем Aceline S-60

В камере стоит Allwinner V3 [4], матрица ov8865 [5], XR819 вафля [6]. Операционка простенький андройд. Никакой защиты — всё открыто, прошивка легко дампается/модифицируется, логинит сразу в рут. Всё для людей. Если внимательно смотреть в репозиторий [1], там есть релиз с архивами дампа андройда, файловой системы и даташитами. В самом репозитории лежат различные данные, которые казались наиболее интересными. Вот например, на фото уже видно добавленный разъём для uart. Если не ставить разъём и не клеить к корпусу, то пятаки оторвутся, проверено лично, перепроверять не рекомендую.

Фото
top

top
bot

bot
debug bot

debug bot
debug side

debug side

Загружаем загрузчик

Первым делом нужно загрузить u-boot. Сколько же времени я потратил на это. Был готовый пример под V3 проц, всё делал вроде бы правильно, но консоль упорно молчала. Как я только не менял конфиг, чего только не пытался добавить в конфигурацию памяти, всё было без толку. Я бросил это дело на несколько месяцев. Мораль просто закончилась.

А ответ оказался рядом, хоть и далеко. Спасибо автору вот этой репы [7]. Только тогда я понял, что был просто выбран не тот уарт. Кто же мог про такое подумать. По хорошему нужно было сразу поднять проц, прозвонить все линии и много бы вопросов сразу отпало. Ни опыта, ни оборудки у меня под это дело не было, да и жалко было испортить такую игрушку.

Запускаем ядро

Следующий шаг запустить ядро. Я сделал бут раздел, положил туда ядро, собранное с арчевским конфигом, докинул dtb, собранную на базе какого-то примера, что лежал в мэйнлайне линукса, написал простенький extlinux.conf и стал запускать. Ядро записывалось поверх dtb. Дефолтные настройки uboot не ожидали, что я буду пихать им такое огромное ядро. Не стал пытаться урезать ядро, просто делал загрузку и запуск ядра+dtb руками и пытался заставить ядро запуститься. А ядро не запускалось, ему и так было хорошо.

Пришлось применить классический метод отладки, на плате JTAG-ом даже не пахло и в ход пошёл отладочный вывод в консоль. Удалось выяснить, что при отключении(включении?) какой-то безопасности uboot повисал в ассемблерном коде и не выходил оттуда. А следующий шаг был уже запуск ядра. Перенёс строчку запуска ядра и вуаля всё заработало, точнее запуск ядра. Но править исходники не комильфо, особенно если можно не править. Немного покопавшись удалось обойтись доп строчкой в конфиге CONFIG_ARMV7_BOOT_SEC_DEFAULT=y

Для mainline ядра — mainline дистрибутив

Хочется пошутить про Gentoo, но обойдемся и Arch linux. Сколько я промучился со сборкой и конфигурацией образа. Вначале я запускал его через qemu-arm. Ах да, я даже ядро и uboot собирал в виртуалке, это был путь страдания. Производительность была на высоте, ядро собиралось час. Победить кросс компилятор оказалось проблемой. Неправильный кросс компилятор не компилит, правильный компилит. Правильным оказался gcc-linaro-13.0.0-2022.11-x86_64_arm-linux-gnueabihf.tar.xz.

После победы над компилятором была и победа над chroot. Оказалось, что можно скопировать qemu-arm-static и сделать chroot в арм rootfs. И дальше можно спокойно обновить ключи и поставить все необходимые пакеты.

WiFi всему голова

Без сети очень уныло, хотя порой и не очевидно, но это до первого перебоя с интернетом. Когда купил камеру радовался, что в ней есть wifi. Это было зря. Чип в ней стоит, как бы помягче сказать, не самый лучший. XR819 [6] клон cw1200, но драйвер из мэйнлайна к нему не подходит. Он требует самосборный драйвер [8] и ещё бинарники для запуска. Мне не повезло с драйвером, он сломался на новых версиях ядра. Я не разобрался, что с ним не так и плюнул — пошёл пытаться получить видео поток.

На старом ядре, надо сказать, работала сеть ужасно, потери пакетов, плохая скорость, через ssh работать было невозможно. А я то рассчитывал сделать онлайн трансляцию через wifi. Со временем драйвер починили для актуальной версии ядра. Пару раз я сам актуализировал драйвер, но чисто по мелочи. Надо сказать, wifi неплохо справляется с задачей поставить пакеты и принять/передать файл по ssh.

Попытки получить картинку

Отдельная благодарность разработчику всех видео драйверов для данного семейства чипов Allwinner V3/V3s/S3 Paul Kocialkowski [9]. На базе именно его dts-ок и патчей в ядро я разбирался что и как нужно делать, чтобы получить картинку. Но часть патчей так и остались не приняты в актуальную ветку ядра. Их приходится накатывать поверх репозитория патчами.

Первый заход на получение картинки оказался максимально неудачным. Не было понимания, что и почему не работает. На втором заходе опять ядро поссорилось с dtb и uboot отказался загружать систему. Терпеть это было решительно невозможно, пришлось в конфиг добавить маленький костыль CONFIG_PREBOOT="setenv fdt_addr_r 0x41900000". При внимательном изучении конфига ядра выяснилось, что ещё неплохо бы собирать драйвера, которые описаны в dts-ке. И v4l2 pipeline тоже нужно собирать руками, перед тем как получать кадр:

Примерно так
# config v4l2 pipeline media-ctl -d /dev/media0 --set-v4l2 "'ov8865 1-006c':0[fmt:SBGGR10_1X10/800x600@1/30 field:none]" media-ctl -d /dev/media0 --set-v4l2 "'sun6i-mipi-csi2':0[fmt:SBGGR10_1X10/800x600]" media-ctl -d /dev/media0 --set-v4l2 "'sun6i-mipi-csi2':1[fmt:SBGGR10_1X10/800x600]" media-ctl -d /dev/media0 --set-v4l2 "'sun6i-csi-bridge':0[fmt:SBGGR10_1X10/800x600]" media-ctl -d /dev/media0 --set-v4l2 "'sun6i-csi-bridge':1[fmt:SBGGR10_1X10/800x600]"  # config capture devices v4l2-ctl -d /dev/video0 --set-fmt-video width=800,height=600,pixelformat=BG10 v4l2-ctl -d /dev/video1 --set-fmt-video width=800,height=600  # connect pipeline media-ctl -l "'ov8865 1-006c':0 -> 'sun6i-mipi-csi2':0[1]" media-ctl -l "'sun6i-mipi-csi2':1 -> 'sun6i-csi-bridge':0[1]" media-ctl -l "'sun6i-csi-bridge':1 -> 'sun6i-csi-capture':0[1]" media-ctl -l "'sun6i-csi-bridge':1 -> 'sun6i-isp-proc':0[1]" media-ctl -l "'sun6i-isp-params':0 -> 'sun6i-isp-proc':1[1]" media-ctl -l "'sun6i-isp-proc':2 -> 'sun6i-isp-capture':0[1]" # get raw frame v4l2-ctl -d /dev/video0 --stream-mmap --stream-to=AAA.raw --stream-count=1 

А вот дальше вышел затык. Отвечать по i2c матрица никак не хотела, пробовал оба возможных адреса. Команды на запись проходили успешно, а на чтение возвращалась ошибка. Похоже или матрица висит в сбросе, или не поданы питания/разрешающие сигналы. По хорошему лезть в железо, сравнивать работу с андройдом и пытаться искать что же такого делает хитрый зелёный робот. Даже удалось найти исходники [10], из которых возможно было собрано ядро стоковой прошивки. Все вопросы вели к тому, что нужно ковырять железо, а для этого нужен ещё хотя бы один комплект.

Что ещё можно сделать

На этом этапе я решил систематизировать все наработки и поделиться ими. Возможно кому-то ещё будет интересно покопаться с подобным железом. У меня пока пауза до появления железа, которое не жалко сжечь. Без железа можно лишь попытаться сделать pull request и закоммитить наработки в исходные репозитории.

А вообще на железке ещё есть чем заняться:

  • Запустить работу матрицы

  • Запустить работу ISP, вроде он работает, но по словам автора там только демозаик реализован

  • Реализовать оставшиеся алгоритмы ISP

  • Запустить аппаратный h264 кодировщик

  • Запустить LCD дисплей

  • Запустить mini HDMI порт

  • Запустить звук

  • Для упрощения отладки сконфигурировать usb и запустить adbd

Послесловие

Цель была сделать камеру наблюдения, которая по wifi транслирует на стриминг картинку. Финальный результат не достигнут, а значит выводов не будет. Остаётся лишь немного рассказать про репозиторий и привести оставшиеся ссылки.

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

  • Если кто найдёт управление частотой процессора, оно даже работало. Только смысла в этом не было, попытки снизить напряжение сразу ломает систему.

  • Кнопки описаны в dts-ке, но не проверялись. Сейчас даже не вспомню, когда и зачем это делал.

  • У арча в игнор добавлены linux-firmware linux-armv7, на работу не влияет, а сборку образа сильно ускоряет.

  • Удалено содержание пакета linux-firmware и модули стокового ядра, были проблемы с нехваткой места.

  • Использование аппаратного кодера [11]

  • Описание работы с v4l2 pipeline [12] [13] [14]

  • Ранние реализации CSI, MIPI-CSI2, ISP [15] [16]

Ссылки

  1. Репозиторий с наработками

    https://github.com/WicRus/aceline_s60

  1. ДНС Экшн-камера Aceline S-60 серебристый 3999р

    https://www.dns-shop.ru/product/30e317183ec13330/eksn-kamera-aceline-s-60-serebristyj/

  1. Авито «Aceline s-60»

    https://www.avito.ru/?q=Aceline+S-60

  1. SoC Allwinner V3

    https://linux-sunxi.org/V3

  1. Sensor OV8865

    https://www.ovt.com/products/ov8865/

  1. WiFi XR819

    https://linux-sunxi.org/Wifi

  1. Репозиторий ktkd

    https://github.com/ktkd/u-boot-v3-camera

  1. XR819 driver

    https://github.com/fifteenhex/xradio.git

  1. Paul Kocialkowski drivers developer for v3 isp, ov8865

    https://bootlin.com/blog/author/paul/

  1. Stock Android VFE driver sources

    https://github.com/allwinner-zh/linux-3.4-sunxi/blob/master/drivers/media/video/sunxi-vfe

  1. Allwinner S3 SoC: Accelerated h.264

    https://gregdavill.com/posts/allwinner-s3-videoencoders/

  1. V4L2 camera overview

    https://wiki.st.com/stm32mpu/wiki/STM32MP13_V4L2_camera_overview#Camera_subsystem_setup

  1. media-ctl (v4l-utils package) examples

    https://trac.gateworks.com/wiki/linux/media

  1. Media controller pipeline

    https://www.linux4sam.org/bin/view/Linux4SAM/MediaController

  1. v4l2-bayer repository

    https://github.com/paulkocialkowski/v4l2-bayer

  1. Early Allwinner CSI & MIPI-CSI2 driver version

    https://github.com/aodzip/sun6i-mipi-csi


ссылка на оригинал статьи https://habr.com/ru/articles/865146/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *