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 <zhaohaiya...@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 <zhaohaiya...@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