mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2025-12-28 07:20:16 +00:00
Improved parameter checks for bit rate function.
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user