* added sanity checks for serial apis.

* removed unused variables.
pull/1243/head
akhilpanayam 2015-07-09 11:24:30 +05:30 committed by Karthik Purushothaman
parent 6392162d32
commit ae108230e6
3 changed files with 76 additions and 9 deletions

View File

@ -145,7 +145,6 @@ void analogin_init(analogin_t *obj, PinName pin)
{
uint32_t pos_input;
static uint8_t init_flag = 0;
struct system_pinmux_config config;
switch(pin) {
case PA04:

View File

@ -35,4 +35,5 @@ void port_write(port_t *obj, int value)
int port_read(port_t *obj)
{
return 0;
}

View File

@ -104,6 +104,8 @@ static inline void reset_usart(serial_t *obj)
uint32_t serial_find_mux_settings (serial_t *obj)
{
/* Sanity check arguments */
MBED_ASSERT(obj);
uint32_t mux_setting = 0;
uint32_t pinpad[4] = {0};
uint8_t i = 0;
@ -146,7 +148,8 @@ uint32_t serial_find_mux_settings (serial_t *obj)
static enum status_code usart_set_config_default(serial_t *obj)
{
/* Sanity check arguments */
MBED_ASSERT(obj);
/* Index for generic clock */
uint32_t sercom_index = _sercom_get_sercom_inst_index(pUSART_S(obj));
uint32_t gclk_index = sercom_index + SERCOM0_GCLK_ID_CORE;
@ -209,6 +212,8 @@ static enum status_code usart_set_config_default( serial_t *obj)
void get_default_serial_values(serial_t *obj)
{
/* Sanity check arguments */
MBED_ASSERT(obj);
/* Set default config to object */
pSERIAL_S(obj)->parity = USART_PARITY_NONE;
pSERIAL_S(obj)->stopbits = USART_STOPBITS_1;
@ -219,6 +224,8 @@ void get_default_serial_values(serial_t *obj)
void serial_init(serial_t *obj, PinName tx, PinName rx)
{
/* Sanity check arguments */
MBED_ASSERT(obj);
if (g_sys_init == 0) {
system_init();
g_sys_init = 1;
@ -242,7 +249,7 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
muxsetting = serial_find_mux_settings(obj); // getting mux setting from pins
sercom_index = pinmap_merge_sercom(tx, rx); // same variable sercom_index reused for optimization
if (sercom_index == NC) {
if (sercom_index == (uint32_t)NC) {
/*expecting a valid value for sercom index*/
return;
}
@ -279,11 +286,10 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
pin_conf.input_pull = SYSTEM_PINMUX_PIN_PULL_NONE;
pin_conf.powersave = false;
uint32_t mux_func;
/* Configure the SERCOM pins according to the user configuration */
for (uint8_t pad = 0; pad < 4; pad++) {
uint32_t current_pin = pSERIAL_S(obj)->pins[pad];
if (current_pin != NC) {
if (current_pin != (uint32_t)NC) {
pin_conf.mux_position = pinmap_function_sercom(current_pin, sercom_index);
if ((uint8_t)NC != pin_conf.mux_position) {
system_pinmux_pin_set_config(current_pin, &pin_conf);
@ -304,12 +310,16 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
void serial_free(serial_t *obj)
{
/* Sanity check arguments */
MBED_ASSERT(obj);
serial_irq_ids[serial_get_index(obj)] = 0;
disable_usart(obj);
}
void serial_baud(serial_t *obj, int baudrate)
{
/* Sanity check arguments */
MBED_ASSERT(obj);
MBED_ASSERT((baudrate == 110) || (baudrate == 150) || (baudrate == 300) || (baudrate == 1200) ||
(baudrate == 2400) || (baudrate == 4800) || (baudrate == 9600) || (baudrate == 19200) || (baudrate == 38400) ||
(baudrate == 57600) || (baudrate == 115200) || (baudrate == 230400) || (baudrate == 460800) || (baudrate == 921600) );
@ -348,6 +358,8 @@ void serial_baud(serial_t *obj, int baudrate)
void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits)
{
/* Sanity check arguments */
MBED_ASSERT(obj);
MBED_ASSERT((stop_bits == 1) || (stop_bits == 2));
MBED_ASSERT((parity == ParityNone) || (parity == ParityOdd) || (parity == ParityEven));
MBED_ASSERT((data_bits == 5) || (data_bits == 6) || (data_bits == 7) || (data_bits == 8) /*|| (data_bits == 9)*/);
@ -439,9 +451,10 @@ void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_b
void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, PinName txflow)
{
/* Sanity check arguments */
MBED_ASSERT(obj);
uint32_t muxsetting = 0;
uint32_t sercom_index = 0;
uint32_t mux_func;
IRQn_Type irq_n = (IRQn_Type)0;
uint32_t vector = 0;
@ -449,7 +462,7 @@ void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, Pi
pSERIAL_S(obj)->pins[USART_TXFLOW_INDEX] = txflow;
muxsetting = serial_find_mux_settings(obj); // getting mux setting from pins
sercom_index = pinmap_merge_sercom(pSERIAL_S(obj)->pins[USART_TX_INDEX], pSERIAL_S(obj)->pins[USART_RX_INDEX]); // same variable sercom_index reused for optimization
if (sercom_index == NC) {
if (sercom_index == (uint32_t)NC) {
/*expecting a valid value for sercom index*/
return;
}
@ -470,7 +483,7 @@ void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, Pi
for (uint8_t pad = 0; pad < 2; pad++) { // setting for rx and tx
uint32_t current_pin = pSERIAL_S(obj)->pins[pad];
if (current_pin != NC) {
if (current_pin != (uint32_t)NC) {
pin_conf.mux_position = pinmap_function_sercom(current_pin, sercom_index);
if ((uint8_t)NC != pin_conf.mux_position) {
system_pinmux_pin_set_config(current_pin, &pin_conf);
@ -504,6 +517,8 @@ void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, Pi
void serial_break_set(serial_t *obj)
{
/* Sanity check arguments */
MBED_ASSERT(obj);
struct system_pinmux_config pin_conf;
pin_conf.direction = SYSTEM_PINMUX_PIN_DIR_OUTPUT;
pin_conf.input_pull = SYSTEM_PINMUX_PIN_PULL_NONE;
@ -517,6 +532,8 @@ void serial_break_set(serial_t *obj)
void serial_break_clear(serial_t *obj)
{
/* Sanity check arguments */
MBED_ASSERT(obj);
uint32_t sercom_index = pinmap_merge_sercom(pSERIAL_S(obj)->pins[USART_TX_INDEX], pSERIAL_S(obj)->pins[USART_RX_INDEX]);
struct system_pinmux_config pin_conf;
@ -537,6 +554,8 @@ void serial_break_clear(serial_t *obj)
******************************************************************************/
inline uint8_t serial_get_index(serial_t *obj)
{
/* Sanity check arguments */
MBED_ASSERT(obj);
switch ((int)pUSART_S(obj)) {
case UART_0:
return 0;
@ -556,6 +575,7 @@ inline uint8_t serial_get_index(serial_t *obj)
static inline void uart_irq(SercomUsart *const usart, uint32_t index)
{
MBED_ASSERT(usart != (void*)0);
uint16_t interrupt_status;
interrupt_status = usart->INTFLAG.reg;
interrupt_status &= usart->INTENSET.reg;
@ -604,6 +624,8 @@ void uart5_irq()
uint32_t get_serial_vector (serial_t *obj)
{
/* Sanity check arguments */
MBED_ASSERT(obj);
uint32_t vector = 0;
switch ((int)pUSART_S(obj)) {
case UART_0:
@ -630,12 +652,16 @@ uint32_t get_serial_vector (serial_t *obj)
void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id)
{
/* Sanity check arguments */
MBED_ASSERT(obj);
irq_handler = handler;
serial_irq_ids[serial_get_index(obj)] = id;
}
IRQn_Type get_serial_irq_num (serial_t *obj)
{
/* Sanity check arguments */
MBED_ASSERT(obj);
switch ((int)pUSART_S(obj)) {
case UART_0:
return SERCOM0_IRQn;
@ -652,10 +678,13 @@ IRQn_Type get_serial_irq_num (serial_t *obj)
default:
MBED_ASSERT(0);
}
return SERCOM0_IRQn; // to avoid warning
}
void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
{
/* Sanity check arguments */
MBED_ASSERT(obj);
IRQn_Type irq_n = (IRQn_Type)0;
uint32_t vector = 0;
@ -692,12 +721,16 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
******************************************************************************/
int serial_getc(serial_t *obj)
{
/* Sanity check arguments */
MBED_ASSERT(obj);
while (!serial_readable(obj));
return _USART(obj).DATA.reg ;
}
void serial_putc(serial_t *obj, int c)
{
/* Sanity check arguments */
MBED_ASSERT(obj);
uint16_t q = (c & SERCOM_USART_DATA_MASK);
while (!serial_writable(obj));
_USART(obj).DATA.reg = q;
@ -706,6 +739,8 @@ void serial_putc(serial_t *obj, int c)
int serial_readable(serial_t *obj)
{
/* Sanity check arguments */
MBED_ASSERT(obj);
uint32_t status = 1;
if (!(_USART(obj).INTFLAG.reg & SERCOM_USART_INTFLAG_RXC)) {
status = 0;
@ -717,6 +752,8 @@ int serial_readable(serial_t *obj)
int serial_writable(serial_t *obj)
{
/* Sanity check arguments */
MBED_ASSERT(obj);
uint32_t status = 1;
if (!(_USART(obj).INTFLAG.reg & SERCOM_USART_INTFLAG_DRE)) {
status = 0;
@ -737,6 +774,8 @@ int serial_writable(serial_t *obj)
***********************************/
void serial_tx_enable_event(serial_t *obj, int event, uint8_t enable)
{
/* Sanity check arguments */
MBED_ASSERT(obj);
if(enable) {
pSERIAL_S(obj)->events |= event;
} else {
@ -746,6 +785,8 @@ void serial_tx_enable_event(serial_t *obj, int event, uint8_t enable)
void serial_rx_enable_event(serial_t *obj, int event, uint8_t enable)
{
/* Sanity check arguments */
MBED_ASSERT(obj);
if(enable) {
pSERIAL_S(obj)->events |= event;
} else {
@ -755,6 +796,9 @@ void serial_rx_enable_event(serial_t *obj, int event, uint8_t enable)
void serial_tx_buffer_set(serial_t *obj, void *tx, int tx_length, uint8_t width)
{
/* Sanity check arguments */
MBED_ASSERT(obj);
MBED_ASSERT(tx != (void*)0);
// We only support byte buffers for now
MBED_ASSERT(width == 8);
@ -769,6 +813,9 @@ void serial_tx_buffer_set(serial_t *obj, void *tx, int tx_length, uint8_t width)
void serial_rx_buffer_set(serial_t *obj, void *rx, int rx_length, uint8_t width)
{
/* Sanity check arguments */
MBED_ASSERT(obj);
MBED_ASSERT(rx != (void*)0);
// We only support byte buffers for now
MBED_ASSERT(width == 8);
@ -783,6 +830,8 @@ void serial_rx_buffer_set(serial_t *obj, void *rx, int rx_length, uint8_t width)
void serial_set_char_match(serial_t *obj, uint8_t char_match)
{
/* Sanity check arguments */
MBED_ASSERT(obj);
if (char_match != SERIAL_RESERVED_CHAR_MATCH) {
obj->char_match = char_match;
}
@ -793,6 +842,8 @@ void serial_set_char_match(serial_t *obj, uint8_t char_match)
***********************************/
int serial_tx_asynch(serial_t *obj, const void *tx, size_t tx_length, uint8_t tx_width, uint32_t handler, uint32_t event, DMAUsage hint)
{
/* Sanity check arguments */
MBED_ASSERT(obj);
MBED_ASSERT(tx != (void*)0);
if(tx_length == 0) return 0;
@ -815,6 +866,8 @@ int serial_tx_asynch(serial_t *obj, const void *tx, size_t tx_length, uint8_t tx
void serial_rx_asynch(serial_t *obj, void *rx, size_t rx_length, uint8_t rx_width, uint32_t handler, uint32_t event, uint8_t char_match, DMAUsage hint)
{
/* Sanity check arguments */
MBED_ASSERT(obj);
MBED_ASSERT(rx != (void*)0);
serial_rx_enable_event(obj, SERIAL_EVENT_RX_ALL, false);
@ -837,16 +890,22 @@ void serial_rx_asynch(serial_t *obj, void *rx, size_t rx_length, uint8_t rx_widt
uint8_t serial_tx_active(serial_t *obj)
{
/* Sanity check arguments */
MBED_ASSERT(obj);
return ((obj->tx_buff.length > 0) ? true : false);
}
uint8_t serial_rx_active(serial_t *obj)
{
/* Sanity check arguments */
MBED_ASSERT(obj);
return ((obj->rx_buff.length > 0) ? true : false);
}
int serial_tx_irq_handler_asynch(serial_t *obj)
{
/* Sanity check arguments */
MBED_ASSERT(obj);
_USART(obj).INTENCLR.reg = SERCOM_USART_INTFLAG_TXC;
serial_tx_abort_asynch(obj);
return SERIAL_EVENT_TX_COMPLETE & obj->serial.events;
@ -854,6 +913,8 @@ int serial_tx_irq_handler_asynch(serial_t *obj)
int serial_rx_irq_handler_asynch(serial_t *obj)
{
/* Sanity check arguments */
MBED_ASSERT(obj);
int event = 0;
/* This interrupt handler is called from USART irq */
uint8_t *buf = (uint8_t*)obj->rx_buff.buffer;
@ -915,6 +976,8 @@ int serial_rx_irq_handler_asynch(serial_t *obj)
int serial_irq_handler_asynch(serial_t *obj)
{
//TODO: DMA to be implemented
/* Sanity check arguments */
MBED_ASSERT(obj);
uint16_t interrupt_status;
uint8_t *buf = obj->tx_buff.buffer;
@ -948,6 +1011,8 @@ int serial_irq_handler_asynch(serial_t *obj)
void serial_tx_abort_asynch(serial_t *obj)
{
//TODO: DMA to be implemented
/* Sanity check arguments */
MBED_ASSERT(obj);
_USART(obj).INTFLAG.reg = SERCOM_USART_INTFLAG_TXC;
obj->tx_buff.length = 0;
obj->rx_buff.pos = 0;
@ -957,6 +1022,8 @@ void serial_tx_abort_asynch(serial_t *obj)
void serial_rx_abort_asynch(serial_t *obj)
{
//TODO: DMA to be implemented
/* Sanity check arguments */
MBED_ASSERT(obj);
_USART(obj).INTFLAG.reg = SERCOM_USART_INTFLAG_RXC;
obj->rx_buff.length = 0;
obj->rx_buff.pos = 0;