Improved parameter checks for bit rate function.

This commit is contained in:
Thomas Doerfler
2008-09-05 13:24:26 +00:00
parent 18039f10d1
commit 9a49a969e8
5 changed files with 43 additions and 29 deletions

View File

@@ -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,

View File

@@ -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);

View File

@@ -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;
}
/**

View File

@@ -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:

View File

@@ -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)