Changeset ca97cad in mainline for uspace/srv/drivers/serial/serial.c


Ignore:
Timestamp:
2010-05-06T11:42:55Z (14 years ago)
Author:
Lenka Trochtova <trochtova.lenka@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
ab1aa871
Parents:
ba95e8f
Message:

writing to serial port using character interface

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/drivers/serial/serial.c

    rba95e8f rca97cad  
    9292}
    9393
     94static bool serial_received(ioport8_t *port)
     95{
     96   return (pio_read_8(port + 5) & 1) != 0;
     97}
     98
     99static uint8_t serial_read_8(ioport8_t *port)
     100{
     101        return pio_read_8(port);
     102}
     103
     104static bool is_transmit_empty(ioport8_t *port)
     105{
     106   return (pio_read_8(port + 5) & 0x20) != 0;
     107}
     108
     109static void serial_write_8(ioport8_t *port, uint8_t c)
     110{
     111        while (!is_transmit_empty(port))
     112                ;
     113       
     114        pio_write_8(port, c);
     115}
     116
    94117static int serial_read(device_t *dev, char *buf, size_t count)
    95118{
     
    111134}
    112135
     136static inline void serial_putchar(serial_dev_data_t *data, uint8_t c)
     137{       
     138        fibril_mutex_lock(&data->mutex);
     139        serial_write_8(data->port, c); 
     140        fibril_mutex_unlock(&data->mutex);
     141}
     142
    113143static int serial_write(device_t *dev, char *buf, size_t count)
    114144{
    115         // TODO
     145        serial_dev_data_t *data = (serial_dev_data_t *)dev->driver_data;
     146       
     147        size_t idx;
     148        for (idx = 0; idx < count; idx++) {
     149                serial_putchar(data, (uint8_t)buf[idx]);
     150        }
     151       
    116152        return 0;
    117153}
     
    150186                dev->parent_phone = 0;
    151187        }       
    152 }
    153 
    154 static bool serial_received(ioport8_t *port)
    155 {
    156    return (pio_read_8(port + 5) & 1) != 0;
    157 }
    158 
    159 static uint8_t serial_read_8(ioport8_t *port)
    160 {
    161         return pio_read_8(port);
    162 }
    163 
    164 static bool is_transmit_empty(ioport8_t *port)
    165 {
    166    return (pio_read_8(port + 5) & 0x20) != 0;
    167 }
    168 
    169 static void serial_write_8(ioport8_t *port, uint8_t c)
    170 {
    171         while (!is_transmit_empty(port))
    172                 ;
    173        
    174         pio_write_8(port, c);
    175188}
    176189
     
    333346       
    334347        while (cont) { 
     348                fibril_mutex_lock(&data->mutex);
     349               
    335350                if (cont = serial_received(port)) {
    336351                        uint8_t val = serial_read_8(port);
    337352                        printf(NAME ": character %c read from %s.\n", val, dev->name);
    338353                       
    339                         fibril_mutex_lock(&data->mutex);
     354                       
    340355                        if (data->client_connected) {
    341356                                if (!buf_push_back(&(data->input_buffer), val)) {
     
    346361                        } else {
    347362                                printf(NAME ": no client is connected to %s, discarding the character which was read.\n", dev->name);
    348                         }
    349                         fibril_mutex_unlock(&data->mutex);
     363                        }                       
    350364                }
    351365               
     366                fibril_mutex_unlock(&data->mutex);     
     367               
     368                fibril_yield();         
    352369        }       
    353370}
Note: See TracChangeset for help on using the changeset viewer.