summaryrefslogtreecommitdiff
path: root/nuttx/arch/arm/src/stm32/stm32_can.c
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-01-11 00:13:45 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-01-11 00:13:45 +0000
commit7c4f2d571c68db93f4ed9a5f9e0d0ed15a9fdadf (patch)
tree96ec87d007490dac1654e9c213b937d099a8478f /nuttx/arch/arm/src/stm32/stm32_can.c
parent2878c08369c4ac8819e0f6530784f22509bcab92 (diff)
downloadnuttx-7c4f2d571c68db93f4ed9a5f9e0d0ed15a9fdadf.tar.gz
nuttx-7c4f2d571c68db93f4ed9a5f9e0d0ed15a9fdadf.tar.bz2
nuttx-7c4f2d571c68db93f4ed9a5f9e0d0ed15a9fdadf.zip
Implement the new CAN txready method for STM32
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@4291 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.c45
1 files changed, 43 insertions, 2 deletions
diff --git a/nuttx/arch/arm/src/stm32/stm32_can.c b/nuttx/arch/arm/src/stm32/stm32_can.c
index 08f932b37..bf83773a9 100755
--- a/nuttx/arch/arm/src/stm32/stm32_can.c
+++ b/nuttx/arch/arm/src/stm32/stm32_can.c
@@ -130,6 +130,7 @@ static void can_txint(FAR struct can_dev_s *dev, bool enable);
static int can_ioctl(FAR struct can_dev_s *dev, int cmd, unsigned long arg);
static int can_remoterequest(FAR struct can_dev_s *dev, uint16_t id);
static int can_send(FAR struct can_dev_s *dev, FAR struct can_msg_s *msg);
+static bool can_txready(FAR struct can_dev_s *dev);
static bool can_txempty(FAR struct can_dev_s *dev);
/* CAN interrupt handling */
@@ -156,6 +157,7 @@ static const struct can_ops_s g_canops =
.co_ioctl = can_ioctl,
.co_remoterequest = can_remoterequest,
.co_send = can_send,
+ .co_txready = can_txready,
.co_txempty = can_txempty,
};
@@ -869,6 +871,45 @@ static int can_send(FAR struct can_dev_s *dev, FAR struct can_msg_s *msg)
}
/****************************************************************************
+ * Name: can_txready
+ *
+ * Description:
+ * Return true if the CAN hardware can accept another TX message.
+ *
+ * Input Parameters:
+ * dev - An instance of the "upper half" can driver state structure.
+ *
+ * Returned Value:
+ * True if the CAN hardware is ready to accept another TX message.
+ *
+ ****************************************************************************/
+
+static bool can_txready(FAR struct can_dev_s *dev)
+{
+ FAR struct stm32_can_s *priv = dev->cd_priv;
+ uint32_t regval;
+
+ /* Return true if any mailbox is available */
+
+ regval = can_getreg(priv, STM32_CAN_TSR_OFFSET);
+ canllvdbg("CAN%d TSR: %08x\n", priv->port, regval);
+
+ if ((regval & CAN_TSR_TME0) != 0)
+ {
+ return true;
+ }
+ else if ((regval & CAN_TSR_TME1) != 0)
+ {
+ return true;
+ }
+ else if ((regval & CAN_TSR_TME2) != 0)
+ {
+ return true;
+ }
+ return false;
+}
+
+/****************************************************************************
* Name: can_txempty
*
* Description:
@@ -882,7 +923,7 @@ static int can_send(FAR struct can_dev_s *dev, FAR struct can_msg_s *msg)
* dev - An instance of the "upper half" can driver state structure.
*
* Returned Value:
- * Zero on success; a negated errno on failure
+ * True if there are no pending TX transfers in the CAN hardware.
*
****************************************************************************/
@@ -1240,7 +1281,7 @@ static int can_cellinit(struct stm32_can_s *priv)
regval &= ~CAN_MCR_INRQ;
can_putreg(priv, STM32_CAN_MCR_OFFSET, regval);
- /* Wait until initialization mode is acknowledged */
+ /* Wait until the initialization mode exit is acknowledged */
for (timeout = INAK_TIMEOUT; timeout > 0; timeout--)
{