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/02/21 15:52:29 UTC

[incubator-nuttx] 02/04: Added GPIO code to test SocketCAN performance

This is an automated email from the ASF dual-hosted git repository.

gnutt pushed a commit to branch tmpcan
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git

commit 337a8a1eef3bf934a9c9d73bffcfa9243156a165
Author: Peter van der Perk <pe...@nxp.com>
AuthorDate: Wed Feb 19 17:46:37 2020 +0100

    Added GPIO code to test SocketCAN performance
---
 arch/arm/src/s32k1xx/s32k1xx_flexcan.c | 94 ++++++++++++++++------------------
 1 file changed, 43 insertions(+), 51 deletions(-)

diff --git a/arch/arm/src/s32k1xx/s32k1xx_flexcan.c b/arch/arm/src/s32k1xx/s32k1xx_flexcan.c
index 74a21b8..7046050 100644
--- a/arch/arm/src/s32k1xx/s32k1xx_flexcan.c
+++ b/arch/arm/src/s32k1xx/s32k1xx_flexcan.c
@@ -115,20 +115,19 @@
 #  error "Need at least one RX buffer"
 #endif*/
 
-#define S32K1XX_FLEXCAN_FIRST_TX_MB 10
-
 #define MaskStdID                   0x000007FF;
 #define MaskExtID                   0x1FFFFFFF;
 
 //Fixme nice variables/constants
-#define NumMBinFiFoAndFilters       10 //FIXME
-#define NumTxMesgBuffers            6
-#define HWMaxMB                     16
-#define TXMBMask                    (0b111111 << NumMBinFiFoAndFilters)
+#define RxMBCount                   10
+#define TxMBCount                   6
+#define TotalMBcount                RxMBCount + TxMBCount
+#define TXMBMask                    (((1 << TxMBCount)-1) << RxMBCount)
 
 #define CAN_FIFO_NE                 (1 << 5)
 #define CAN_FIFO_OV                 (1 << 6)
 #define CAN_FIFO_WARN               (1 << 7)
+#define FIFO_IFLAG1                 CAN_FIFO_NE | CAN_FIFO_WARN | CAN_FIFO_OV
 
 static int peak_tx_mailbox_index_ = 0;
 
@@ -449,12 +448,12 @@ static int s32k1xx_transmit(FAR struct s32k1xx_driver_s *priv)
 
   struct can_frame *frame = (struct can_frame*)priv->dev.d_buf;
 
-  /*printf("CAN id: %i dlc: %i", frame->can_id, frame->can_dlc);
+  /*ninfo("CAN id: %i dlc: %i", frame->can_id, frame->can_dlc);
 
   for(int i = 0; i < frame->can_dlc; i++){
-	  printf(" %02X", frame->data[i]);
+	  ninfo(" %02X", frame->data[i]);
   }
-  printf("\r\n");*/
+  ninfo("\r\n");*/
 
   /* Attempt to write frame */
   uint32_t mbi = 0;
@@ -463,9 +462,9 @@ static int s32k1xx_transmit(FAR struct s32k1xx_driver_s *priv)
 	  mbi = (getreg32(S32K1XX_CAN0_ESR2) & CAN_ESR2_LPTM_MASK) >> CAN_ESR2_LPTM_SHIFT;
   }
 
-  uint32_t mb_bit = 1 << (NumMBinFiFoAndFilters + mbi);
+  uint32_t mb_bit = 1 << (RxMBCount + mbi);
 
-  while (mbi < NumTxMesgBuffers)
+  while (mbi < TxMBCount)
   {
 
 	  if (priv->tx[mbi].CS.code != CAN_TXMB_DATAORREMOTE)
@@ -477,7 +476,7 @@ static int s32k1xx_transmit(FAR struct s32k1xx_driver_s *priv)
 	  mbi++;
   }
 
-  if (mbi == NumTxMesgBuffers)
+  if (mbi == TxMBCount)
   {
 	  return 0;       // No transmission for you!
   }
@@ -502,7 +501,8 @@ static int s32k1xx_transmit(FAR struct s32k1xx_driver_s *priv)
   //cs.rtr = frame.isRemoteTransmissionRequest();
 
   cs.dlc = frame->can_dlc;
-  //FIXME endian swap instruction or somekind
+
+  //FIXME endian swap instruction or somekind takes 1.5us right now
   mb->data.b0 = frame->data[0];
   mb->data.b1 = frame->data[1];
   mb->data.b2 = frame->data[2];
@@ -522,6 +522,9 @@ static int s32k1xx_transmit(FAR struct s32k1xx_driver_s *priv)
   txi.abort_on_error = (flags & uavcan::CanIOFlagAbortOnError) != 0;
   txi.pending        = TxItem::busy;*/
 
