Прыгать надо, а не думать
Кому не интересно читать все эти бла бла бла, вот гайд для получения результата.
Прошу учитывать! Используются мастер ветки — в зависимости от фазы луны и погоды на юпитере может не собраться и придётся допиливать руками!
Собственно гайд
-
Качаем заранее подготовленный репозиторий [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
ссылка на оригинал статьи https://habr.com/ru/articles/865146/
Добавить комментарий