Regards,
Himanshu Patel
----- Original Message -----
From: Himanshu Patel
To: ecos-discuss@ecos.sourceware.org
Sent: Monday, August 21, 2006 7:11 PM
Subject: [ECOS] Serial Driver (Interrupt Mode) for PXA250
Hi,
I am working on PXA250 development board. ISR (and hence DSR) is not
getting fired for FFUART (Serial Driver works well in Polling Mode).
Sending herewith code for Initialization and Configuration for reference:
#define PXA2X0_FFUART0 0x40100000
#define CYGNUM_HAL_INTERRUPT_USART0 (22)
static bool triton_serial_config_port(serial_channel *chan,
cyg_serial_info_t *new_config, bool init)
{
triton_serial_info *triton_chan = (triton_serial_info *)chan->dev_priv;
CYG_ADDRWORD base = triton_chan->base;
cyg_uint32 baudrate;
cyg_uint32 parity = select_parity((cyg_uint32) new_config->parity);
cyg_uint32 word_length = select_word_length((cyg_uint32)
new_config->word_length);
cyg_uint32 stop_bits = select_stop_bits((cyg_uint32) new_config->stop);
if ((word_length == 0xFF) || (parity == 0xFF) || (stop_bits == 0xFF))
{
return false; // Unsupported configuration
}
// Enable Divisor Latch Access Bit in Line Control Register.
HAL_WRITE_UINT32(base + PXA2X0_UART_LCR, PXA2X0_UART_LCR_DLAB);
baudrate = select_baudrate((cyg_uint32) new_config->baud);
// Divisor Latch Low Register
HAL_WRITE_UINT32(base + PXA2X0_UART_DLL, (baudrate & 0xFF));
// Divisor Latch High Register
HAL_WRITE_UINT32(base + PXA2X0_UART_DLH, ((baudrate & 0xFF00) >> 8));
// Disable Divisor Latch Access Bit in Line Control Register.
// Reset the Line Control Register.
HAL_WRITE_UINT32(base + PXA2X0_UART_LCR, 0x00);
// Configure Line Control Register
HAL_WRITE_UINT32(base + PXA2X0_UART_LCR, parity | word_length | stop_bits);
// Disable UART interrupts.
HAL_WRITE_UINT32(base + PXA2X0_UART_IER, 0x00000000);
// Enable UART Unit.
HAL_WRITE_UINT32(base + PXA2X0_UART_IER, PXA2X0_UART_IER_UUE);
#if CYGNUM_IO_SERIAL_ARM_TRITON_SERIAL0_BUFSIZE > 0
// Enable Transmit and Receive FIFO
HAL_WRITE_UINT32(base + PXA2X0_UART_FCR, PXA2X0_UART_FCR_FCR0 |
PXA2X0_UART_FCR_FCR1 | PXA2X0_UART_FCR_FCR2);
// Enable Transmit, Receive interrupt.
HAL_WRITE_UINT32(base + PXA2X0_UART_IER, PXA2X0_UART_IER_TIE |
PXA2X0_UART_IER_RAVIE | PXA2X0_UART_IER_UUE);
#endif
return true;
}
static bool triton_serial_init(struct cyg_devtab_entry *tab)
{
serial_channel *chan = (serial_channel *)tab->priv;
triton_serial_info *triton_chan = (triton_serial_info *) chan->dev_priv;
int res;
#ifdef CYGDBG_IO_INIT
diag_printf("TRITON SERIAL init - dev: %x.%d\n", triton_chan->base,
triton_chan->int_num);
#endif
// Really only required for interrupt driven devices.
(chan->callbacks->serial_init)(chan);
if(chan->out_cbuf.len != 0)
{
cyg_drv_interrupt_create(triton_chan->int_num,
4, // Priority
(cyg_addrword_t)chan, // Data item passed
to interrupt handler
(cyg_ISR_t *)&triton_serial_ISR,
(cyg_DSR_t *)&triton_serial_DSR,
&triton_chan->serial_interrupt_handle,
&triton_chan->serial_interrupt);
cyg_drv_interrupt_attach(triton_chan->serial_interrupt_handle);
cyg_drv_interrupt_unmask(triton_chan->int_num);
}
res = triton_serial_config_port(chan, &chan->config, true);
return res;
}
Any help would be greatly appreciated.
Regards,
Himanshu Patel