drivers/rpmsg: add rpmsg_get_timestamp to retrieve buffer timestamps

Add rpmsg_get_timestamp() API to get the TX/RX timestamps of an rpmsg
buffer. This is useful for latency measurement and debugging purposes.

The new rpmsg_timestamp_s structure contains:
  - tx_nsec: timestamp when the buffer was transmitted
  - rx_nsec: timestamp when the buffer was received

Signed-off-by: liaoao <liaoao@xiaomi.com>
Signed-off-by: Bowen Wang <wangbowen6@xiaomi.com>
This commit is contained in:
liaoao
2025-02-25 15:15:43 +08:00
committed by Xiang Xiao
parent 0d25df7663
commit 198a8fe108
2 changed files with 23 additions and 0 deletions
+13
View File
@@ -219,6 +219,19 @@ int rpmsg_get_signals(FAR struct rpmsg_device *rdev)
return atomic_read(&rpmsg->signals);
}
int rpmsg_get_timestamp(FAR struct rpmsg_device *rdev, FAR const void *data,
FAR struct rpmsg_timestamp_s *ts)
{
FAR struct rpmsg_s *rpmsg = rpmsg_get_by_rdev(rdev);
if (!rpmsg || !data || !ts || !rpmsg->ops->get_timestamp)
{
return -EINVAL;
}
return rpmsg->ops->get_timestamp(rpmsg, data, ts);
}
int rpmsg_register_callback(FAR void *priv,
rpmsg_dev_cb_t device_created,
rpmsg_dev_cb_t device_destroy,
+10
View File
@@ -70,6 +70,12 @@ struct rpmsg_s
atomic_int signals;
};
struct rpmsg_timestamp_s
{
uint64_t tx_nsec;
uint64_t rx_nsec;
};
/**
* struct rpmsg_ops_s - Rpmsg device operations
* wait: wait sem.
@@ -84,6 +90,8 @@ struct rpmsg_ops_s
CODE int (*ioctl)(FAR struct rpmsg_s *rpmsg, int cmd, unsigned long arg);
CODE void (*panic)(FAR struct rpmsg_s *rpmsg);
CODE void (*dump)(FAR struct rpmsg_s *rpmsg);
CODE int (*get_timestamp)(FAR struct rpmsg_s *rpmsg, FAR const void *data,
FAR struct rpmsg_timestamp_s *ts);
};
CODE typedef void (*rpmsg_dev_cb_t)(FAR struct rpmsg_device *rdev,
@@ -113,6 +121,8 @@ int rpmsg_post(FAR struct rpmsg_endpoint *ept, FAR sem_t *sem);
FAR const char *rpmsg_get_local_cpuname(FAR struct rpmsg_device *rdev);
FAR const char *rpmsg_get_cpuname(FAR struct rpmsg_device *rdev);
int rpmsg_get_signals(FAR struct rpmsg_device *rdev);
int rpmsg_get_timestamp(FAR struct rpmsg_device *rdev, FAR const void *data,
FAR struct rpmsg_timestamp_s *ts);
static inline_function bool rpmsg_is_running(FAR struct rpmsg_device *rdev)
{