文件最后提交记录最后更新时间
28 天前
28 天前
28 天前
20 天前
README

USB Camera NativeUI Sample

功能

本示例提供 USB Camera 的 NativeUI 页面,支持:

  • USB Camera 预览启停
  • 拍照和照片查看
  • 录像、录像停止和 MJPEG 回放
  • USB Host 驱动初始化入口

页面只负责 UI、状态管理和结果展示。Camera sample、Camera framework、HAL 以及 UVC Host 驱动负责实际采集和数据传输。

完整调用链和关键代码说明参见 USB Camera 开发指南。

代码入口与框架关系

  • src/UsbCameraPresenter.cpp:通过 REGIST_MENU 向 Native Launcher 注册 USB Camera 菜单。
  • src/UsbCameraMainPage.cpp:通过 REGIST_SLICE_PAGE 注册页面,负责布局、按钮事件、 Camera sample 命令调用、照片显示和录像回放。
  • src/UsbCameraMjpegPlayer.cpp:读取 MJPEG 文件,按 JPEG 起止标记拆帧,使用硬件 JPEG 解码并写入回放 Surface。
  • include/usb_camera/:页面、Presenter 和播放器的接口。
  • CMakeLists.txt:定义 usb_camera_sample 组件,并设置 WHOLE_LINK true。

本示例使用与 Native Launcher 其它页面相同的 NativeUI 结构:

Native Launcher
  -> REGIST_MENU
  -> UsbCameraPresenter
  -> UsbCameraMainPage
     -> UIViewGroup、UILabelButton、UIImageView、UILiteSurfaceView

说明:本示例不是独立进程或独立可执行文件,必须随 Native Launcher 和 UIKit 一起编入最终固件。

编译前准备

1. 开启 Sample 和 HAL 层编译

在以下文件中找到 diting-community 目标:

src/build/config/target_config/3322/config.py

在该目标的 defines 列表中增加:

'CONFIG_ENABLE_USB_CAMERA',

2. 将 usb_camera_sample 加入最终组件列表

在同一个 diting-community 目标的 ram_component 列表中增加:

'usb_camera_sample',

3. 开启 USB Host 和 UVC 驱动

pack_diting_community 使用的配置文件为:

src/kernel/liteos/LiteOS/self_src/tools/build/config/3322_nandflash.config

建议开启以下配置:

LOSCFG_DRIVERS_USB=y
LOSCFG_DRIVERS_USB_HOST_DRIVER=y
LOSCFG_DRIVERS_USB_HOST_XHCI=y
LOSCFG_DRIVERS_USB_HOST_XHCI_IOSC_SIA=y
LOSCFG_DRIVERS_USB_HOST_PARAMS_CONFIG=y
LOSCFG_DRIVERS_USB_HOST_MAX_DEVICES=3
LOSCFG_DRIVERS_USB_HOST_CONFIG_LEN=8192
LOSCFG_DRIVERS_USB_HOST_IFACE_MAX=7
LOSCFG_DRIVERS_USB_HOST_MAX_EP_STREAMS=1
LOSCFG_DRIVERS_USB_XHCI_CONFIG=y
LOSCFG_USB_XHCI_MAX_TRANSFERS=4
LOSCFG_USB_XHCI_MAX_SCRATCHPADS=2
LOSCFG_USB_XHCI_MAX_EVENTS=64
LOSCFG_USB_XHCI_INTERRUPT_INTERVAL=8000
LOSCFG_DRIVERS_USB_HOST_STANDALONE_MEM_POOL=y
LOSCFG_DRIVERS_USB_FIFO=y
LOSCFG_DRIVERS_USB_DEVICE_CLASS_DRIVERS=y
LOSCFG_DRIVERS_USB_HOST_UVC_CLASS=y

4. 添加 USB Camera Sample 构建入口

文件:

samples/native_samples/CMakeLists.txt

在 CONFIG_ENABLE_USB_CAMERA 出现在 DEFINES 中时,加入 usb_camera 子目录:

if("CONFIG_ENABLE_USB_CAMERA" IN_LIST DEFINES)
    add_subdirectory_if_exist(usb_camera)
endif()

该入口保证 usb_camera_sample 只在开启 CONFIG_ENABLE_USB_CAMERA 时参与 native_samples 构建;未开启宏时不会编译本示例。

5. 选择 USB Camera HAL 实现

文件:

src/middleware/services/media/hal/CMakeLists.txt

在 CHIP 为 brandy 或 3322 时,根据 CONFIG_ENABLE_USB_CAMERA 在两个 Camera Lite HAL 实现之间二选一:

if ("CONFIG_ENABLE_USB_CAMERA" IN_LIST DEFINES)
    add_subdirectory_if_exist(usb_camera_lite)
else()
    add_subdirectory_if_exist(camera_lite)
endif()

开启 USB Camera 后使用 usb_camera_lite,未开启时保留原有的 camera_lite。 两个目录提供相同的 HalCamera* 接口,不能同时加入构建。

6. 调整 USB 基础库链接位置

文件:

src/drivers/boards/3322_evb/linker/standard/acore/normal/acore.prelds

将 *libusb_base.a:*.o* 的链接规则从 .plt_ramtext 段移到.text 段。

    /* Code and const data */
    .text : ALIGN(8)
    {
        ...
        *libusb_base.a:*.o* (.text .text* .rodata .rodata* .srodata .srodata*)
        ...
    } > FLASH_PROGRAM

7. 增加 Native Launcher 页面 ID

文件:

src/application/wearable/nativeapp/nativelauncher/include/AppViewIDs.h

在 AppViewId 枚举中增加:

VIEW_USB_CAMERA, // USB camera

该 ID 与 UsbCameraPresenter 的 REGIST_MENU 以及 UsbCameraMainPage 的页面注册配套,用于让 Native Launcher 识别和跳转到 USB Camera 页面。

8. 配置

运行前检查

  1. 摄像头:USB 摄像头符合 UVC 标准,并连接到 3322 的 USB Host 接口。
  2. USB 选择开关:开发板 USB 选择开关的第 2 位拨到 ON,切换为 USB Host 模式。
  3. 格式能力:摄像头支持当前 HAL 请求的格式、分辨率和帧率。当前 USB HAL 默认输出 为 640 x 480、30 fps、MJPEG。
  4. JPEG 解码:当前目标具备 JPEG 硬件解码能力。

App 使用方法

页面按钮

按钮 功能 备注
Preview 启动预览 预览启动后 framework 层会覆盖页面,需要按电源键退出预览
Stop 停止预览 暂时无法使用
Capture 启动拍照 文件保存到 /user/cam_capture.jpg
Photo 显示已有的照片文件 依赖 /user/cam_capture.jpg
Record 开始录像 录像数据保存到 /user/cam_record.mjpg,开始时会初始化时长文件
StopRec 停止录像 录制时长保存到 /user/cam_record.meta,供回放计算节奏
Play 播放录像 依赖已生成的 MJPEG 录像文件和 JPEG 硬件解码能力
StopPlay 停止播放录像 ---
USB Host 启动 USB 口供电,初始化 Host UVC 驱动 需要在其它操作之前执行
Back 退出照片或录像结果页 只有进入结果页后才显示

操作顺序

  1. 唤醒屏幕,在菜单中选择 USB Camera。
  2. 点击 USB Host,开启摄像头供电并初始化 Host UVC 驱动。
  3. 根据测试目的选择 Preview、Capture 或 Record。