Skip to content

Commit cf4ed33

Browse files
author
Josuah Demangeon
committed
tests: usb: uvc: connect USB device and host via UVB
Add a test to run the USB Video Class host support by using the existing Zephyr USB Video Class device support. This allows running implementing the host side from the device side. A draft implementation of UVC is added leveraging this test. Signed-off-by: Josuah Demangeon <[email protected]>
1 parent 37509d4 commit cf4ed33

File tree

12 files changed

+254
-2
lines changed

12 files changed

+254
-2
lines changed
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# Copyright (c) 2025 Nordic Semiconductor ASA
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
description: |
5+
USB Video Class (UVC) host instance.
6+
7+
Each UVC instance added to the USB Host Controller (UHC) node will be visible
8+
as a new camera from Zephyr point of view.
9+
10+
as soon as a camera is connected to USB this device will be usable by the application as a
11+
video device, following the video API.
12+
13+
compatible: "zephyr,uvc-host"
14+
15+
include: base.yaml

subsys/usb/host/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ zephyr_library_sources_ifdef(
1616
usbh_shell.c
1717
)
1818

19+
zephyr_library_sources_ifdef(
20+
CONFIG_USBH_VIDEO_CLASS
21+
class/usbh_uvc.c
22+
)
23+
1924
zephyr_library_sources_ifdef(
2025
CONFIG_USBIP
2126
usbip.c

subsys/usb/host/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,5 +54,6 @@ config USBH_MAX_UHC_MSG
5454
Maximum number of USB host controller events that can be queued.
5555

5656
rsource "Kconfig.usbip"
57+
rsource "class/Kconfig"
5758

5859
endif # USB_HOST_STACK

subsys/usb/host/class/Kconfig

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# Copyright (c) 2025 Nordic Semiconductor ASA
2+
#
3+
# SPDX-License-Identifier: Apache-2.0
4+
5+
rsource "Kconfig.uvc"

subsys/usb/host/class/Kconfig.uvc

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Copyright (c) 2025 Nordic Semiconductor ASA
2+
#
3+
# SPDX-License-Identifier: Apache-2.0
4+
5+
config USBH_VIDEO_CLASS
6+
bool "USB Video Class implementation [EXPERIMENTAL]"
7+
depends on DT_HAS_ZEPHYR_UVC_HOST_ENABLED
8+
select EXPERIMENTAL
9+
help
10+
USB Host Video Class (UVC) implementation.
11+
12+
if USBH_VIDEO_CLASS
13+
14+
module = USBH_VIDEO
15+
module-str = usbh uvc
16+
default-count = 1
17+
source "subsys/logging/Kconfig.template.log_config"
18+
19+
endif # USBH_VIDEO_CLASS

subsys/usb/host/class/usbh_uvc.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ struct usbh_uvc_data {
3737
int todo;
3838
};
3939

40+
struct usbh_uvc_config {
41+
struct usbh_context *uhs_ctx;
42+
};
43+
4044
static int usbh_uvc_request(struct usbh_context *const uhs_ctx, struct uhc_transfer *const xfer,
4145
int err)
4246
{

subsys/usb/host/usbh_core.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ K_MSGQ_DEFINE(usbh_msgq, sizeof(struct uhc_event),
2929
K_MSGQ_DEFINE(usbh_bus_msgq, sizeof(struct uhc_event),
3030
CONFIG_USBH_MAX_UHC_MSG, sizeof(uint32_t));
3131

32-
extern const struct usbh_class_data *usbh_class_data;
32+
extern const struct usbh_class_data *usbh_class;
3333

3434
static int usbh_event_carrier(const struct device *dev,
3535
const struct uhc_event *const event)
@@ -75,7 +75,7 @@ static void dev_connected_handler(struct usbh_context *const ctx,
7575
return;
7676
}
7777

78-
if (usbh_class_data->connected(ctx)) {
78+
if (usbh_class->connected(ctx)) {
7979
LOG_ERR("The class failed to handle the connection");
8080
return;
8181
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# SPDX-License-Identifier: Apache-2.0
2+
3+
cmake_minimum_required(VERSION 3.20.0)
4+
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
5+
project(uvc_uvb)
6+
7+
# This sample cannot use the common USB sample infrastructure as we do not want
8+
# to initialize the board default `zephyr_udc0` but instead an unrelated `virtual_udc0`.
9+
#include(${ZEPHYR_BASE}/samples/subsys/usb/common/common.cmake)
10+
11+
FILE(GLOB app_sources src/*.c)
12+
target_sources(app PRIVATE ${app_sources})
13+
zephyr_include_directories(${ZEPHYR_BASE}/subsys/usb/host)

tests/subsys/usb/uvc/app.overlay

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/*
2+
* Copyright (c) 2025 Nordic Semiconductor ASA
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
/ {
8+
virtual_uhc0: uhc-virtual {
9+
compatible = "zephyr,uhc-virtual";
10+
maximum-speed = "full-speed";
11+
12+
virtual_udc0: udc-virtual {
13+
compatible = "zephyr,udc-virtual";
14+
num-bidir-endpoints = <4>;
15+
maximum-speed = "full-speed";
16+
};
17+
};
18+
19+
uvc_device: uvc-device {
20+
compatible = "zephyr,uvc-device";
21+
};
22+
23+
uvc_host: uvc-host {
24+
compatible = "zephyr,uvc-host";
25+
};
26+
};

tests/subsys/usb/uvc/prj.conf

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
CONFIG_LOG=y
2+
CONFIG_UDC_BUF_POOL_SIZE=2048
3+
CONFIG_UDC_DRIVER_LOG_LEVEL_INF=y
4+
CONFIG_UHC_DRIVER_LOG_LEVEL_INF=y
5+
CONFIG_USBD_VIDEO_CLASS=y
6+
CONFIG_USBD_VIDEO_LOG_LEVEL_INF=y
7+
CONFIG_USBH_LOG_LEVEL_INF=y
8+
CONFIG_USBH_VIDEO_CLASS=y
9+
CONFIG_USBH_VIDEO_LOG_LEVEL_INF=y
10+
CONFIG_USB_DEVICE_STACK_NEXT=y
11+
CONFIG_USB_HOST_STACK=y
12+
CONFIG_UVB_LOG_LEVEL_INF=y
13+
CONFIG_VIDEO=y
14+
CONFIG_VIDEO_LOG_LEVEL_INF=y
15+
CONFIG_ZTEST=y

0 commit comments

Comments
 (0)