CAN: Reduce nesting level via code transformations.

This commit is contained in:
Uwe Hermann 2010-12-26 00:34:14 +01:00
parent 06d1a5ca80
commit 571c4d37d0
2 changed files with 93 additions and 95 deletions

View File

@ -150,26 +150,25 @@ void sys_tick_handler(void)
static int temp32 = 0; static int temp32 = 0;
static u8 data[8] = {0, 1, 2, 0, 0, 0, 0, 0}; static u8 data[8] = {0, 1, 2, 0, 0, 0, 0, 0};
temp32++;
/* We call this handler every 1ms so 1000ms = 1s on/off. */ /* We call this handler every 1ms so 1000ms = 1s on/off. */
if (temp32 == 1000) { if (++temp32 != 1000)
temp32 = 0; return;
/* Transmit CAN frame. */ temp32 = 0;
data[0]++;
if (can_transmit(CAN1, /* Transmit CAN frame. */
0, /* (EX/ST)ID: CAN ID */ data[0]++;
false, /* IDE: CAN ID extended? */ if (can_transmit(CAN1,
false, /* RTR: Request transmit? */ 0, /* (EX/ST)ID: CAN ID */
8, /* DLC: Data length */ false, /* IDE: CAN ID extended? */
data) == -1) false, /* RTR: Request transmit? */
{ 8, /* DLC: Data length */
gpio_set(GPIOA, GPIO6); /* LED0 off */ data) == -1)
gpio_set(GPIOA, GPIO7); /* LED1 off */ {
gpio_clear(GPIOB, GPIO0); /* LED2 on */ gpio_set(GPIOA, GPIO6); /* LED0 off */
gpio_set(GPIOB, GPIO1); /* LED3 off */ gpio_set(GPIOA, GPIO7); /* LED1 off */
} gpio_clear(GPIOB, GPIO0); /* LED2 on */
gpio_set(GPIOB, GPIO1); /* LED3 off */
} }
} }

153
lib/can.c
View File

