drivers: udc: add opaque pointer to store upper layer private data

Add an opaque pointer to store upper layer private data and initialize
it with the USB device context during controller initialization. Use the
pointer in event processing to get the correct context.

Fixes commit 48f2a4bc1a
("usb: device_next: remove initialized state checks in event processing")

Signed-off-by: Johann Fischer <johann.fischer@nordicsemi.no>
This commit is contained in:
Johann Fischer 2024-06-28 16:03:21 +02:00 committed by Anas Nashif
commit 5ddaa3b1a1
4 changed files with 44 additions and 16 deletions

View file

@ -24,6 +24,7 @@ static K_KERNEL_STACK_DEFINE(test_udc_stack, 512);
static struct k_thread test_udc_thread_data;
static K_SEM_DEFINE(ep_queue_sem, 0, 1);
static uint8_t last_used_ep;
static uint8_t test_event_ctx;
static int test_udc_event_handler(const struct device *dev,
const struct udc_event *const event)
@ -57,6 +58,9 @@ static void test_udc_thread(void *p1, void *p2, void *p3)
while (true) {
k_msgq_get(&test_msgq, &event, K_FOREVER);
zassert_equal(udc_get_event_ctx(event.dev), &test_event_ctx,
"Wrong pointer to higher layer context");
switch (event.type) {
case UDC_EVT_VBUS_REMOVED:
LOG_DBG("VBUS remove event");
@ -368,7 +372,7 @@ static void test_udc_ep_mps(uint8_t type)
dev = DEVICE_DT_GET(DT_NODELABEL(zephyr_udc0));
zassert_true(device_is_ready(dev), "UDC device not ready");
err = udc_init(dev, test_udc_event_handler);
err = udc_init(dev, test_udc_event_handler, &test_event_ctx);
zassert_ok(err, "Failed to initialize UDC driver");
err = udc_enable(dev);
@ -476,7 +480,7 @@ ZTEST(udc_driver_test, test_udc_not_initialized)
dev = DEVICE_DT_GET(DT_NODELABEL(zephyr_udc0));
zassert_true(device_is_ready(dev), "UDC device not ready");
err = udc_init(dev, NULL);
err = udc_init(dev, NULL, NULL);
zassert_equal(err, -EINVAL, "Not failed to initialize UDC");
err = udc_shutdown(dev);
@ -515,7 +519,7 @@ ZTEST(udc_driver_test, test_udc_initialized)
dev = DEVICE_DT_GET(DT_NODELABEL(zephyr_udc0));
zassert_true(device_is_ready(dev), "UDC device not ready");
err = udc_init(dev, test_udc_event_handler);
err = udc_init(dev, test_udc_event_handler, &test_event_ctx);
zassert_ok(err, "Failed to initialize UDC driver");
test_udc_set_address(dev, 0);
@ -548,7 +552,7 @@ ZTEST(udc_driver_test, test_udc_enabled)
dev = DEVICE_DT_GET(DT_NODELABEL(zephyr_udc0));
zassert_true(device_is_ready(dev), "UDC device not ready");
err = udc_init(dev, test_udc_event_handler);
err = udc_init(dev, test_udc_event_handler, &test_event_ctx);
zassert_ok(err, "Failed to initialize UDC driver");
err = udc_enable(dev);