[ECOS] Serial Driver (Interrupt Mode) for PXA250
Gary Thomas
gary@mlbassoc.com
Tue Aug 22 13:00:00 GMT 2006
Himanshu Patel wrote:
> ----- Original Message -----
> From: Himanshu Patel
> To: ecos-discuss@ecos.sourceware.org
> Sent: Tuesday, August 22, 2006 6:17 PM
> Subject: Re: [ECOS] Serial Driver (Interrupt Mode) for PXA250
>
>
> Hi,
>
> Any ideas? Let me know if any additional information is required.
Why aren't you just using the generic 16x5x driver? Look at how I
did it for the uE250 which is another PXA250 based system.
>
> 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
>
>
--
------------------------------------------------------------
Gary Thomas | Consulting for the
MLB Associates | Embedded world
------------------------------------------------------------
--
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss
More information about the Ecos-discuss
mailing list