相機與影像¶
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=與記憶體配置