Skip to content
← 全部新闻

· 作者:OpenIPC 团队

Novatek 引导 ROM 被打开,以及我们自己的无线网络

一块变砖的 Novatek 板卡现在可以通过以太网恢复,因为我们重建了它的掩膜 ROM;Xiongmai 摄像机成了真正的摄像机;一台摄像机从电表闪烁的 LED 上读出你的用电量;廉价的 Wi-Fi 网卡被证明能够满足移动网络式调度所需的时间精度。

我们打开了 Novatek 的引导 ROM,变砖的板卡通过网络复活

opennovatek 是一个新的仓库:NT9856x 的片上掩膜 ROM,以可审阅的 C 和 ARM 汇编形式重建。这是一项净室工作——ROM 镜像本身从不入库。每个贡献者从自己的摄像机中转储它,MANIFEST 固定了转储必须匹配的哈希值。

ROM 之所以重要:它决定了当摄像机的闪存失效时,会在哪里寻找加载器——SPI、SD 卡、网络、USB 或 UART——以什么顺序,以及在运行之前会检查什么。我们的 defib 和 qemu-bench 中的 ROM 模型都是基于这份重建文档构建的。

结果是:一块闪存失效的 NT9856x 板卡可以通过以太网恢复,而不用在 UART 上动烙铁。它还揭示了之前为什么行不通——Novatek 的 ROM 和加载器从不会重新请求它们丢失的 TFTP 块,所以由 defib 来请求。

Xiongmai 摄像机从“能启动”变成了真正的摄像机

一周前我们为 XM510 写了开源图像流水线,其余的一切现在都跟上了。在 XM510、XM530 和 XM550 上,对比度、色调、饱和度、亮度、镜像和翻转都可以实时调整;移动检测可以工作,遮挡检测也可以——当摄像机被遮挡或转向别处时;市电灯具产生的条纹抑制进入了自动曝光;出厂编码器开始遵守我们对码率、码率控制模式、帧率、关键帧间隔、profile 和质量的设置。

智能关键帧模式到来了,子码流学会了跟随给定的尺寸,/metrics 显示摄像机实际采集的帧率以及编码器丢弃了多少帧。

一台摄像机看着你的电表,就知道水壶在耗多少电

这些电表有一个每千瓦时闪烁固定次数的指示灯——在 3200 imp/kWh 下,每次闪烁是 0.3125 Wh——所以闪烁之间的间隔就是正在使用的功率。摄像机对它们计数,并逐秒报告功耗,在 60 W 到 6 kW 范围内误差在 0.35% 以内。

它还解决了一个老毛病。仅靠滚轮读数无法得到功率:它们每次跳 0.1 kWh,而卡在两个位置之间的最后一位数字可能被读成任何值。在实验室的电表上,它的 8.7 有大约三分之一的时间分别被读成 0、2、6、7 或 8,而读数在 .3 上停留了二十分钟,期间电表已经爬到了 .8。在滚轮的步进之间,闪烁现在承载着读数。

精妙之处在于这不需要任何成本。摄像机不处理帧来观察指示灯:它读取 ISP 出于自身目的已经按区域逐帧平均的自动曝光统计。一次闪烁是指示灯所在区域及其周围八个区域的数值跳升十分之一并在一秒内回落,而它们周围的十六个区域——即整个房间——的变化不到其三分之一。最后一个条件正是为了防止有人开灯也被计入。

用廉价路由器和 Wi-Fi 网卡搭建移动网络式的无线网络

普通 Wi-Fi 是这样工作的:每个人在能发的时候发,谁先挤进去谁赢。在小区边缘,设备同时听到两个接入点的地方,它们互相干扰——而这恰恰是移动机器人或无人机最承受不起的。当设备从一个接入点切换到下一个时,链路会消失超过十分之一秒:扫描、重新关联、重新获取时钟。对实时视频来说,这就是画面冻结。

我们想改成按调度分配空口,就像移动网络那样:每个设备一个时隙,由接入点决定谁用哪一个。首先要搞清楚的是,廉价的 Realtek 网卡到底能不能做到这一点。今年秋天我们完成了测量:能做到。网卡可以把自己的信标钉在一个绝对时刻上,同时不扰动自身的时钟,可以报告帧实际离开天线的时间,可以在硬件层面回应确认,还可以快速切换频率。在一张 8821CE 上,一个接入点把自己的信标对齐到经以太网送达的 PTP 时间,误差在 0.67 微秒以内。

这是基础,还不是网络。它之上的调度器正是我们现在要写的,按顺序来:先是采用固定时隙栅格的单个小区,然后是可靠传输,然后是让新设备接入,然后是跨小区共享同一个时钟,最后才是小区之间的切换——届时移动中的机器人会同时在两个小区持有时隙。工作顺序和支撑它的测量数据都记录在跟踪 issue 中。

这一切是为了什么:来自持续移动物体的实时视频,也就是普通 Wi-Fi 无能为力的场景。仓库里的机器人、巡逻中的无人机、工地上的机械。

压缩交换把 215 秒变成了 11 秒

当一台摄像机内存耗尽时,内核起初不会杀死任何东西:它把运行中程序的代码扔出去,再从闪存反复读回。在一台 64 MB 的 hi3516cv608 上,这种状态下的流媒体程序启动耗时 215 秒和 249 秒,程序最终被内存不足杀手杀死。

使用 zram——驻留在 RAM 中的压缩交换——同样的启动在 11 到 12 秒内完成,不需要杀死任何东西。同一块芯片上还落地了一个混合分配器:一个 carve-out 加上旁边的 CMA 区域。

其他

本周有三十四个仓库有进展。

  • microsnander 增加了对 SigmaStar 器件的在系统编程和一个 Android 应用,收到了超过一百个提交。
  • decoder——支持 Lewei 摄像机,已在 VISUO 无人机上验证。
  • viewer——面向电视的打磨:屏幕键盘,以及对话框打开时播放器的焦点和快捷键。
  • nvr——修复了到摄像机的连接泄漏,移动录像不再吞噬后端内存。
  • divinus——AK3918 上的传感器识别,以及在分配地址之前的网络发现。
  • ipctool——Ambarella 报告其真实内存总量,Hi3516CV610 上的 GC4653 不再卡死总线。
  • coupler——新板卡:GK7201V200 G3C、Huishi 和 Vatilon 板卡,以及对 Anjoy 引导加载器的尺寸检查。
  • companion 发布了 0.10.0;aviateur 和 PixelPilot 得到了地面站界面修复。
  • qemu-bench、u-boot、openhisilicon、firmware、builder 和 linux 继续进行平台和构建工作。