+
+  s32k1xx_gpiowrite(PIN_PORTD | PIN31, 0);
+
   mb->CS = cs; // Go.
 
   uint32_t regval;
@@ -641,7 +644,7 @@ static inline void s32k1xx_dispatch(FAR struct s32k1xx_driver_s *priv)
 static void s32k1xx_receive(FAR struct s32k1xx_driver_s *priv)
 {
   #warning Missing logic
-	printf("FLEXCAN: receive\r\n");
+	ninfo("FLEXCAN: receive\r\n");
 }
 
 /****************************************************************************
@@ -673,14 +676,14 @@ static void s32k1xx_txdone(FAR struct s32k1xx_driver_s *priv)
 
   /* Process TX completions */
 
-  uint32_t mb_bit = 1 << NumMBinFiFoAndFilters;
-  for(uint32_t mbi = 0; tx_iflags && mbi < NumTxMesgBuffers; mbi++)
+  uint32_t mb_bit = 1 << RxMBCount;
+  for(uint32_t mbi = 0; tx_iflags && mbi < TxMBCount; mbi++)
   {
       if (tx_iflags & mb_bit)
       {
     	  putreg32(mb_bit, S32K1XX_CAN0_IFLAG1);
           tx_iflags &= ~mb_bit;
-          const bool txok = priv->tx[mbi].CS.code != CAN_TXMB_ABORT;
+          //const bool txok = priv->tx[mbi].CS.code != CAN_TXMB_ABORT;
           //handleTxMailboxInterrupt(mbi, txok, utc_usec);
       }
       mb_bit <<= 1;
@@ -734,8 +737,9 @@ static int s32k1xx_flexcan_interrupt(int irq, FAR void *context, FAR void *arg)
 {
   #warning Missing logic
 
+	ninfo("FLEXCAN INT %i\r\n", irq);
+
 	FAR struct s32k1xx_driver_s *priv = &g_flexcan[0];
-	uint32_t FIFO_IFLAG1 = CAN_FIFO_NE | CAN_FIFO_WARN | CAN_FIFO_OV;
 	uint32_t flags;
 	flags  = getreg32(S32K1XX_CAN0_IFLAG1);
 	flags &= FIFO_IFLAG1;
@@ -773,7 +777,7 @@ static int s32k1xx_flexcan_interrupt(int irq, FAR void *context, FAR void *arg)
 static void s32k1xx_txtimeout_work(FAR void *arg)
 {
   #warning Missing logic
-	  printf("FLEXCAN: tx timeout work\r\n");
+	  ninfo("FLEXCAN: tx timeout work\r\n");
 }
 
 /****************************************************************************
@@ -798,7 +802,7 @@ static void s32k1xx_txtimeout_work(FAR void *arg)
 static void s32k1xx_txtimeout_expiry(int argc, uint32_t arg, ...)
 {
   #warning Missing logic
-	  printf("FLEXCAN: tx timeout expiry\r\n");
+	  ninfo("FLEXCAN: tx timeout expiry\r\n");
 }
 
 /****************************************************************************
@@ -821,7 +825,7 @@ static void s32k1xx_txtimeout_expiry(int argc, uint32_t arg, ...)
 static void s32k1xx_poll_work(FAR void *arg)
 {
   #warning Missing logic
-	  //printf("FLEXCAN: poll work\r\n");
+	  //ninfo("FLEXCAN: poll work\r\n");
 
 	  FAR struct s32k1xx_driver_s *priv = (FAR struct s32k1xx_driver_s *)arg;
 
@@ -941,11 +945,14 @@ static int s32k1xx_ifup(struct net_driver_s *dev)
   uint32_t regval;
 
   #warning Missing logic
-  printf("FLEXCAN: test ifup\r\n");
+  ninfo("FLEXCAN: test ifup\r\n");
 
   /* initialize CAN device */
   //FIXME we only support a single can device for now
 
+  //TEST GPIO tming
+  s32k1xx_pinconfig(PIN_PORTD | PIN31 | GPIO_OUTPUT);
+
 
   regval  = getreg32(S32K1XX_CAN0_MCR);
   regval |= CAN_MCR_MDIS;
@@ -964,7 +971,7 @@ static int s32k1xx_ifup(struct net_driver_s *dev)
   regval  = getreg32(S32K1XX_CAN0_MCR);
   regval |= CAN_MCR_RFEN | CAN_MCR_SLFWAK | CAN_MCR_WRNEN | CAN_MCR_SRXDIS
 		  | CAN_MCR_IRMQ | CAN_MCR_AEN |
-		  (((HWMaxMB - 1) << CAN_MCR_MAXMB_SHIFT) & CAN_MCR_MAXMB_MASK);
+		  (((TotalMBcount - 1) << CAN_MCR_MAXMB_SHIFT) & CAN_MCR_MAXMB_MASK);
   putreg32(regval, S32K1XX_CAN0_MCR);
 
   regval  = CAN_CTRL2_RRS | CAN_CTRL2_EACEN | CAN_CTRL2_RFFN_16MB; //FIXME TASD
@@ -974,7 +981,7 @@ static int s32k1xx_ifup(struct net_driver_s *dev)
   s32k1xx_setfreeze(1);
   if(!s32k1xx_waitfreezeack_change(1))
   {
-	  printf("FLEXCAN: freeze fail\r\n");
+	  ninfo("FLEXCAN: freeze fail\r\n");
 	  return -1;
   }
 
@@ -1035,50 +1042,35 @@ static int s32k1xx_ifup(struct net_driver_s *dev)
 #endif
 
 
-  /* Filtering catchall */
-  putreg32(0, S32K1XX_CAN0_RXFGMASK);
 
   /* Iniatilize all MB rx and tx */
-  /*for(int i = 0; i < HWMaxMB; i++)
+  for(int i = 0; i < TotalMBcount; i++)
   {
+	  ninfo("MB %i %p\r\n", i, &priv->rx[i]);
+	  ninfo("MB %i %p\r\n", i, &priv->rx[i].ID.w);
 	  priv->rx[i].CS.cs = 0x0;
 	  priv->rx[i].ID.w = 0x0;
 	  priv->rx[i].data.l = 0x0;
 	  priv->rx[i].data.h = 0x0;
-  }*/
+  }
+
+  /* Filtering catchall */
+  putreg32(0x0, S32K1XX_CAN0_RXFGMASK);
 
-  //FIXME max mb
-  for(int i = 0; i < HWMaxMB; i++)
+  for(int i = 0; i < TotalMBcount; i++)
   {
 	  putreg32(0,S32K1XX_CAN0_RXIMR(i));
   }
 
-  putreg32(0,S32K1XX_CAN0_RXIMR0);
-  putreg32(0,S32K1XX_CAN0_RXIMR1);
-  putreg32(0,S32K1XX_CAN0_RXIMR2);
-  putreg32(0,S32K1XX_CAN0_RXIMR3);
-  putreg32(0,S32K1XX_CAN0_RXIMR4);
-  putreg32(0,S32K1XX_CAN0_RXIMR5);
-  putreg32(0,S32K1XX_CAN0_RXIMR6);
-  putreg32(0,S32K1XX_CAN0_RXIMR7);
-  putreg32(0,S32K1XX_CAN0_RXIMR8);
-  putreg32(0,S32K1XX_CAN0_RXIMR9);
-  putreg32(0,S32K1XX_CAN0_RXIMR10);
-  putreg32(0,S32K1XX_CAN0_RXIMR11);
-  putreg32(0,S32K1XX_CAN0_RXIMR12);
-  putreg32(0,S32K1XX_CAN0_RXIMR13);
-  putreg32(0,S32K1XX_CAN0_RXIMR14);
-  putreg32(0,S32K1XX_CAN0_RXIMR15);
-
-  putreg32(CAN_IFLAG1(1) | TXMBMask, S32K1XX_CAN0_IFLAG1); //FIXME dynamic MXMB
-  putreg32(CAN_IFLAG1(1), S32K1XX_CAN0_IMASK1);
+  putreg32(FIFO_IFLAG1 | TXMBMask, S32K1XX_CAN0_IFLAG1);
+  putreg32(FIFO_IFLAG1, S32K1XX_CAN0_IMASK1);
 
 
   /* Exit freeze mode */
   s32k1xx_setfreeze(0);
   if(!s32k1xx_waitfreezeack_change(0))
   {
-	  printf("FLEXCAN: unfreeze fail\r\n");
+	  ninfo("FLEXCAN: unfreeze fail\r\n");
 	  return -1;
   }
 
@@ -1381,7 +1373,7 @@ int s32k1xx_netinitialize(int intf)
   priv->txtimeout     = wd_create();      /* Create TX timeout timer */
   priv->rx            = (struct MbRx *)(S32K1XX_CAN0_MB);
   priv->tx            = (struct MbTx *)(S32K1XX_CAN0_MB + (sizeof(struct MbRx)
-		                                * S32K1XX_FLEXCAN_FIRST_TX_MB) );
+		                                * RxMBCount) );
 
   /* Put the interface in the down state.  This usually amounts to resetting
    * the device and/or calling s32k1xx_ifdown().