You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by li...@apache.org on 2024/10/16 09:04:39 UTC
(nuttx) branch master updated: nuttx/can.h: support timestamp for can frame and update "can.rst" file for add struct timeval ch_ts info.
This is an automated email from the ASF dual-hosted git repository.
ligd pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new 9985b0551e nuttx/can.h: support timestamp for can frame and update "can.rst" file for add struct timeval ch_ts info.
9985b0551e is described below
commit 9985b0551e59f8ed65b042daa83930f89beb5622
Author: zhaohaiyang1 <zh...@xiaomi.com>
AuthorDate: Fri Aug 30 14:34:45 2024 +0800
nuttx/can.h: support timestamp for can frame
and update "can.rst" file for add struct timeval ch_ts info.
Signed-off-by: zhaohaiyang1 <zh...@xiaomi.com>
---
Documentation/components/drivers/character/can.rst | 5 +++++
drivers/can/Kconfig | 8 ++++++++
drivers/can/mcp2515.c | 18 ++++++++++++++++++
include/nuttx/can/can.h | 10 ++++++++++
4 files changed, 41 insertions(+)
diff --git a/Documentation/components/drivers/character/can.rst b/Documentation/components/drivers/character/can.rst
index 68d95686a1..86061c78b8 100644
--- a/Documentation/components/drivers/character/can.rst
+++ b/Documentation/components/drivers/character/can.rst
@@ -27,6 +27,10 @@ Files supporting CAN can be found in the following locations:
directory for the specific processor ``<architecture>`` and for
the specific ``<chip>`` CAN peripheral devices.
+``struct timeval ch_ts``: This member variable that store in the
+``can_hdr_s`` structure depends on ``CONFIG_CAN_TIMESTAMP`` and
+is used to store the timestamp of the CAN message.
+
**Usage Note**: When reading from the CAN driver multiple messages
may be returned, depending on (1) the size the returned can
messages, and (2) the size of the buffer provided to receive CAN
@@ -34,3 +38,4 @@ messages. *Never assume that a single message will be returned*...
if you do this, *you will lose CAN data* under conditions where
your read buffer can hold more than one small message. Below is an
example about how you should think of the CAN read operation:
+**Examples**: ``drivers/can/mcp2515.c``.
diff --git a/drivers/can/Kconfig b/drivers/can/Kconfig
index ff303d8713..3bc18943f7 100644
--- a/drivers/can/Kconfig
+++ b/drivers/can/Kconfig
@@ -33,6 +33,14 @@ config CAN_ERRORS
bit will be set in the CAN message and the following message payload
will include a more detailed description of certain errors.
+config CAN_TIMESTAMP
+ bool "CAN timestamp reporting"
+ default n
+ ---help---
+ Support CAN timestamp reporting. if this option is selected then
+ CAN timestamp reporting is enabled. in the CAN message the ch_ts
+ member variable will record the timestamp of each frame.
+
config CAN_FD
bool "CAN FD"
default n
diff --git a/drivers/can/mcp2515.c b/drivers/can/mcp2515.c
index af636d162d..89d2c33766 100644
--- a/drivers/can/mcp2515.c
+++ b/drivers/can/mcp2515.c
@@ -45,6 +45,10 @@
#include <nuttx/can/can.h>
#include <nuttx/can/mcp2515.h>
+#ifdef CONFIG_CAN_TIMESTAMP
+#include <time.h>
+#endif
+
#include "mcp2515.h"
#if defined(CONFIG_CAN) && defined(CONFIG_CAN_MCP2515)
@@ -2063,11 +2067,20 @@ static void mcp2515_error(FAR struct can_dev_s *dev, uint8_t status,
static void mcp2515_receive(FAR struct can_dev_s *dev, uint8_t offset)
{
+#ifdef CONFIG_CAN_TIMESTAMP
+ clock_t clkval;
+ struct timespec ts;
+#endif
FAR struct mcp2515_can_s *priv;
struct can_hdr_s hdr;
int ret;
uint8_t regval;
+#ifdef CONFIG_CAN_TIMESTAMP
+ clkval = up_perf_gettime();
+ up_perf_convert(clkval, &ts);
+#endif
+
DEBUGASSERT(dev);
priv = dev->cd_priv;
DEBUGASSERT(priv);
@@ -2153,6 +2166,11 @@ static void mcp2515_receive(FAR struct can_dev_s *dev, uint8_t offset)
regval = RXREGVAL(MCP2515_RXB0DLC);
hdr.ch_dlc = (regval & RXBDLC_DLC_MASK) >> RXBDLC_DLC_SHIFT;
+#ifdef CONFIG_CAN_TIMESTAMP
+ hdr.ch_ts.tv_sec = ts.tv_sec;
+ hdr.ch_ts.tv_usec = ts.tv_nsec / 1000u;
+#endif
+
/* Save the message data */
ret = can_receive(dev, &hdr, (FAR uint8_t *)&RXREGVAL(MCP2515_RXB0D0));
diff --git a/include/nuttx/can/can.h b/include/nuttx/can/can.h
index 1ee02ae552..841aca0001 100644
--- a/include/nuttx/can/can.h
+++ b/include/nuttx/can/can.h
@@ -44,6 +44,10 @@
# include <nuttx/wqueue.h>
#endif
+#ifdef CONFIG_CAN_TIMESTAMP
+#include <sys/time.h>
+#endif
+
#ifdef CONFIG_CAN
/****************************************************************************
@@ -592,6 +596,9 @@ begin_packed_struct struct can_hdr_s
uint8_t ch_esi : 1; /* Error State Indicator */
#endif
uint8_t ch_tcf : 1; /* Tx confirmation flag */
+#ifdef CONFIG_CAN_TIMESTAMP
+ struct timeval ch_ts; /* record the timestamp of each frame */
+#endif
} end_packed_struct;
#else
@@ -609,6 +616,9 @@ begin_packed_struct struct can_hdr_s
uint8_t ch_esi : 1; /* Error State Indicator */
#endif
uint8_t ch_tcf : 1; /* Tx confirmation flag */
+#ifdef CONFIG_CAN_TIMESTAMP
+ struct timeval ch_ts; /* record the timestamp of each frame */
+#endif
} end_packed_struct;
#endif