@ -31,9 +31,8 @@ void can_reset(u32 canport)
} }
} }
int can_init(u32 canport, int can_init(u32 canport, bool ttcm, bool abom, bool awum, bool nart,
bool ttcm, bool abom, bool awum, bool nart, bool rflm, bool txfp, bool rflm, bool txfp, u32 sjw, u32 ts1, u32 ts2, u32 brp)
u32 sjw, u32 ts1, u32 ts2, u32 brp)
{ {
u32 wait_ack = 0x00000000; u32 wait_ack = 0x00000000;
u32 can_msr_inak_timeout = 0x0000FFFF; u32 can_msr_inak_timeout = 0x0000FFFF;
@ -52,58 +51,57 @@ int can_init(u32 canport,
} }
/* Check the acknowledge. */ /* Check the acknowledge. */
if ((CAN_MSR(canport) & CAN_MSR_INAK) != CAN_MSR_INAK) { if ((CAN_MSR(canport) & CAN_MSR_INAK) != CAN_MSR_INAK)
ret = 1; return 1;
} else {
/* Set the automatic bus-off management. */
if (ttcm)
CAN_MCR(canport) |= CAN_MCR_TTCM;
else
CAN_MCR(canport) &= ~CAN_MCR_TTCM;
if (abom) /* Set the automatic bus-off management. */
CAN_MCR(canport) |= CAN_MCR_ABOM; if (ttcm)
else CAN_MCR(canport) |= CAN_MCR_TTCM;
CAN_MCR(canport) &= ~CAN_MCR_ABOM; else
CAN_MCR(canport) &= ~CAN_MCR_TTCM;
if (awum) if (abom)
CAN_MCR(canport) |= CAN_MCR_AWUM; CAN_MCR(canport) |= CAN_MCR_ABOM;
else else
CAN_MCR(canport) &= ~CAN_MCR_AWUM; CAN_MCR(canport) &= ~CAN_MCR_ABOM;
if (nart) if (awum)
CAN_MCR(canport) |= CAN_MCR_NART; CAN_MCR(canport) |= CAN_MCR_AWUM;
else else
CAN_MCR(canport) &= ~CAN_MCR_NART; CAN_MCR(canport) &= ~CAN_MCR_AWUM;
if (rflm) if (nart)
CAN_MCR(canport) |= CAN_MCR_RFLM; CAN_MCR(canport) |= CAN_MCR_NART;
else else
CAN_MCR(canport) &= ~CAN_MCR_RFLM; CAN_MCR(canport) &= ~CAN_MCR_NART;
if (txfp) if (rflm)
CAN_MCR(canport) |= CAN_MCR_TXFP; CAN_MCR(canport) |= CAN_MCR_RFLM;
else else
CAN_MCR(canport) &= ~CAN_MCR_TXFP; CAN_MCR(canport) &= ~CAN_MCR_RFLM;
/* Set bit timings. */ if (txfp)
CAN_BTR(canport) = sjw | ts2 | ts1 | CAN_MCR(canport) |= CAN_MCR_TXFP;
(u32)(CAN_BTR_BRP_MASK & (brp - 1)); else
CAN_MCR(canport) &= ~CAN_MCR_TXFP;
/* Request initialization "leave". */ /* Set bit timings. */
CAN_MCR(canport) &= ~CAN_MCR_INRQ; CAN_BTR(canport) = sjw | ts2 | ts1 |
(u32)(CAN_BTR_BRP_MASK & (brp - 1));
/* Wait for acknowledge. */ /* Request initialization "leave". */
wait_ack = 0x00000000; CAN_MCR(canport) &= ~CAN_MCR_INRQ;
while ((wait_ack != can_msr_inak_timeout) &&
((CAN_MSR(canport) & CAN_MSR_INAK) == CAN_MSR_INAK)) {
wait_ack++;
}
if ((CAN_MSR(canport) & CAN_MSR_INAK) == CAN_MSR_INAK) /* Wait for acknowledge. */
ret = 1; wait_ack = 0x00000000;
while ((wait_ack != can_msr_inak_timeout) &&
((CAN_MSR(canport) & CAN_MSR_INAK) == CAN_MSR_INAK)) {
wait_ack++;
} }
if ((CAN_MSR(canport) & CAN_MSR_INAK) == CAN_MSR_INAK)
ret = 1;
return ret; return ret;
} }
@ -209,42 +207,43 @@ int can_transmit(u32 canport, u32 id, bool ext, bool rtr, u8 length, u8 *data)
ret = -1; ret = -1;
} }
if (ret != -1) { /* Check if we have an empty mailbox. */ /* Check if we have an empty mailbox. */
if (ext) { if (ret == -1)
/* Set extended ID. */ return ret;
CAN_TIxR(canport, mailbox) |= id << CAN_TIxR_EXID_SHIFT;
/* Set extended ID indicator bit. */
CAN_TIxR(canport, mailbox) |= CAN_TIxR_IDE;
} else {
/* Set standard ID. */
CAN_TIxR(canport, mailbox) |= id << CAN_TIxR_STID_SHIFT;
/* Unset extended ID indicator bit. */
CAN_TIxR(canport, mailbox) &= ~CAN_TIxR_IDE;
}
/* Set/clear remote transmission request bit. */ if (ext) {
if (rtr) /* Set extended ID. */
CAN_TIxR(canport, mailbox) |= CAN_TIxR_RTR; /* Set */ CAN_TIxR(canport, mailbox) |= id << CAN_TIxR_EXID_SHIFT;
else /* Set extended ID indicator bit. */
CAN_TIxR(canport, mailbox) &= ~CAN_TIxR_RTR; /* Clear */ CAN_TIxR(canport, mailbox) |= CAN_TIxR_IDE;
} else {
/* Set the DLC. */ /* Set standard ID. */
CAN_TDTxR(canport, mailbox) &= 0xFFFFFFFF0; CAN_TIxR(canport, mailbox) |= id << CAN_TIxR_STID_SHIFT;
CAN_TDTxR(canport, mailbox) |= length & CAN_TDTxR_DLC_MASK; /* Unset extended ID indicator bit. */
CAN_TIxR(canport, mailbox) &= ~CAN_TIxR_IDE;
/* Set the data. */
CAN_TDLxR(canport, mailbox) = 0;
CAN_TDHxR(canport, mailbox) = 0;
for (i = 0; (i < 4) && (i < length); i++)
CAN_TDLxR(canport, mailbox) |= (u32)data[i] << (8 * i);
for (i = 4; (i < 8) && (i < length); i++)
CAN_TDHxR(canport, mailbox)
|= (u32)data[i] << (8 * (i - 4));
/* Request transmission. */
CAN_TIxR(canport, mailbox) |= CAN_TIxR_TXRQ;
} }
/* Set/clear remote transmission request bit. */
if (rtr)
CAN_TIxR(canport, mailbox) |= CAN_TIxR_RTR; /* Set */
else
CAN_TIxR(canport, mailbox) &= ~CAN_TIxR_RTR; /* Clear */
/* Set the DLC. */
CAN_TDTxR(canport, mailbox) &= 0xFFFFFFFF0;
CAN_TDTxR(canport, mailbox) |= length & CAN_TDTxR_DLC_MASK;
/* Set the data. */
CAN_TDLxR(canport, mailbox) = 0;
CAN_TDHxR(canport, mailbox) = 0;
for (i = 0; (i < 4) && (i < length); i++)
CAN_TDLxR(canport, mailbox) |= (u32)data[i] << (8 * i);
for (i = 4; (i < 8) && (i < length); i++)
CAN_TDHxR(canport, mailbox) |= (u32)data[i] << (8 * (i - 4));
/* Request transmission. */
CAN_TIxR(canport, mailbox) |= CAN_TIxR_TXRQ;
return ret; return ret;
} }