Мы открыли загрузочное ПЗУ Novatek, и кирпич оживает по сети
opennovatek — новый репозиторий:
встроенное в кристалл ПЗУ NT9856x восстановлено как читаемый код на C и
ассемблере ARM. Восстановлено начисто — сам образ ПЗУ в репозиторий не кладут.
Каждый снимает его со своей камеры, а в MANIFEST записан хеш, которому дамп
обязан соответствовать.
Зачем это нужно: именно ПЗУ решает, откуда камера возьмёт загрузчик, если флеш убит, — из SPI, с карты, из сети, по USB или по UART, в каком порядке и что проверит перед запуском. Из этого описания выросли и наш defib, и модель ПЗУ в qemu-bench.
Результат: плату NT9856x с убитым флешем поднимают через Ethernet, а не паяльником к UART. Попутно нашлось, почему это не работало раньше: ПЗУ и загрузчик Novatek не переспрашивают потерянные по TFTP блоки, так что переспрашивать стал defib.
Камеры Xiongmai из «загружается» превратились в нормальные камеры
Неделю назад мы написали для XM510 открытый тракт обработки картинки, и теперь на нём поехало всё остальное. На XM510, XM530 и XM550 вживую крутятся контраст, оттенок, насыщенность, яркость, зеркало и переворот; работает детектор движения и детектор саботажа — когда камеру заслонили или развернули; подавление полос от ламп дошло до автоэкспозиции; заводской кодировщик начал слушаться наших настроек битрейта, режима, частоты кадров, интервала опорных кадров, профиля и качества.
Появился «умный» режим опорных кадров, второй поток научился следовать
заданному размеру, а в /metrics видно, с какой частотой реально захватывается
картинка и сколько кадров потерял кодировщик.
Камера смотрит на электросчётчик и понимает, сколько ест ваш чайник
У счётчиков есть лампочка, которая мигает строго определённое число раз на киловатт-час: при 3200 импульсах это 0,3125 Вт·ч на вспышку. Значит, промежуток между вспышками — это и есть текущая мощность. Камера считает их и выдаёт потребление посекундно, с точностью 0,35% в диапазоне от 60 Вт до 6 кВт.
Попутно это чинит давнюю беду. По одним барабанам мощность не вытащить: они переключаются по 0,1 кВт·ч, а последняя цифра, застрявшая между делениями, читается как попало. На лабораторном счётчике её 8,7 распознавалось то как 0, то как 2, 6, 7 или 8 — примерно по трети случаев на каждую, — и показание двадцать минут стояло на .3, пока счётчик дошёл до .8. Теперь между щелчками барабана показание добирается вспышками.
Самое изящное тут — что это ничего не стоит. Камера не разбирает кадры ради лампочки: она читает статистику автоэкспозиции, которую ISP и так усредняет по зонам каждый кадр, просто для собственной работы. Вспышка — это когда зона с лампочкой и восемь соседних подскочили на десятую и вернулись в пределах секунды, а шестнадцать зон вокруг них, то есть комната, шевельнулись втрое меньше. Последнее условие и отсекает «кто-то включил свет».
Мобильная радиосеть из дешёвых роутеров и Wi-Fi-карточек
Обычный Wi-Fi устроен так: передают все, кто хочет, а побеждает тот, кто успел первым. На краю соты, где устройство слышит сразу две точки доступа, они мешают друг другу — именно там, где робот или дрон этого меньше всего может себе позволить. А когда устройство переходит от одной точки к следующей, связь пропадает больше чем на десятую долю секунды: просканировать эфир, заново подключиться, заново поймать время. Для живого видео это замёрзшая картинка.
Мы хотим раздавать эфир по расписанию, как это делает мобильная сеть: каждому устройству свой слот, а кому какой — решает точка доступа. Сначала надо было понять, способны ли на такое дешёвые карточки Realtek. Этой осенью мы закончили замеры: способны. Карточка умеет привязать свой маячок к заданному моменту, не сбив при этом собственные часы, сообщить, когда кадр на самом деле ушёл в антенну, ответить подтверждением на уровне железа и быстро переключить частоту. На 8821CE одна точка доступа подтянула свой маячок к точному времени, которое пришло по Ethernet, с расхождением 0,67 микросекунды.
Это основание, а не сама сеть. Планировщик поверх него мы как раз пишем, по порядку: одна сота с фиксированной сеткой слотов, потом надёжная доставка, потом подключение новых устройств, потом общее время на все соты и в самом конце переход между ними — там едущий робот будет держать слоты сразу в двух сотах. Порядок работ и замеры под ним лежат в этой задаче.
Зачем всё это: живое видео с того, что движется, — там, где обычный Wi-Fi сдаётся. Робот на складе, дрон на облёте, техника на площадке.
Сжатый своп: 215 секунд превратились в 11
Когда у камеры кончается память, ядро не убивает программы сразу — оно выбрасывает их код и читает обратно с флеша, снова и снова. На 64-мегабайтной hi3516cv608 запуск стримера в таком состоянии занимал 215 и 249 секунд, и программу в итоге убивал сборщик памяти.
С zram — сжатым свопом прямо в оперативке — те же запуски уложились в 11-12 секунд, и никого убивать не пришлось. Там же появился гибридный распределитель памяти: выделенный кусок и зона CMA рядом с ним.
Ещё
За неделю изменения были в тридцати четырёх репозиториях.
- microsnander научился внутрисхемному программированию SigmaStar, обзавёлся приложением для Android и принял больше сотни правок.
- decoder — поддержка камер Lewei, проверено на дроне VISUO.
- viewer — доводка под телевизоры: экранная клавиатура, фокус и горячие клавиши плеера, когда открыт диалог.
- nvr — починили утечку соединений к камере, а перенос записей перестал съедать память бэкенда.
- divinus — определение сенсора на AK3918 и обнаружение камер по сети, когда адрес ещё не получен.
- ipctool — Ambarella отдаёт настоящий объём памяти, и GC4653 на Hi3516CV610 больше не вешает шину.
- coupler — новые платы: GK7201V200 G3C, платы Huishi и Vatilon, проверка размера загрузчика у Anjoy.
- companion выпустил 0.10.0; aviateur и PixelPilot получили правки интерфейса наземной станции.
- qemu-bench, u-boot, openhisilicon, firmware, builder и linux продолжают работу по платформам и сборке.