summaryrefslogtreecommitdiff
path: root/nuttx/arch/arm/src/lpc17xx
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-01-20 21:52:35 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-01-20 21:52:35 +0000
commit1a0b77740ae6317e7a9a512489bc74cecb4a5fdf (patch)
tree82926d6798d4193b9d1c0421d0b496acced412ae /nuttx/arch/arm/src/lpc17xx
parent49c358953f0d1462456a666cdf141346884d655d (diff)
downloadpx4-nuttx-1a0b77740ae6317e7a9a512489bc74cecb4a5fdf.tar.gz
px4-nuttx-1a0b77740ae6317e7a9a512489bc74cecb4a5fdf.tar.bz2
px4-nuttx-1a0b77740ae6317e7a9a512489bc74cecb4a5fdf.zip
Add support for extended (29-bit) CAN IDs
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@4319 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/arch/arm/src/lpc17xx')
-rwxr-xr-xnuttx/arch/arm/src/lpc17xx/lpc17_can.c57
1 files changed, 41 insertions, 16 deletions
diff --git a/nuttx/arch/arm/src/lpc17xx/lpc17_can.c b/nuttx/arch/arm/src/lpc17xx/lpc17_can.c
index 0494904cf..409785d29 100755
--- a/nuttx/arch/arm/src/lpc17xx/lpc17_can.c
+++ b/nuttx/arch/arm/src/lpc17xx/lpc17_can.c
@@ -745,20 +745,39 @@ 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)
{
FAR struct up_dev_s *priv = (FAR struct up_dev_s *)dev->cd_priv;
- uint32_t tid = CAN_ID(msg->cm_hdr);
- uint32_t tfi = CAN_DLC(msg->cm_hdr) << 16;
+ uint32_t tid = (uint32_t)msg->cm_hdr.ch_id;
+ uint32_t tfi = (uint32_t)msg->cm_hdr.ch_dlc << 16;
uint32_t regval;
irqstate_t flags;
int ret = OK;
- canvdbg("CAN%d ID: %d DLC: %d\n",
- priv->port, CAN_ID(msg->cm_hdr), CAN_DLC(msg->cm_hdr));
+ canvdbg("CAN%d ID: %d DLC: %d\n", priv->port, msg->cm_hdr.ch_id, msg->cm_hdr.ch_dlc);
- if (CAN_RTR(msg->cm_hdr))
+ if (msg->cm_hdr.ch_rtr)
{
tfi |= CAN_TFI_RTR;
}
+ /* Set the FF bit in the TFI register if this message should be sent with
+ * the extended frame format (and 29-bit extened ID).
+ */
+
+#ifdef CONFIG_CAN_EXTID
+ if (msg->cm_hdr.ch_extid)
+ {
+ /* The provided ID should be 29 bits */
+
+ DEBUGASSERT((tid & ~CAN_TID_ID29_MASK) == 0);
+ tfi |= CAN_TFI_FF;
+ }
+ else
+#endif
+ {
+ /* The provided ID should be 11 bits */
+
+ DEBUGASSERT((tid & ~CAN_TID_ID11_MASK) == 0);
+ }
+
flags = irqsave();
/* Pick a transmit buffer */
@@ -927,14 +946,11 @@ static bool can_txempty(FAR struct can_dev_s *dev)
static void can_interrupt(FAR struct can_dev_s *dev)
{
FAR struct up_dev_s *priv = (FAR struct up_dev_s *)dev->cd_priv;
+ struct can_hdr_s hdr;
uint32_t data[2];
uint32_t rfs;
uint32_t rid;
uint32_t regval;
- uint16_t hdr;
- uint16_t id;
- uint16_t dlc;
- uint16_t rtr;
/* Read the interrupt and capture register (also clearing most status bits) */
@@ -956,14 +972,23 @@ static void can_interrupt(FAR struct can_dev_s *dev)
/* Construct the CAN header */
- id = rid & CAN_RID_ID11_MASK;
- dlc = (rfs & CAN_RFS_DLC_MASK) >> CAN_RFS_DLC_SHIFT;
- rtr = ((rfs & CAN_RFS_RTR) != 0);
- hdr = CAN_HDR(id, rtr, dlc);
-
- /* Process the received CAN packet */
+ hdr.ch_id = rid;
+ hdr.ch_rtr = ((rfs & CAN_RFS_RTR) != 0);
+ hdr.ch_dlc = (rfs & CAN_RFS_DLC_MASK) >> CAN_RFS_DLC_SHIFT;
+#ifdef CONFIG_CAN_EXTID
+ hdr.ch_extid = ((rfs & CAN_RFS_FF) != 0);
+#else
+ if ((rfs & CAN_RFS_FF) != 0)
+ {
+ canlldbg("ERROR: Received message with extended identifier. Dropped\n");
+ }
+ else
+#endif
+ {
+ /* Process the received CAN packet */
- can_receive(dev, hdr, (uint8_t *)data);
+ can_receive(dev, &hdr, (uint8_t *)data);
+ }
}
/* Check for TX buffer 1 complete */