diff options
author | Thomas Doerfler <Thomas.Doerfler@embedded-brains.de> | 2008-09-05 13:24:26 +0000 |
---|---|---|
committer | Thomas Doerfler <Thomas.Doerfler@embedded-brains.de> | 2008-09-05 13:24:26 +0000 |
commit | 9a49a969e8286ef9f2a89973bfddff8678c47140 (patch) | |
tree | c526df1d2dcd7d123184cca89b82f3d259ca5d32 | |
parent | Remove bogus entry. (diff) | |
download | rtems-9a49a969e8286ef9f2a89973bfddff8678c47140.tar.bz2 |
Improved parameter checks for bit rate function.
-rw-r--r-- | c/src/lib/libbsp/powerpc/gen5200/ChangeLog | 5 | ||||
-rw-r--r-- | c/src/lib/libbsp/powerpc/gen5200/include/mscan-base.h | 10 | ||||
-rw-r--r-- | c/src/lib/libbsp/powerpc/gen5200/mscan/mscan-base.c | 26 | ||||
-rw-r--r-- | c/src/lib/libbsp/powerpc/gen5200/mscan/mscan.c | 27 | ||||
-rw-r--r-- | c/src/lib/libbsp/powerpc/gen5200/mscan/mscan_int.h | 4 |
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) |