Прыгать надо, а не думать
Кому не интересно читать все эти бла бла бла, вот гайд для получения результата.
Прошу учитывать! Используются мастер ветки - в зависимости от фазы луны и погоды на юпитере может не собраться и придётся допиливать руками!
Собственно гайд
-
Качаем заранее подготовленный репозиторий [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. Если не ставить разъём и не клеить к корпусу, то пятаки оторвутся, проверено лично, перепроверять не рекомендую.
Фото
Загружаем загрузчик
Первым делом нужно загрузить 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]
Ссылки
-
Репозиторий с наработками
-
ДНС Экшн-камера Aceline S-60 серебристый 3999р
https://www.dns-shop.ru/product/30e317183ec13330/eksn-kamera-aceline-s-60-serebristyj/
-
Авито "Aceline s-60"
-
SoC Allwinner V3
-
Sensor OV8865
-
WiFi XR819
-
Репозиторий ktkd
-
XR819 driver
-
Paul Kocialkowski drivers developer for v3 isp, ov8865
-
Stock Android VFE driver sources
https://github.com/allwinner-zh/linux-3.4-sunxi/blob/master/drivers/media/video/sunxi-vfe
-
Allwinner S3 SoC: Accelerated h.264
-
V4L2 camera overview
https://wiki.st.com/stm32mpu/wiki/STM32MP13_V4L2_camera_overview#Camera_subsystem_setup
-
media-ctl (v4l-utils package) examples
-
Media controller pipeline
https://www.linux4sam.org/bin/view/Linux4SAM/MediaController
-
v4l2-bayer repository
-
Early Allwinner CSI & MIPI-CSI2 driver version
Комментарии (11)
NutsUnderline
10.12.2024 07:21судя по фоткам используется стандартный сенсор от камер наблюдения, со сменными объективами, так что при желании можно менять
okhsunrog
10.12.2024 07:21Не пробовали использовать esp-hosted для wifi? Если есть свободный SPI у камня, разведённый на плате - должно заработать и на mainline, оно dkms модулем идёт
NutsUnderline
10.12.2024 07:21так скорее уж sdio есть на котором 819 висит, с виду он паябельный, но это уже будет вещь в себе, а не купленная по дешеману. вот на камерах с OpenIPC есть usb и драйвера из ядра готовые.
WicRus Автор
10.12.2024 07:21Не пробовал, даже не искали ничего подобного. Пытался использовать только то, что уже есть в железе. SPI есть у камня, но плата сделана под целевую железку, лишнего ничего не выведено, уарт есть и то радость.
За ссылку спасибо, почитаю на досуге.
NutsUnderline
Круто, хотя я что то ожидал еще большего прогресса.
Создатели близкого проекта OpenIPC вроде не углубились до аппаратного сжатия видео и используют готовые бинарники и задачу сделать камеру с WiFI (FulHD) они в общем то решили, железо недорогое, плюс есть ethernet и ночной режим.
На оригинальной прошивке mini HDMI умеет выдавать видео в реальном времени (или только запись воиспроизводить) ?
WicRus Автор
Если честно, я тоже ожидал большего прогресса.
Предполагаю стоковую прошивку довести до состояния работы с с OpenIPC, проще чем актуальное ядро.
На оригинальной как я понял на mini-HDMI идёт тоже самое что на LCD экран, а там видео в реальном времени.
NutsUnderline
не думаю. OpenIPC состоит из кучи kmod *.ko которые раcсчитаны на конкретную версию ядра. И кодировщик видео majestic похоже что закрытый и распространяется в бинарниках. Возможно что проще бы использовать ядро OpenIPC, благо что под alwinner v83 и s3l оно уже есть, но вот модуля под сенсор ov8865 что то я не нахожу.
текущий вариант скорее полезен под видом "ставим arch на alwinner s3" (а не только на эту камеру), а вот дальше похоже придется идти своим путем
WicRus Автор
Именно так. Ставим арч, а дальше запускаем периферию. Для прикладных задач можно взять 1106g3 от luckfox, или поискать rv1109/rv1126
okhsunrog
А не знаете, rv1106g3 поддерживается в мэйнлайн? И где вообще такое смотреть? Вот, взял плату от luckfox, хочу попробовать на днях 6.12 собрать
WicRus Автор
Если правильно помню rv1106g3 довольно свежие, шанс не велик.
Смотреть примерно в таком порядке:
Вначале изучить dts/dtsi на rockchip, если там есть примеры, то можно с ними начинать работать.
Дальше поиск по коммитам, искать упоминания rv1106/rv1103.
Последнее место, это поиск в не принятых патчах
NutsUnderline
ага, и модуль камеры к ней подключить, и кодировщик там есть с api, и нейросеточки, зачем v3 - непонятно :) wifi только подрубить надо будет