diff options
author | Thomas Doerfler <Thomas.Doerfler@embedded-brains.de> | 2009-11-03 18:45:04 +0000 |
---|---|---|
committer | Thomas Doerfler <Thomas.Doerfler@embedded-brains.de> | 2009-11-03 18:45:04 +0000 |
commit | e08dbc5ea9ec881b6fc93cf926c18fb094d3bd55 (patch) | |
tree | 465630c9bb6a962362ed043b9bb0bc4c5505a3a5 /c/src/lib/libbsp/powerpc/tqm8xx | |
parent | 2009-11-03 Ralf Corsépius <ralf.corsepius@rtems.org> (diff) | |
download | rtems-e08dbc5ea9ec881b6fc93cf926c18fb094d3bd55.tar.bz2 |
various PowerPC code maintenance
Diffstat (limited to 'c/src/lib/libbsp/powerpc/tqm8xx')
-rw-r--r-- | c/src/lib/libbsp/powerpc/tqm8xx/ChangeLog | 4 | ||||
-rw-r--r-- | c/src/lib/libbsp/powerpc/tqm8xx/console/console.c | 62 | ||||
-rw-r--r-- | c/src/lib/libbsp/powerpc/tqm8xx/startup/bspstart.c | 4 |
3 files changed, 42 insertions, 28 deletions
diff --git a/c/src/lib/libbsp/powerpc/tqm8xx/ChangeLog b/c/src/lib/libbsp/powerpc/tqm8xx/ChangeLog index f080c18408..a06efaabfa 100644 --- a/c/src/lib/libbsp/powerpc/tqm8xx/ChangeLog +++ b/c/src/lib/libbsp/powerpc/tqm8xx/ChangeLog @@ -1,3 +1,7 @@ +2009-11-03 Thomas Doerfler <Thomas.Doerfler@embedded-brains.de> + + * startup/bspstart.s, console/console.c: various fixes + 2009-10-28 Thomas Doerfler <Thomas.Doerfler@embedded-brains.de> * startup/bspstart.s: correct clock tick init diff --git a/c/src/lib/libbsp/powerpc/tqm8xx/console/console.c b/c/src/lib/libbsp/powerpc/tqm8xx/console/console.c index 7cfa9dd017..6ca12de107 100644 --- a/c/src/lib/libbsp/powerpc/tqm8xx/console/console.c +++ b/c/src/lib/libbsp/powerpc/tqm8xx/console/console.c @@ -66,7 +66,7 @@ /* * Interrupt-driven input buffer */ -#define RXBUFSIZE 256 +#define RXBUFSIZE 16 #define M8xx_SICR_BRG1 (0) #define M8xx_SICR_BRG2 (1) @@ -662,7 +662,7 @@ sccInitialize (int chan) sccFrstRxBd[chan][i].status |= M8xx_BD_WRAP; } sccFrstRxBd[chan][i].length = 0; - sccFrstRxBd[chan][i].buffer = rxBuf[chan][i]; + sccFrstRxBd[chan][i].buffer = (*rxBuf[chan])[i]; } /* * Setup the Transmit Buffer Descriptor @@ -728,32 +728,44 @@ sccInitialize (int chan) static int sccPollRead (int minor) { - unsigned char c; + int c = -1; int chan = minor; - if ((sccCurrRxBd[chan]->status & M8xx_BD_EMPTY) != 0) { - return -1; - } - rtems_cache_invalidate_multiple_data_lines((void *)sccCurrRxBd[chan]->buffer, - sccCurrRxBd[chan]->length); - c = *((char *)sccCurrRxBd[chan]->buffer); - /* - * clear status - */ - sccCurrRxBd[chan]->status = - (sccCurrRxBd[chan]->status - & (M8xx_BD_WRAP | M8xx_BD_INTERRUPT)) - | M8xx_BD_EMPTY; - /* - * advance to next BD - */ - if ((sccCurrRxBd[chan]->status & M8xx_BD_WRAP) != 0) { - sccCurrRxBd[chan] = sccFrstRxBd[chan]; - } - else { - sccCurrRxBd[chan]++; + while(1) { + if ((sccCurrRxBd[chan]->status & M8xx_BD_EMPTY) != 0) { + return -1; + } + + if (0 == (sccCurrRxBd[chan]->status & (M8xx_BD_OVERRUN + | M8xx_BD_PARITY_ERROR + | M8xx_BD_FRAMING_ERROR + | M8xx_BD_BREAK + | M8xx_BD_IDLE))) { + /* character received and no error detected */ + rtems_cache_invalidate_multiple_data_lines((void *)sccCurrRxBd[chan]->buffer, + sccCurrRxBd[chan]->length); + c = (unsigned)*((char *)sccCurrRxBd[chan]->buffer); + /* + * clear status + */ + } + sccCurrRxBd[chan]->status = + (sccCurrRxBd[chan]->status + & (M8xx_BD_WRAP | M8xx_BD_INTERRUPT)) + | M8xx_BD_EMPTY; + /* + * advance to next BD + */ + if ((sccCurrRxBd[chan]->status & M8xx_BD_WRAP) != 0) { + sccCurrRxBd[chan] = sccFrstRxBd[chan]; + } + else { + sccCurrRxBd[chan]++; + } + if (c >= 0) { + return c; + } } - return c; } diff --git a/c/src/lib/libbsp/powerpc/tqm8xx/startup/bspstart.c b/c/src/lib/libbsp/powerpc/tqm8xx/startup/bspstart.c index d701ed7291..11bcf51377 100644 --- a/c/src/lib/libbsp/powerpc/tqm8xx/startup/bspstart.c +++ b/c/src/lib/libbsp/powerpc/tqm8xx/startup/bspstart.c @@ -173,9 +173,7 @@ void bsp_start( void) BSP_panic("Cannot determine BUS frequency\n"); } - bsp_clicks_per_usec = BSP_bus_frequency/16; /* force to zero to control - * PIT clock driver from EXTCLK - */ + bsp_clicks_per_usec = BSP_bus_frequency/1000000/16; bsp_timer_least_valid = 3; bsp_timer_average_overhead = 3; |