Mercurial > ecos-v3_0-branch
changeset 2488:fc0255fc3781
* cdl/ser_generic_16x5x.cdl
(CYGINT_IO_SERIAL_GENERIC_16X5X_CHAN_INTPRIO): New interface
for devices that support per channel interrupt priorities.
* src/ser_16x5x.c Added int_prio to pc_serial_info type.
serial_config_port(): uses macro
CYG_IO_SERIAL_GENERIC_16X5X_CHAN_BAUD_GENERATOR() to get the baud
devisor from platform if device suppports per channel baudrate
clocks, pc_serial_init(): Use interrupt priority from int_prio
data field if device implements
CYGINT_IO_SERIAL_GENERIC_16X5X_CHAN_INTPRIO
| author | asl |
|---|---|
| date | Fri, 11 Jul 2008 17:33:39 +0000 |
| parents | 43d755db41ac |
| children | c95d59b20030 |
| files | packages/devs/serial/generic/16x5x/current/ChangeLog packages/devs/serial/generic/16x5x/current/cdl/ser_generic_16x5x.cdl packages/devs/serial/generic/16x5x/current/src/ser_16x5x.c |
| diffstat | 3 files changed, 50 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/packages/devs/serial/generic/16x5x/current/ChangeLog +++ b/packages/devs/serial/generic/16x5x/current/ChangeLog @@ -1,3 +1,17 @@ +2008-07-08 Uwe Kindler <uwe_kindler@web.de> + + * cdl/ser_generic_16x5x.cdl + (CYGINT_IO_SERIAL_GENERIC_16X5X_CHAN_INTPRIO): New interface + for devices that support per channel interrupt priorities. + + * src/ser_16x5x.c Added int_prio to pc_serial_info type. + serial_config_port(): uses macro + CYG_IO_SERIAL_GENERIC_16X5X_CHAN_BAUD_GENERATOR() to get the baud + devisor from platform if device suppports per channel baudrate + clocks, pc_serial_init(): Use interrupt priority from int_prio + data field if device implements + CYGINT_IO_SERIAL_GENERIC_16X5X_CHAN_INTPRIO + 2007-06-22 Alexander Aganichev <aaganichev@gmail.com> * cdl/ser_generic_16x5x.cdl
--- a/packages/devs/serial/generic/16x5x/current/cdl/ser_generic_16x5x.cdl +++ b/packages/devs/serial/generic/16x5x/current/cdl/ser_generic_16x5x.cdl @@ -76,6 +76,16 @@ cdl_package CYGPKG_IO_SERIAL_GENERIC_16X puts $::cdl_header "#include <pkgconf/system.h>"; puts $::cdl_header "#include CYGDAT_IO_SERIAL_GENERIC_16X5X_CFG"; } + + cdl_interface CYGINT_IO_SERIAL_GENERIC_16X5X_CHAN_INTPRIO { + display "Per channel interrupt priority support" + flavor bool + description " + A platform should implement this interface if it supports + per channel interrupt priorities. If a platform implements + this interface it needs to provide an interrupt priority + value for each UART channel it supports." + } cdl_option CYGPKG_IO_SERIAL_GENERIC_16X5X_XMIT_REQUIRE_PRIME { display "Transmission require priming"
--- a/packages/devs/serial/generic/16x5x/current/src/ser_16x5x.c +++ b/packages/devs/serial/generic/16x5x/current/src/ser_16x5x.c @@ -182,6 +182,9 @@ static unsigned char select_parity[] = { typedef struct pc_serial_info { cyg_addrword_t base; int int_num; +#ifdef CYGINT_IO_SERIAL_GENERIC_16X5X_CHAN_INTPRIO + int int_prio; +#endif // CYGINT_IO_SERIAL_GENERIC_16X5X_CHAN_INTPRIO cyg_interrupt serial_interrupt; cyg_handle_t serial_interrupt_handle; #ifdef CYGPKG_IO_SERIAL_GENERIC_16X5X_FIFO @@ -235,7 +238,17 @@ serial_config_port(serial_channel *chan, { pc_serial_info *ser_chan = (pc_serial_info *)chan->dev_priv; cyg_addrword_t base = ser_chan->base; + // + // If the device supports a dynamic per channel baudrate generator + // then we call the CYG_IO_SERIAL_GENERIC_16X5X_CHAN_BAUD_GENERATOR() + // macro to get the baud divisor. The macro takes the serial channel data + // pointer and the baudrate as parameters and returns the baud divisior + // +#ifdef CYG_IO_SERIAL_GENERIC_16X5X_CHAN_BAUD_GENERATOR + unsigned short baud_divisor = CYG_IO_SERIAL_GENERIC_16X5X_CHAN_BAUD_GENERATOR(ser_chan, new_config->baud); +#else unsigned short baud_divisor = select_baud[new_config->baud]; +#endif unsigned char _lcr, _ier; if (baud_divisor == 0) return false; // Invalid configuration @@ -372,10 +385,21 @@ pc_serial_init(struct cyg_devtab_entry * #endif // Really only required for interrupt driven devices (chan->callbacks->serial_init)(chan); - + // + // If the device supports per channel interrupt priorities then + // we take the priority from the serial channel data. If it does + // not support per channel interrupt priority we fall back to + // the old method and use CYG_IO_SERIAL_GENERIC_16X5X_INT_PRIORITY + // to define the priority + // +#ifdef CYGINT_IO_SERIAL_GENERIC_16X5X_CHAN_INTPRIO + cyg_priority_t intprio = ser_chan->int_prio; +#else + cyg_priority_t intprio = CYG_IO_SERIAL_GENERIC_16X5X_INT_PRIORITY; +#endif // CYGINT_IO_SERIAL_GENERIC_16X5X_CHAN_INTPRIO if (chan->out_cbuf.len != 0) { cyg_drv_interrupt_create(ser_chan->int_num, - CYG_IO_SERIAL_GENERIC_16X5X_INT_PRIORITY, + intprio, (cyg_addrword_t)chan, pc_serial_ISR, pc_serial_DSR,
