Skip to content

Commit 5d5de63

Browse files
jfischer-nokartben
authored andcommitted
drivers: uhc: interrupt transaction handling
Add interrupt and start frame parameters and schedule transaction at specific frame. Implement for virtual driver only. Signed-off-by: Johann Fischer <johann.fischer@nordicsemi.no>
1 parent ae8ae4c commit 5d5de63

File tree

2 files changed

+24
-0
lines changed

2 files changed

+24
-0
lines changed

drivers/usb/uhc/uhc_virtual.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ struct uhc_vrt_data {
4949
struct uhc_transfer *last_xfer;
5050
struct uhc_vrt_frame frame;
5151
struct k_timer sof_timer;
52+
uint16_t frame_number;
5253
uint8_t req;
5354
};
5455

@@ -224,6 +225,16 @@ static void vrt_assemble_frame(const struct device *dev)
224225
continue;
225226
}
226227

228+
if (tmp->interval) {
229+
if (tmp->start_frame != priv->frame_number) {
230+
continue;
231+
}
232+
233+
tmp->start_frame = priv->frame_number + tmp->interval;
234+
LOG_DBG("Interrupt transfer s.f. %u f.n. %u interval %u",
235+
tmp->start_frame, priv->frame_number, tmp->interval);
236+
}
237+
227238
bm |= BIT(idx);
228239
frame->slots[n].xfer = tmp;
229240
sys_dlist_append(&frame->list, &frame->slots[n].node);
@@ -410,6 +421,7 @@ static void xfer_work_handler(struct k_work *work)
410421

411422
switch (ev->type) {
412423
case UHC_VRT_EVT_SOF:
424+
priv->frame_number++;
413425
vrt_xfer_cleanup_cancelled(dev);
414426
vrt_assemble_frame(dev);
415427
schedule = true;
@@ -533,6 +545,14 @@ static int uhc_vrt_bus_resume(const struct device *dev)
533545
static int uhc_vrt_enqueue(const struct device *dev,
534546
struct uhc_transfer *const xfer)
535547
{
548+
struct uhc_vrt_data *priv = uhc_get_private(dev);
549+
550+
if (xfer->interval) {
551+
xfer->start_frame = priv->frame_number + xfer->interval;
552+
LOG_DBG("New interrupt transfer s.f. %u f.n. %u interval %u",
553+
xfer->start_frame, priv->frame_number, xfer->interval);
554+
}
555+
536556
uhc_xfer_append(dev, xfer);
537557

538558
return 0;

include/zephyr/drivers/usb/uhc.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,10 @@ struct uhc_transfer {
8181
uint8_t ep;
8282
/** Maximum packet size */
8383
uint16_t mps;
84+
/** Interval, used for periodic transfers only */
85+
uint16_t interval;
86+
/** Start frame, used for periodic transfers only */
87+
uint16_t start_frame;
8488
/** Flag marks request buffer is queued */
8589
unsigned int queued : 1;
8690
/** Control stage status, up to the driver to use it or not */

0 commit comments

Comments
 (0)