摄像头与图像¶
IPRO7AI 通过 8 位 DVP 接口连接摄像头传感器。芯片内的 ISP 有两个输出通道:通道 0 用于预览或 MJPEG 硬件编码,通道 1 缩小后交给 NPU。SDK 提供传感器驱动、ISP 与 MJPEG 组件,以及 CherryUSB 的 UVC 类。IPRO7AI Reef EVK 的摄像头是连接在 FPC1 上的 OV5640 模组;ipro7ai_reef_demo 可从 shell 启动摄像头,ipro7_uvc_cam 则把开发板变成 USB 摄像头。
要点
- Reef 摄像头:FPC1 上的 OV5640 FLEX-24 模组,1280×720 YUV422,自动曝光与白平衡由传感器处理。SW7 拨到 CAM,连接排线前先拔掉 USB-C。
- 配置:
CONFIG_MM_SUPPORT=y、CONFIG_USE_PSRAM=y、CONFIG_COMPONENTS_SENSOR_ENABLE=y、CONFIG_SENSOR_OV5640=y;用作 USB 摄像头时再加 UVC 配置。 - 示例:
ipro7ai_reef_demo(cam命令)、ipro7_uvc_cam(defconfig_reef_ov5640摄像头、defconfig_reef_rpsNPU 游戏)、defconfig_wifi_ipro6s经 Wi-Fi 的 RTSP 视频流、ipro7_jpeg_decode的 JPEG 解码。 - MJPEG 硬件只能编码;JPEG 图片由 CPU 解码。Zephyr 没有摄像头驱动。
图像管线¶
flowchart LR
S["OV5640(DVP,1280×720 YUV422)"] --> ISP["ISP"]
ISP -->|"ch0:YUYV"| J["MJPEG 硬件编码"]
ISP -->|"ch0:YUYV"| P["PSRAM 帧缓冲"]
ISP -->|"ch1:缩放到模型输入的区域"| N["NPU"]
J --> U["USB UVC"]
J --> R["经 FIN 卡 Wi-Fi 的 RTSP"]
J --> B["经 BLE 传输 JPEG 照片"]
- 每个 ISP 通道有各自的输出尺寸。通道 0 是主机或您的程序看到的画面;通道 1 取传感器图像中的一块区域,缩放成模型的输入(例如石头剪刀布版本把正中央 512×512 的方块缩小成 128×128)。
- OV5640 与 OV2640 驱动让传感器自己完成自动曝光、增益与白平衡,因此不启动 ISP 固件的 3A。IQ 参数表只提供给其他 INTELPRO 开发板所用的 SC101IOT 传感器。
- ISP 的 DMA 把帧写入 PSRAM;CPU 读取前要先使该范围的 D-cache 失效(
L1C_DCACHE_INVALID_RANGE)。 - Reef 的 OV5640 模组读出的图像上下颠倒;
ipro7ai_reef_demo/src/cam.c在采集 DMA 中翻转(CAM_DVP_VFLIP),而不是在传感器端翻转。
组件与配置¶
| 部分 | 位置 | 说明 |
|---|---|---|
| 摄像头 HAL | bsp/hal/inc/hal_cam.h、hal_isp.h、hal_mjpeg.h |
DVP 采集、ISP、MJPEG 编码器 |
| 传感器 | components/sensor/ |
传感器驱动与 SCCB;camera_module_init() 依次探测已注册的传感器 |
| ISP 控制 | components/isp_firmware/ |
ISP 配置与图像参数处理 |
| ISP 算法 | components/isp_algorithm/ |
预编译的 libisp_algorithm.a |
| IQ 参数 | components/isp_iq_param/、components/isp_iq_cmd/ |
IQ 参数表与调校命令(SC101IOT) |
| UVC | components/cherryusb/class/video/ |
USB Video Class 设备 |
| RTSP | components/network/rtsp_server/ |
RTSP MJPEG 视频流(CONFIG_RTSP_SERVER) |
CONFIG_IPRO7AI_REEF=y
CONFIG_BOARD="IPRO7AI_REEF"
CONFIG_USE_PSRAM=y
CONFIG_MM_SUPPORT=y
CONFIG_COMPONENTS_SENSOR_ENABLE=y
CONFIG_SENSOR_OV5640=y
# USB 摄像头
CONFIG_COMPONENTS_CHERRYUSB_ENABLE=y
CONFIG_CHERRYUSB_DEVICE=y
CONFIG_CHERRYUSB_DEVICE_VIDEO=y
Kconfig 中 CONFIG_MM_SUPPORT 与 CONFIG_IPRO7AI_REEF 会 select USE_PSRAM,但构建系统不应用 Kconfig 的 select,所以 .config 中一定要写 CONFIG_USE_PSRAM=y;见构建系统与配置。
支持的传感器¶
| 传感器 | .config |
输出 | 说明 |
|---|---|---|---|
| OV5640 | CONFIG_SENSOR_OV5640=y |
1280×720 YUV422(2×2 binning),SCCB 地址 0x3C | Reef 的 FPC1 采用 OV5640 FLEX-24 引脚定义。30 fps,光线暗时降到 15 fps |
| OV2640 | CONFIG_SENSOR_OV2640=y |
1280×720 YUV422(由 UXGA 缩放),SCCB 0x30 | ipro7ai_reef_demo 与 OV5640 驱动一起开启 |
| SC101IOT | 随 CONFIG_COMPONENTS_SENSOR_ENABLE=y 编入 |
1280×720 | IPRO7 EVB 与 IPRO7AI EVK 的传感器 |
OV5640 与 OV2640 驱动需要显式开启,这样其他开发板不必承担它们占用的空间。components/sensor/ 另有 GC6133、GC032A 驱动,没有随附示例使用。
在 Reef 上动手实践¶
探测 OV5640、启动视频流、确认帧率与错误计数,再以 ASCII 图形查看一帧画面。这些都在 ipro7ai_reef_demo 中运行,它的摄像头模块 src/cam.c 可直接在您的应用程序中复用。
-
硬件与配置
拔掉 USB-C,把摄像头排线连接到 FPC1,SW7 拨到 CAM,再插回 USB-C。demo
.config中的摄像头配置: -
代码
cam.h封装了上电时序、SCCB 探测,以及送入 PSRAM 的 ISP 通道 0 视频流(传感器尺寸除以CAM_SCALE_DIV,默认为 4)。shell 的cam命令这样调用它:apps/platform/ipro7ai_reef_demo/src/app_cli.c(摘录自 cmd_cam)if (strcmp(argv[1], "probe") == 0) { if (cam_probe() == 0) { uint16_t w, h; cam_sensor_size(&w, &h); printf("sensor %s at SCCB 0x%02X, %ux%u\n", cam_sensor_name(), cam_sensor_addr(), w, h); } else { printf("no sensor found\n"); } } else if (strcmp(argv[1], "start") == 0) { int rc = cam_start(); printf(rc == CAM_OK ? "streaming - `cam status` in a second\n" : "start failed (%d)\n", rc); } else if (strcmp(argv[1], "status") == 0) { cam_stats_t st; uint16_t w, h, ow, oh; /* ... */ cam_get_stats(&st); cam_out_size(&ow, &oh); printf("ch0 : YUYV %ux%u, frames %u, %u.%u fps, luma mean %u\n", ow, oh, (unsigned)st.frames, (unsigned)(st.fps_x10 / 10), (unsigned)(st.fps_x10 % 10), (unsigned)st.luma_mean); printf("errors : fifo %u, vsync %u, hsync %u\n", (unsigned)st.fifo_err, (unsigned)st.vsync_err, (unsigned)st.hsync_err); }cam_latest_frame()返回最新一帧完整 YUYV 帧的地址,供您自行处理。ipro_ble_remote的 Reef 构建就是在 CMake 中加入这个模块来复用它,只是换了缩放倍率:apps/bluetooth/ble/ipro_ble_remote/CMakeLists.txt(摘录)if(CONFIG_IPRO7AI_REEF) set(REEF_DEMO_SRC ${CMAKE_SOURCE_DIR}/apps/platform/ipro7ai_reef_demo/src) __component_add_include_dirs(${REEF_DEMO_SRC}) target_sources(app PRIVATE ${REEF_DEMO_SRC}/cam.c # ... the remote's other Reef sources ) target_compile_definitions(app PRIVATE CAM_SCALE_DIV=1u) endif()创建自己的应用程序见创建第一个应用程序。
-
构建
-
烧录
进入下载模式(按住 SW1、按一下 SW2、松开 SW1),再到 IntelProCube 目录中运行:
cd <ICUBE> ./ipro_iot_tool_macos --chipname ipro7 --chip-variant IPRO7AI \ --port /dev/cu.usbserial-XXXX --baudrate 921600 \ --pt chips/ipro7/partition/partition_cfg_2M.toml \ --firmware <SDK>/apps/platform/ipro7ai_reef_demo/build/build_out/ipro7ai_reef_demo_IPRO7.bin确认输出中有
[All Success]后按 SW2。其他操作系统见烧录与串口控制台。 -
运行并确认
在 U6 控制台(115200 baud)中:
ipro /> cam probe sensor __rti_name_ov5640 at SCCB 0x3C, 1280x720 ipro /> cam start streaming - `cam status` in a second ipro /> cam status sensor : __rti_name_ov5640 @0x3C 1280x720, streaming ch0 : YUYV 320x180, frames …, … fps, luma mean … errors : fifo 0, vsync 0, hsync 0 dvp : byte order lower-first, vsync high, hsync high间隔一秒运行两次
cam status:帧数持续增加,错误计数不变。接着运行cam bar on再运行cam snap,会打印带竖条纹的 ASCII 缩略图(传感器的彩条测试图);cam bar off后再运行cam snap就是实际画面。出现no sensor found时检查排线、SW7 与模组;demo README 的摄像头章节列出了下一步可用的检查(cam pins、cam sync、cam order)。
每次构建后自动检查摄像头的做法见测试您的应用程序。
USB 摄像头 ipro7_uvc_cam¶
apps/multimedia/ipro7_uvc_cam 让 Reef 在 USB-C 上枚举成普通的 UVC 摄像头:OV5640 → ISP → MJPEG 硬件编码 → USB Full Speed 同步传输端点。主机使用内置的 UVC 驱动即可。
| Reef 配置 | 视频流(MJPEG) | NPU | 输出 |
|---|---|---|---|
defconfig_reef_ov5640 |
1280×720(画面复杂时约 15 fps,受限于 Full-Speed USB)或 640×360(30 fps),由主机选择 | 不使用 | build_reef_ov5640/build_out/ipro7_uvc_cam_IPRO7.bin |
defconfig_reef_rps |
640×360,画面上叠加石头剪刀布游戏 | 128×128 分类器,模型链接进固件 | build_reef_rps/build_out/ipro7_uvc_cam_IPRO7.bin |
烧录方式与 demo 相同,使用 --chip-variant IPRO7AI 与 --pt chips/ipro7/partition/partition_cfg_2M.toml。控制台为 115200 baud,会显示:
把 Reef 的 USB-C 连接到电脑,用任意摄像头程序打开(USB VID 0x3896、PID 0x0701)。shell 可调校传感器:cam rd <reg> [n]、cam wr <reg> <hexbytes>、cam grid [cols rows]。
- 画面尺寸与格式写死在公共摄像头管线的描述符中(
apps/ai/ipro_reef_teach/image/uvc.c、uvc_isp.h),没有.config配置项。 - 这个应用程序使用自己的链接脚本
ipro7_uvc_cam.ld。 - 默认的
.config是给 IPRO7 EVB 与 SC101IOT 传感器用的。 - 石头剪刀布版本的分步说明见 AI 与 NPU。
JPEG 解码¶
IPRO7 的 MJPEG 硬件只支持编码:hal_mjdec.h 虽然存在,但硬件解码器在 IPRO7 上无法完成任何一帧。apps/multimedia/ipro7_jpeg_decode 在 CPU 上用 TJpgDec R0.03 解码 JPEG,外加封装层 jdec_rgb:输出真正的 RGB565(小端或大端)或 RGB888,并为摄像头 MJPEG 帧补上省略的标准 Huffman 表。
这个版本的控制台是 921600 baud。jdec run all 解码内置测试图,逐一与同一解码器的 PC 版比对,最后打印 14 images, 0 failed -> ALL PASS。使用 CMake 3.18 以上版本构建时,解码器以 -O2 编译,在 192 MHz 下解码一张 1280×720 4:2:0 图片约需 570 ms(应用程序 README)。要在自己的应用程序中使用,复制 jdec_rgb.c、jdec_rgb.h 与 tjpgd/。
IPRO7AI EVK 摄像头库¶
components/board/ipro7ai_evk(evk_cam_*)是 IPRO7AI EVK 及其 SC101IOT 传感器的摄像头库,Reef 不使用。该开发板请联系 INTELPRO。
使用摄像头的示例¶
| 示例 | Reef 配置 | 内容 |
|---|---|---|
ipro7ai_reef_demo |
.config |
cam 命令:探测、视频流、状态、ASCII 快照、彩条、寄存器读写、DVP 引脚活动 |
ipro7ai_reef_demo |
defconfig_wifi_ipro6s |
通过 IPRO6S FIN 卡的 Wi-Fi,把通道 0(640×360)以 RTSP MJPEG 推流到 rtsp://<ip>:8554/av0_0;见网络与 Wi-Fi 与 RTSP 视频流 |
ipro7_uvc_cam |
defconfig_reef_ov5640、defconfig_reef_rps |
USB 摄像头;视频流画面上叠加 NPU 石头剪刀布游戏 |
ipro7_jpeg_decode |
defconfig_reef |
软件 JPEG 解码为 RGB565/RGB888 |
ipro_ble_remote |
defconfig_reef |
1280×720 JPEG 照片经 BLE 图像服务传到手机;画面中有运动时自动拍照;插有 SD 卡时另存到 sd:/REMOTE/ |
ipro_reef_teach |
.config |
image 模式:USB 摄像头加上在 IPRO AI Studio 中训练出的板上分类器;见图像识别 |
IPRO7 EVB 与 IPRO7AI EVK 的摄像头示例(ipro7ai_evk_*、ipro7_demo)列在示例中。
本版本的限制¶
- IPRO7 没有硬件 JPEG 解码;请使用
ipro7_jpeg_decode。 - USB 为 Full Speed,画面复杂时 720p MJPEG 约只有 15 fps。
- ISP IQ 参数表只有 SC101IOT;OV5640 与 OV2640 使用传感器自己的 3A。
- Zephyr 没有摄像头、ISP 与 USB 驱动。
相关文档¶
- AI 与 NPU:把 ISP 通道 1 交给 NPU
- 网络:RTSP 视频流使用的 Wi-Fi
- IPRO7AI Reef EVK:FPC1、SW7 与摄像头引脚
- 摄像头 API
- 构建系统与配置:
DEFCONFIG=与内存布局