You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by gn...@apache.org on 2020/04/08 14:21:44 UTC
[incubator-nuttx] 14/31: SocketCAN recfrom added non-blocking
behavior support FlexCAN support sending extended CAN id
This is an automated email from the ASF dual-hosted git repository.
gnutt pushed a commit to branch SocketCAN
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
commit c9ca494463964780944a88b7770e5f8c26547022
Author: Peter van der Perk <pe...@nxp.com>
AuthorDate: Fri Mar 6 15:20:15 2020 +0100
SocketCAN recfrom added non-blocking behavior support
FlexCAN support sending extended CAN id
---
arch/arm/src/s32k1xx/s32k1xx_flexcan.c | 5 +++--
net/can/can_recvfrom.c | 25 ++++++++++++++++++++++---
2 files changed, 25 insertions(+), 5 deletions(-)
diff --git a/arch/arm/src/s32k1xx/s32k1xx_flexcan.c b/arch/arm/src/s32k1xx/s32k1xx_flexcan.c
index f394a20..2e73dc9 100644
--- a/arch/arm/src/s32k1xx/s32k1xx_flexcan.c
+++ b/arch/arm/src/s32k1xx/s32k1xx_flexcan.c
@@ -113,6 +113,7 @@
#define CAN_FIFO_NE (1 << 5)
#define CAN_FIFO_OV (1 << 6)
#define CAN_FIFO_WARN (1 << 7)
+#define CAN_EFF_FLAG 0x80000000 /* EFF/SFF is set in the MSB */
#define POOL_SIZE 1
@@ -463,7 +464,7 @@ static int s32k1xx_transmit(FAR struct s32k1xx_driver_s *priv)
{
struct can_frame *frame = (struct can_frame *)priv->dev.d_buf;
- if (0) /* FIXME detect Std or Ext id */
+ if (frame->can_id & CAN_EFF_FLAG)
{
cs.ide = 1;
mb->id.ext = frame->can_id & MASKEXTID;
@@ -489,7 +490,7 @@ static int s32k1xx_transmit(FAR struct s32k1xx_driver_s *priv)
cs.edl = 1; /* CAN FD Frame */
- if (0) /* FIXME detect Std or Ext id */
+ if (frame->can_id & CAN_EFF_FLAG)
{
cs.ide = 1;
mb->id.ext = frame->can_id & MASKEXTID;
diff --git a/net/can/can_recvfrom.c b/net/can/can_recvfrom.c
index f83d07c..c23af93 100644
--- a/net/can/can_recvfrom.c
+++ b/net/can/can_recvfrom.c
@@ -231,6 +231,8 @@ static inline int can_readahead(struct can_recvfrom_s *pstate)
/* Check there is any CAN data already buffered in a read-ahead
* buffer.
*/
+
+ pstate->pr_recvlen = -1;
if ((iob = iob_peek_queue(&conn->readahead)) != NULL &&
pstate->pr_buflen > 0)
@@ -463,10 +465,27 @@ ssize_t can_recvfrom(FAR struct socket *psock, FAR void *buf,
ret = can_readahead(&state);
if (ret > 0)
+ {
+ goto errout_with_state;
+ }
+
+ ret = state.pr_recvlen;
+
+ /* Handle non-blocking CAN sockets */
+
+ if (_SS_ISNONBLOCK(psock->s_flags) || (flags & MSG_DONTWAIT) != 0)
{
- net_unlock();
- nxsem_destroy(&state.pr_sem);
- return ret;
+ /* Return the number of bytes read from the read-ahead buffer if
+ * something was received (already in 'ret'); EAGAIN if not.
+ */
+
+ if (ret < 0)
+ {
+ /* Nothing was received */
+
+ ret = -EAGAIN;
+ goto errout_with_state;
+ }
}
/* Get the device driver that will service this transfer */