summaryrefslogtreecommitdiff
path: root/nuttx/arch/arm/src/stm32/stm32_can.c
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2011-12-22 21:55:54 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2011-12-22 21:55:54 +0000
commit9e3c18cfd114ffd892ead66460e9bc040904c25d (patch)
treede611df330178a7c539127b3d7f26e5420094a7b /nuttx/arch/arm/src/stm32/stm32_can.c
parenta8ab2aef243697e99a0c9eba0b9d9fba98444b27 (diff)
downloadpx4-nuttx-9e3c18cfd114ffd892ead66460e9bc040904c25d.tar.gz
px4-nuttx-9e3c18cfd114ffd892ead66460e9bc040904c25d.tar.bz2
px4-nuttx-9e3c18cfd114ffd892ead66460e9bc040904c25d.zip
Update to the STM32 ADC and CAN drivers
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@4215 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/arch/arm/src/stm32/stm32_can.c')
-rwxr-xr-xnuttx/arch/arm/src/stm32/stm32_can.c182
1 files changed, 174 insertions, 8 deletions
diff --git a/nuttx/arch/arm/src/stm32/stm32_can.c b/nuttx/arch/arm/src/stm32/stm32_can.c
index 1519027e4..f6cb54efe 100755
--- a/nuttx/arch/arm/src/stm32/stm32_can.c
+++ b/nuttx/arch/arm/src/stm32/stm32_can.c
@@ -85,6 +85,10 @@
# define canllvdbg(x...)
#endif
+#if !defined(CONFIG_DEBUG) || !defined(CONFIG_DEBUG_CAN)
+# undef CONFIG_CAN_REGDEBUG
+#endif
+
/****************************************************************************
* Private Types
****************************************************************************/
@@ -106,6 +110,15 @@ struct stm32_can_s
static uint32_t can_getreg(struct stm32_can_s *priv, int offset);
static void can_putreg(struct stm32_can_s *priv, int offset, uint32_t value);
+#ifdef CONFIG_CAN_REGDEBUG
+static void can_dumpctrlregs(struct stm32_can_s *priv, FAR const char *msg);
+static void can_dumpmbregs(struct stm32_can_s *priv, FAR const char *msg);
+static void can_dumpfiltregs(struct stm32_can_s *priv, FAR const char *msg);
+#else
+# define can_dumpctrlregs(priv,msg)
+# define can_dumpmbregs(priv,msg)
+# define can_dumpfiltregs(priv,msg)
+#endif
/* CAN driver methods */
@@ -218,6 +231,7 @@ static uint32_t can_getreg(struct stm32_can_s *priv, int offset)
* offset - The offset to the register to read
*
* Returned Value:
+ * None
*
****************************************************************************/
@@ -227,6 +241,154 @@ static void can_putreg(struct stm32_can_s *priv, int offset, uint32_t value)
}
/****************************************************************************
+ * Name: can_dumpctrlregs
+ *
+ * Description:
+ * Dump the contents of all CAN control registers
+ *
+ * Input Parameters:
+ * priv - A reference to the CAN block status
+ *
+ * Returned Value:
+ * None
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_CAN_REGDEBUG
+static void can_dumpctrlregs(struct stm32_can_s *priv, FAR const char *msg)
+{
+ if (msg)
+ {
+ canlldbg("Control Registers: %s\n", msg);
+ }
+ else
+ {
+ canlldbg("Control Registers:\n");
+ }
+
+ /* CAN control and status registers */
+
+ lldbg(" MCR: %08x MSR: %08x TSR: %08x\n",
+ can_getreg(priv, STM32_CAN_MCR_OFFSET),
+ can_getreg(priv, STM32_CAN_MSR_OFFSET),
+ can_getreg(priv, STM32_CAN_TSR_OFFSET));
+
+ lldbg(" RF0R: %08x RF1R: %08x\n",
+ can_getreg(priv, STM32_CAN_RF0R_OFFSET),
+ can_getreg(priv, STM32_CAN_RF1R_OFFSET));
+
+ lldbg(" IER: %08x ESR: %08x BTR: %08x\n",
+ can_getreg(priv, STM32_CAN_IER_OFFSET),
+ can_getreg(priv, STM32_CAN_ESR_OFFSET),
+ can_getreg(priv, STM32_CAN_BTR_OFFSET));
+}
+#endif
+
+/****************************************************************************
+ * Name: can_dumpmbregs
+ *
+ * Description:
+ * Dump the contents of all CAN mailbox registers
+ *
+ * Input Parameters:
+ * priv - A reference to the CAN block status
+ *
+ * Returned Value:
+ * None
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_CAN_REGDEBUG
+static void can_dumpmbregs(struct stm32_can_s *priv, FAR const char *msg)
+{
+ if (msg)
+ {
+ canlldbg("Mailbox Registers: %s\n", msg);
+ }
+ else
+ {
+ canlldbg("Mailbox Registers:\n");
+ }
+
+ /* CAN mailbox registers (3 TX and 2 RX) */
+
+ lldbg(" TI0R: %08x TDT0R: %08x TDL0R: %08x TDH0R: %08x\n",
+ can_getreg(priv, STM32_CAN_TI0R_OFFSET),
+ can_getreg(priv, STM32_CAN_TDT0R_OFFSET),
+ can_getreg(priv, STM32_CAN_TDL0R_OFFSET),
+ can_getreg(priv, STM32_CAN_TDH0R_OFFSET));
+
+ lldbg(" TI1R: %08x TDT1R: %08x TDL1R: %08x TDH1R: %08x\n",
+ can_getreg(priv, STM32_CAN_TI1R_OFFSET),
+ can_getreg(priv, STM32_CAN_TDT1R_OFFSET),
+ can_getreg(priv, STM32_CAN_TDL1R_OFFSET),
+ can_getreg(priv, STM32_CAN_TDH1R_OFFSET));
+
+ lldbg(" TI2R: %08x TDT2R: %08x TDL2R: %08x TDH2R: %08x\n",
+ can_getreg(priv, STM32_CAN_TI2R_OFFSET),
+ can_getreg(priv, STM32_CAN_TDT2R_OFFSET),
+ can_getreg(priv, STM32_CAN_TDL2R_OFFSET),
+ can_getreg(priv, STM32_CAN_TDH2R_OFFSET));
+
+ lldbg(" RI0R: %08x RDT0R: %08x RDL0R: %08x RDH0R: %08x\n",
+ can_getreg(priv, STM32_CAN_RI0R_OFFSET),
+ can_getreg(priv, STM32_CAN_RDT0R_OFFSET),
+ can_getreg(priv, STM32_CAN_RDL0R_OFFSET),
+ can_getreg(priv, STM32_CAN_RDH0R_OFFSET));
+
+ lldbg(" RI1R: %08x RDT1R: %08x RDL1R: %08x RDH1R: %08x\n",
+ can_getreg(priv, STM32_CAN_RI1R_OFFSET),
+ can_getreg(priv, STM32_CAN_RDT1R_OFFSET),
+ can_getreg(priv, STM32_CAN_RDL1R_OFFSET),
+ can_getreg(priv, STM32_CAN_RDH1R_OFFSET));
+}
+#endif
+
+/****************************************************************************
+ * Name: can_dumpfiltregs
+ *
+ * Description:
+ * Dump the contents of all CAN filter registers
+ *
+ * Input Parameters:
+ * priv - A reference to the CAN block status
+ *
+ * Returned Value:
+ * None
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_CAN_REGDEBUG
+static void can_dumpfiltregs(struct stm32_can_s *priv, FAR const char *msg)
+{
+ int i;
+
+ if (msg)
+ {
+ canlldbg("Filter Registers: %s\n", msg);
+ }
+ else
+ {
+ canlldbg("Filter Registers:\n");
+ }
+
+ lldbg(" FMR: %08x FM1R: %08x FS1R: %08x FSA1R: %08x FA1R: %08x\n",
+ can_getreg(priv, STM32_CAN_FMR_OFFSET),
+ can_getreg(priv, STM32_CAN_FM1R_OFFSET),
+ can_getreg(priv, STM32_CAN_FS1R_OFFSET),
+ can_getreg(priv, STM32_CAN_FFA1R_OFFSET),
+ can_getreg(priv, STM32_CAN_FA1R_OFFSET));
+
+ for (i = 0; i < CAN_NFILTERS; i++)
+ {
+ lldbg(" F%dR1: %08x F%dR2: %08x\n",
+ i, can_getreg(priv, STM32_CAN_FR_OFFSET(i,1)),
+ i, can_getreg(priv, STM32_CAN_FR_OFFSET(i,2)));
+ }
+}
+#endif
+
+/****************************************************************************
* Name: can_reset
*
* Description:
@@ -310,7 +472,7 @@ static int can_setup(FAR struct can_dev_s *dev)
FAR struct stm32_can_s *priv = dev->cd_priv;
int ret;
- canllvdbg("CAN%d\n", priv->port);
+ canllvdbg("CAN%d irq: %d\n", priv->port, priv->canrx0);
/* CAN cell initialization */
@@ -321,6 +483,9 @@ static int can_setup(FAR struct can_dev_s *dev)
return ret;
}
+ can_dumpctrlregs(priv, "After cell initialization");
+ can_dumpmbregs(priv, NULL);
+
/* CAN filter initialization */
ret = can_filterinit(priv);
@@ -329,6 +494,7 @@ static int can_setup(FAR struct can_dev_s *dev)
canlldbg("CAN%d filter initialization failed: %d\n", priv->port, ret);
return ret;
}
+ can_dumpfiltregs(priv, "After filter initialization");
/* Attach only the CAN RX FIFO 0 interrupts. The others are not used */
@@ -626,6 +792,7 @@ static int can_send(FAR struct can_dev_s *dev, FAR struct can_msg_s *msg)
*/
(void)can_txdone(dev);
+ can_dumpmbregs(priv, "After send");
return OK;
}
@@ -728,6 +895,8 @@ static int can_rx0interrupt(int irq, void *context)
return OK;
}
+ can_dumpmbregs(priv, "RX0 interrupt");
+
/* Get the CAN identifier. Only standard 11-bit IDs are supported */
regval = can_getreg(priv, STM32_CAN_RI0R_OFFSET);
@@ -906,7 +1075,8 @@ static int can_bittiming(struct stm32_can_s *priv)
tmp = ((brp - 1) << CAN_BTR_BRP_SHIFT) | ((ts1 - 1) << CAN_BTR_TS1_SHIFT) |
((ts2 - 1) << CAN_BTR_TS2_SHIFT) | ((1 - 1) << CAN_BTR_SJW_SHIFT);
#ifdef CONFIG_CAN_LOOPBACK
- tmp |= (CAN_BTR_LBKM | CAN_BTR_SILM);
+//tmp |= (CAN_BTR_LBKM | CAN_BTR_SILM);
+ tmp |= CAN_BTR_LBKM;
#endif
can_putreg(priv, STM32_CAN_BTR_OFFSET, tmp);
@@ -1067,8 +1237,8 @@ static int can_filterinit(struct stm32_can_s *priv)
* composed of two 32-bit registers, CAN_FiR:
*/
- can_putreg(priv, STM32_CAN_FIR_OFFSET(priv->filter, 0), 0);
- can_putreg(priv, STM32_CAN_FIR_OFFSET(priv->filter, 1), 0);
+ can_putreg(priv, STM32_CAN_FR_OFFSET(priv->filter, 1), 0);
+ can_putreg(priv, STM32_CAN_FR_OFFSET(priv->filter, 2), 0);
/* Set Id/Mask mode for the filter */
@@ -1135,10 +1305,8 @@ FAR struct can_dev_s *stm32_caninitialize(int port)
* file must have been disambiguated in the board.h file.
*/
-#ifndef CONFIG_CAN_LOOPBACK
stm32_configgpio(GPIO_CAN1_RX);
stm32_configgpio(GPIO_CAN1_TX);
-#endif
}
else
#endif
@@ -1153,10 +1321,8 @@ FAR struct can_dev_s *stm32_caninitialize(int port)
* file must have been disambiguated in the board.h file.
*/
-#ifndef CONFIG_CAN_LOOPBACK
stm32_configgpio(GPIO_CAN2_RX);
stm32_configgpio(GPIO_CAN2_TX);
-#endif
}
else
#endif