This is the mail archive of the ecos-discuss@sourceware.org mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Serial driver



Hi , I am using two different IRQ number for RX and TX in serial driver.

My init function of serial driver looks like this ---

static bool test_serial_init(struct cyg_devtab_entry *tab)
{
serial_channel *chan = (serial_channel *)tab->priv;
(chan->callbacks->serial_init)(chan); // Really only required for interrupt driven devices


/* Allocate the IRQs */
if (chan->out_cbuf.len != 0) {
/* TX interrupt */
cyg_drv_interrupt_create(TX_IRQ,
0, // IRQ priority
(cyg_addrword_t)chan, // Data item passed to interrupt handler
&test_tx_serial_ISR,
&test_tx_serial_DSR,
&tx_serial_interrupt_handle,
&tx_serial_interrupt);
cyg_drv_interrupt_attach(tx_serial_interrupt_handle);
cyg_drv_interrupt_unmask(TX_IRQ);
}
if (chan->in_cbuf.len != 0) {
/* RX interrupt */
cyg_drv_interrupt_create(RX_IRQ,
0, // IRQ priority
(cyg_addrword_t)chan, // Data item passed to interrupt handler
&test_rx_serial_ISR,
&test_rx_serial_DSR,
&rx_serial_interrupt_handle,
&rx_serial_interrupt);
cyg_drv_interrupt_attach(rx_serial_interrupt_handle);
cyg_drv_interrupt_unmask(RX_IRQ);
}


       return true;
}

My problems are :

1. when I press any key from keyboard test_rx_serial_ISR and test_rx_serial_DSR are called one by one.
But that charcter is not displayed.
2. In scanf function --- control is stuck into " while (size < *len) {" this loop in serial_read function.


Here is my DSR for RX:

static void test_rx_serial_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data)
{
serial_channel *chan = (serial_channel *)data;
cyg_uint8 _c;
unsigned int fifocnt;


fifocnt = *FSTAT & RXFFLMASK;
if(fifocnt--) {
_c = *ASC_RBUF;
(chan->callbacks->rcv_char)(chan, _c);
/* I print this "_c" variable by diag_printf and I have seen it get correct key which I type from keyboard */


/* RX happened ... so try to print that char */
if(((*FSTAT & TXFFLMASK) >> TXFFLOFF) != TXFIFO_FULL) {
cbuf_t *tx_cbuf = &chan->out_cbuf;
diag_printf("TX: %d\n", tx_cbuf->nb); /* I got 0 here */
(chan->callbacks->xmt_char)(chan); /* nothing is printed */
}
}


       cyg_drv_interrupt_unmask(RX_IRQ);
}

Thanks in advance

Regards,
Tatha


-- Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]