summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Doerfler <Thomas.Doerfler@embedded-brains.de>2008-09-05 13:24:26 +0000
committerThomas Doerfler <Thomas.Doerfler@embedded-brains.de>2008-09-05 13:24:26 +0000
commit9a49a969e8286ef9f2a89973bfddff8678c47140 (patch)
treec526df1d2dcd7d123184cca89b82f3d259ca5d32
parentRemove bogus entry. (diff)
downloadrtems-9a49a969e8286ef9f2a89973bfddff8678c47140.tar.bz2
Improved parameter checks for bit rate function.
-rw-r--r--c/src/lib/libbsp/powerpc/gen5200/ChangeLog5
-rw-r--r--c/src/lib/libbsp/powerpc/gen5200/include/mscan-base.h10
-rw-r--r--c/src/lib/libbsp/powerpc/gen5200/mscan/mscan-base.c26
-rw-r--r--c/src/lib/libbsp/powerpc/gen5200/mscan/mscan.c27
-rw-r--r--c/src/lib/libbsp/powerpc/gen5200/mscan/mscan_int.h4
5 files changed, 43 insertions, 29 deletions
diff --git a/c/src/lib/libbsp/powerpc/gen5200/ChangeLog b/c/src/lib/libbsp/powerpc/gen5200/ChangeLog
index 6d05e01a48..bde33f95ab 100644
--- a/c/src/lib/libbsp/powerpc/gen5200/ChangeLog
+++ b/c/src/lib/libbsp/powerpc/gen5200/ChangeLog
@@ -1,3 +1,8 @@
+2008-09-04 Sebastian Huber <sebastian.huber@embedded-brains.de>
+
+ * include/mscan-base.h, mscan/mscan-base.c, mscan/mscan.c,
+ mscan/mscan_int.h: Improved parameter checks for bit rate function.
+
2008-09-03 Joel Sherrill <joel.sherrill@oarcorp.com>
* Makefile.am, bestcomm/load_task.c,
diff --git a/c/src/lib/libbsp/powerpc/gen5200/include/mscan-base.h b/c/src/lib/libbsp/powerpc/gen5200/include/mscan-base.h
index 46acb17bab..e7b1bcba7a 100644
--- a/c/src/lib/libbsp/powerpc/gen5200/include/mscan-base.h
+++ b/c/src/lib/libbsp/powerpc/gen5200/include/mscan-base.h
@@ -31,7 +31,11 @@
* @{
*/
-#define MSCAN_BIT_RATE_DEFAULT 100000
+#define MSCAN_BIT_RATE_MIN 10000
+
+#define MSCAN_BIT_RATE_MAX 1000000
+
+#define MSCAN_BIT_RATE_DEFAULT 125000
#define MSCAN_FILTER_NUMBER_MIN 0
@@ -231,13 +235,13 @@ typedef struct {
uint8_t tier;
} mscan_context;
-void mscan_enable( mscan *m, unsigned bit_rate);
+bool mscan_enable( mscan *m, unsigned bit_rate);
void mscan_disable( mscan *m);
void mscan_interrupts_disable( mscan *m);
-void mscan_set_bit_rate( mscan *m, unsigned bit_rate);
+bool mscan_set_bit_rate( mscan *m, unsigned bit_rate);
void mscan_initialization_mode_enter( mscan *m, mscan_context *context);
diff --git a/c/src/lib/libbsp/powerpc/gen5200/mscan/mscan-base.c b/c/src/lib/libbsp/powerpc/gen5200/mscan/mscan-base.c
index 8c308894df..78a3484e32 100644
--- a/c/src/lib/libbsp/powerpc/gen5200/mscan/mscan-base.c
+++ b/c/src/lib/libbsp/powerpc/gen5200/mscan/mscan-base.c
@@ -139,21 +139,33 @@ static uint8_t prescaler_calculation(
* @brief Sets the bit rate for the MSCAN module @a m to @a can_bit_rate
* in [bits/s].
*/
-void mscan_set_bit_rate( mscan *m, unsigned can_bit_rate)
+bool mscan_set_bit_rate( mscan *m, unsigned can_bit_rate)
{
mscan_context context;
- uint32_t prescale_val = 0;
+ unsigned prescale_val = 0;
uint8_t tq_no,
tseg_1,
tseg_2,
sseg;
+ if (can_bit_rate < MSCAN_BIT_RATE_MIN || can_bit_rate > MSCAN_BIT_RATE_MAX) {
+ return false;
+ }
+
/* Enter initialization mode */
mscan_initialization_mode_enter( m, &context);
/* get optimized prescaler value */
prescale_val = prescaler_calculation(can_bit_rate, IPB_CLOCK, &tq_no);
+ /* Check prescaler value */
+ if (prescale_val > 64) {
+ /* Leave initialization mode */
+ mscan_initialization_mode_leave( m, &context);
+
+ return false;
+ }
+
/* get time segment length from time segment table */
tseg_1 = can_time_segment_table[tq_no - MIN_NO_OF_TQ][TSEG_1];
tseg_2 = can_time_segment_table[tq_no - MIN_NO_OF_TQ][TSEG_2];
@@ -185,6 +197,8 @@ void mscan_set_bit_rate( mscan *m, unsigned can_bit_rate)
/* Leave initialization mode */
mscan_initialization_mode_leave( m, &context);
+
+ return true;
}
/**
@@ -280,8 +294,10 @@ void mscan_sleep_mode_leave( mscan *m)
*
* The module is set to listen only mode.
*/
-void mscan_enable( mscan *m, unsigned bit_rate)
+bool mscan_enable( mscan *m, unsigned bit_rate)
{
+ bool s = true;
+
/* Disable the module */
mscan_disable( m);
@@ -295,13 +311,15 @@ void mscan_enable( mscan *m, unsigned bit_rate)
mscan_filter_clear( m);
/* Set bit rate and leave initialization mode */
- mscan_set_bit_rate( m, bit_rate);
+ s = mscan_set_bit_rate( m, bit_rate);
/* Clear all flags */
m->ctl0 = CTL0_RXFRM;
/* Disable interrupts */
mscan_interrupts_disable( m);
+
+ return s;
}
/**
diff --git a/c/src/lib/libbsp/powerpc/gen5200/mscan/mscan.c b/c/src/lib/libbsp/powerpc/gen5200/mscan/mscan.c
index efbc97237c..61c281eb94 100644
--- a/c/src/lib/libbsp/powerpc/gen5200/mscan/mscan.c
+++ b/c/src/lib/libbsp/powerpc/gen5200/mscan/mscan.c
@@ -495,7 +495,7 @@ void mpc5200_mscan_perform_initialization_mode_settings(mscan *m)
mscan_context context;
/* perform all can bit time settings */
- mscan_set_bit_rate(m, CAN_BIT_RATE);
+ (void) mscan_set_bit_rate(m, MSCAN_BIT_RATE_DEFAULT);
/* Enter initialization mode */
mscan_initialization_mode_enter( m, &context);
@@ -1185,26 +1185,17 @@ rtems_device_driver mscan_control(rtems_device_major_number major,
/* set can bitrate */
case MSCAN_SET_BAUDRATE:
-
- /* check bitrate settings */
- if (((ctrl_parms->ctrl_can_bitrate) >= CAN_BIT_RATE_MIN)
- && ((ctrl_parms->ctrl_can_bitrate) <= CAN_BIT_RATE_MAX)) {
-
- /* perform all can bit time settings */
- mscan_set_bit_rate(m, ctrl_parms->ctrl_can_bitrate);
-
- /* enable ints. */
- mscan_interrupts_enable(m);
-
- /* wait for bus sync. */
- mpc5200_mscan_wait_sync(m);
-
- return RTEMS_SUCCESSFUL;
- } else {
-
+ /* perform all can bit time settings */
+ if (!mscan_set_bit_rate(m, ctrl_parms->ctrl_can_bitrate)) {
return RTEMS_UNSATISFIED;
}
+ /* enable ints. */
+ mscan_interrupts_enable(m);
+
+ /* wait for bus sync. */
+ mpc5200_mscan_wait_sync(m);
+
break;
case SET_TX_BUF_NO:
diff --git a/c/src/lib/libbsp/powerpc/gen5200/mscan/mscan_int.h b/c/src/lib/libbsp/powerpc/gen5200/mscan/mscan_int.h
index d9f1cc79b6..125fd82947 100644
--- a/c/src/lib/libbsp/powerpc/gen5200/mscan/mscan_int.h
+++ b/c/src/lib/libbsp/powerpc/gen5200/mscan/mscan_int.h
@@ -39,10 +39,6 @@ extern "C" {
#define MSCAN_NORMAL_MODE 4
#define MSCAN_SLEEP_MODE 8
-#define CAN_BIT_RATE_MAX 1000000
-#define CAN_BIT_RATE_MIN 100000
-#define CAN_BIT_RATE 100000
-
#define MSCAN_RX_BUFF_NOACTIVE (0 << 4)
#define MSCAN_RX_BUFF_EMPTY (1 << 6)
#define MSCAN_RX_BUFF_FULL (1 << 5)