Ignore:
Timestamp:
Jul 21, 2009, 8:38:04 AM (10 years ago)
Author:
Thomas Doerfler <Thomas.Doerfler@…>
Branches:
4.10, 4.11, master
Children:
68799a2a
Parents:
115971c
Message:

Update for MPC55XX changes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • c/src/lib/libcpu/powerpc/mpc55xx/esci/esci.c

    r115971c rd374492  
    4242#undef CR2
    4343
    44 #define MPC55XX_ESCI_IRQ_PRIORITY MPC55XX_INTC_MIN_PRIORITY
     44#define MPC55XX_ESCI_IRQ_PRIORITY MPC55XX_INTC_DEFAULT_PRIORITY
    4545
    4646#define MPC55XX_ESCI_IS_MINOR_INVALD(minor) ((minor) < 0 || (minor) >= MPC55XX_ESCI_NUMBER)
     
    7474 */
    7575static const struct termios mpc55xx_esci_termios_default = {
    76         0,
    77         0,
    78         CS8 | CREAD | CLOCAL | B115200,
    79         0,
    80         0,
    81         { 0 }
     76        .c_cflag = CS8 | CREAD | CLOCAL | B115200
    8277};
    8378
     
    120115        volatile union ESCI_DR_tag *data = &e->regs->DR;
    121116        union ESCI_SR_tag sr = MPC55XX_ZERO_FLAGS;
    122 
    123         while (status->B.TDRE == 0) {
    124                 /* Wait */
    125         }
    126 
    127         /* Clear flag */
     117        rtems_interrupt_level level;
     118
     119        /* Set clear flag */
    128120        sr.B.TDRE = 1;
    129         status->R = sr.R;
    130 
    131         /* Write */
    132         data->B.D = c;
    133 }
    134 
    135 /** @} */
    136 
    137 /**
    138  * @name Termios Support
    139  * @{
    140  */
    141 
    142 /**
    143  * @brief Opens port @a minor.
    144  *
    145  * @return Status code.
    146  */
    147 static int mpc55xx_esci_termios_first_open( int major, int minor, void *arg)
    148 {
    149         mpc55xx_esci_driver_entry *e = &mpc55xx_esci_driver_table [minor];
     121
     122        while (true) {
     123                rtems_interrupt_disable( level);
     124                if (status->B.TDRE != 0) {
     125                        /* Clear flag */
     126                        status->R = sr.R;
     127
     128                        /* Write */
     129                        data->B.D = c;
     130
     131                        /* Done */
     132                        rtems_interrupt_enable( level);
     133                        break;
     134                }
     135                rtems_interrupt_enable( level);
     136
     137                while (status->B.TDRE == 0) {
     138                        /* Wait */
     139                }
     140        }
     141}
     142
     143static inline void mpc55xx_esci_interrupts_enable( mpc55xx_esci_driver_entry *e)
     144{
    150145        union ESCI_CR1_tag cr1 = MPC55XX_ZERO_FLAGS;
    151         struct rtems_termios_tty *tty = ((rtems_libio_open_close_args_t *) arg)->iop->data1;
    152 
    153         /* Check minor number */
    154         if (MPC55XX_ESCI_IS_MINOR_INVALD( minor)) {
    155                 return RTEMS_INVALID_NUMBER;
    156         }
    157 
    158         /* Connect TTY */
    159         e->tty = tty;   
    160 
    161         /* Enable interrupts */
    162         if (MPC55XX_ESCI_USE_INTERRUPTS( e)) {
    163                 cr1.R = e->regs->CR1.R;
    164                 cr1.B.RIE = 1;
    165                 cr1.B.TIE = 1;
    166                 e->regs->CR1.R = cr1.R;
    167         }
    168 
    169         return RTEMS_SUCCESSFUL;
    170 }
    171 
    172 /**
    173  * @brief Closes port @a minor.
    174  *
    175  * @return Status code.
    176  */
    177 static int mpc55xx_esci_termios_last_close( int major, int minor, void* arg)
    178 {
    179         mpc55xx_esci_driver_entry *e = &mpc55xx_esci_driver_table [minor];
     146        rtems_interrupt_level level;
     147
     148        rtems_interrupt_disable( level);
     149        cr1.R = e->regs->CR1.R;
     150        cr1.B.RIE = 1;
     151        cr1.B.TIE = 1;
     152        e->regs->CR1.R = cr1.R;
     153        rtems_interrupt_enable( level);
     154}
     155
     156static inline void mpc55xx_esci_interrupts_disable( mpc55xx_esci_driver_entry *e)
     157{
    180158        union ESCI_CR1_tag cr1 = MPC55XX_ZERO_FLAGS;
    181 
    182         /* Check minor number */
    183         if (MPC55XX_ESCI_IS_MINOR_INVALD( minor)) {
    184                 return RTEMS_INVALID_NUMBER;
    185         }
    186 
    187         /* Disable interrupts */
     159        rtems_interrupt_level level;
     160
     161        rtems_interrupt_disable( level);
    188162        cr1.R = e->regs->CR1.R;
    189163        cr1.B.RIE = 0;
    190164        cr1.B.TIE = 0;
    191165        e->regs->CR1.R = cr1.R;
     166        rtems_interrupt_enable( level);
     167}
     168
     169/** @} */
     170
     171/**
     172 * @name Termios Support
     173 * @{
     174 */
     175
     176/**
     177 * @brief Opens port @a minor.
     178 *
     179 * @return Status code.
     180 */
     181static int mpc55xx_esci_termios_first_open( int major, int minor, void *arg)
     182{
     183        int rv = 0;
     184        mpc55xx_esci_driver_entry *e = &mpc55xx_esci_driver_table [minor];
     185        struct rtems_termios_tty *tty = ((rtems_libio_open_close_args_t *) arg)->iop->data1;
     186
     187        /* Check minor number */
     188        if (MPC55XX_ESCI_IS_MINOR_INVALD( minor)) {
     189                return RTEMS_INVALID_NUMBER;
     190        }
     191
     192        /* Connect TTY */
     193        e->tty = tty;   
     194
     195        /* Enable interrupts */
     196        if (MPC55XX_ESCI_USE_INTERRUPTS( e)) {
     197                mpc55xx_esci_interrupts_enable( e);
     198        }
     199
     200        rv = rtems_termios_set_initial_baud( e->tty, 115200);
     201        RTEMS_CHECK_RV_SC( rv, "Set initial baud");
     202
     203        return RTEMS_SUCCESSFUL;
     204}
     205
     206/**
     207 * @brief Closes port @a minor.
     208 *
     209 * @return Status code.
     210 */
     211static int mpc55xx_esci_termios_last_close( int major, int minor, void* arg)
     212{
     213        mpc55xx_esci_driver_entry *e = &mpc55xx_esci_driver_table [minor];
     214
     215        /* Check minor number */
     216        if (MPC55XX_ESCI_IS_MINOR_INVALD( minor)) {
     217                return RTEMS_INVALID_NUMBER;
     218        }
     219
     220        /* Disable interrupts */
     221        mpc55xx_esci_interrupts_disable( e);
    192222
    193223        /* Disconnect TTY */
     
    205235{
    206236        mpc55xx_esci_driver_entry *e = &mpc55xx_esci_driver_table [minor];
    207        
    208         /* Check minor number */
    209         if (MPC55XX_ESCI_IS_MINOR_INVALD( minor)) {
     237        volatile union ESCI_SR_tag *status = &e->regs->SR;
     238        volatile union ESCI_DR_tag *data = &e->regs->DR;
     239        union ESCI_SR_tag sr = MPC55XX_ZERO_FLAGS;
     240
     241        if (status->B.RDRF == 0) {
    210242                return -1;
    211243        }
    212244
    213         return (int) mpc55xx_esci_read_char( e);
     245        /* Clear flag */
     246        sr.B.RDRF = 1;
     247        status->R = sr.R;
     248
     249        /* Read */
     250        return data->B.D;
    214251}
    215252
     
    232269        for (i = 0; i < n; ++i) {
    233270                mpc55xx_esci_write_char( e, out [i]);
    234                 if (out [i] == '\n') {
    235                         mpc55xx_esci_write_char( e, '\r');
    236                 }
    237271        }
    238272
     
    480514                                sc = mpc55xx_interrupt_handler_install(
    481515                                        e->irq_number,
    482                                         MPC55XX_ESCI_IRQ_PRIORITY,
    483516                                        "eSCI",
    484517                                        RTEMS_INTERRUPT_UNIQUE,
     518                                        MPC55XX_ESCI_IRQ_PRIORITY,
    485519                                        mpc55xx_esci_termios_interrupt_handler,
    486520                                        e
     
    512546                        sc =  rtems_termios_open( major, minor, arg, &mpc55xx_esci_termios_callbacks_polled);
    513547                }
    514                 if (sc != RTEMS_SUCCESSFUL) {
    515                         return sc;
    516                 }
    517                 rv = rtems_termios_set_initial_baud( e->tty, 115200);
    518                 if (rv < 0) {
    519                         return RTEMS_IO_ERROR;
    520                 }
     548                RTEMS_CHECK_SC( sc, "Open");
    521549        }
    522550
     
    624652{
    625653        mpc55xx_esci_driver_entry *e = &mpc55xx_esci_driver_table [mpc55xx_esci_output_char_minor];
     654
     655        mpc55xx_esci_interrupts_disable( e);
    626656        mpc55xx_esci_write_char( e, c);
    627657        if (c == '\n') {
    628658                mpc55xx_esci_write_char( e, '\r');
    629659        }
     660        mpc55xx_esci_interrupts_enable( e);
    630661}
    631662
     
    637668static void mpc55xx_esci_output_char_init( char c)
    638669{
    639         int console_found = 0;
     670        bool console_found = false;
    640671        int i = 0;
     672
    641673        for (i = 0; i < MPC55XX_ESCI_NUMBER; ++i) {
    642674                if (mpc55xx_esci_driver_table [i].console) {
    643                         console_found = 1;
     675                        console_found = true;
    644676                        mpc55xx_esci_output_char_minor = i;
    645677                        break;
    646678                }
    647679        }
     680
    648681        if (console_found) {
    649682                BSP_output_char = mpc55xx_esci_output_char;
Note: See TracChangeset for help on using the changeset viewer.