Changeset 277cf60 in mainline for kernel/genarch/src/drivers/s3c24xx_uart/s3c24xx_uart.c
- Timestamp:
- 2010-07-25T16:52:18Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- b8b4efa
- Parents:
- ec08286
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/genarch/src/drivers/s3c24xx_uart/s3c24xx_uart.c
rec08286 r277cf60 47 47 #include <str.h> 48 48 49 /** S3C24xx UART register offsets */50 #define S3C24XX_ULCON 0x0051 #define S3C24XX_UCON 0x0452 #define S3C24XX_UFCON 0x0853 #define S3C24XX_UMCON 0x0c54 #define S3C24XX_UTRSTAT 0x1055 #define S3C24XX_UERSTAT 0x1456 #define S3C24XX_UFSTAT 0x1857 #define S3C24XX_UMSTAT 0x1c58 #define S3C24XX_UTXH 0x2059 #define S3C24XX_URXH 0x2460 #define S3C24XX_UBRDIV 0x2861 62 49 /* Bits in UTRSTAT register */ 63 50 #define S3C24XX_UTRSTAT_TX_EMPTY 0x4 … … 66 53 static void s3c24xx_uart_sendb(outdev_t *dev, uint8_t byte) 67 54 { 68 s3c24xx_uart_instance_t *instance = 69 (s3c24xx_uart_instance_t *) dev->data; 70 ioport32_t *utrstat, *utxh; 71 72 utrstat = (ioport32_t *) (instance->base + S3C24XX_UTRSTAT); 73 utxh = (ioport32_t *) (instance->base + S3C24XX_UTXH); 55 s3c24xx_uart_t *uart = 56 (s3c24xx_uart_t *) dev->data; 74 57 75 58 /* Wait for transmitter to be empty. */ 76 while ((pio_read_32( utrstat) & S3C24XX_UTRSTAT_TX_EMPTY) == 0)59 while ((pio_read_32(&uart->io->utrstat) & S3C24XX_UTRSTAT_TX_EMPTY) == 0) 77 60 ; 78 61 79 pio_write_32( utxh, byte);62 pio_write_32(&uart->io->utxh, byte); 80 63 } 81 64 … … 100 83 static void s3c24xx_uart_irq_handler(irq_t *irq) 101 84 { 102 s3c24xx_uart_instance_t *instance = irq->instance; 103 ioport32_t *utrstat, *urxh; 85 s3c24xx_uart_t *uart = irq->instance; 104 86 105 utrstat = (ioport32_t *) (instance->base + S3C24XX_UTRSTAT); 106 urxh = (ioport32_t *) (instance->base + S3C24XX_URXH); 107 108 if ((pio_read_32(utrstat) & S3C24XX_UTRSTAT_RDATA) != 0) { 109 uint32_t data = pio_read_32(urxh); 110 indev_push_character(instance->indev, data & 0xff); 87 if ((pio_read_32(&uart->io->utrstat) & S3C24XX_UTRSTAT_RDATA) != 0) { 88 uint32_t data = pio_read_32(&uart->io->urxh); 89 indev_push_character(uart->indev, data & 0xff); 111 90 } 112 91 } … … 117 96 }; 118 97 119 outdev_t *s3c24xx_uart_init( ioport8_t *base, inr_t inr)98 outdev_t *s3c24xx_uart_init(s3c24xx_uart_io_t *io, inr_t inr) 120 99 { 121 100 outdev_t *uart_dev = malloc(sizeof(outdev_t), FRAME_ATOMIC); … … 123 102 return NULL; 124 103 125 s3c24xx_uart_ instance_t *instance=126 malloc(sizeof(s3c24xx_uart_ instance_t), FRAME_ATOMIC);127 if (! instance) {104 s3c24xx_uart_t *uart = 105 malloc(sizeof(s3c24xx_uart_t), FRAME_ATOMIC); 106 if (!uart) { 128 107 free(uart_dev); 129 108 return NULL; … … 131 110 132 111 outdev_initialize("s3c24xx_uart_dev", uart_dev, &s3c24xx_uart_ops); 133 uart_dev->data = instance;112 uart_dev->data = uart; 134 113 135 instance->base = base;136 instance->indev = NULL;114 uart->io = io; 115 uart->indev = NULL; 137 116 138 117 /* Initialize IRQ structure. */ 139 irq_initialize(& instance->irq);140 instance->irq.devno = device_assign_devno();141 instance->irq.inr = inr;142 instance->irq.claim = s3c24xx_uart_claim;143 instance->irq.handler = s3c24xx_uart_irq_handler;144 instance->irq.instance = instance;118 irq_initialize(&uart->irq); 119 uart->irq.devno = device_assign_devno(); 120 uart->irq.inr = inr; 121 uart->irq.claim = s3c24xx_uart_claim; 122 uart->irq.handler = s3c24xx_uart_irq_handler; 123 uart->irq.instance = uart; 145 124 146 125 /* Disable FIFO */ 147 ioport32_t *ufcon; 148 ufcon = (ioport32_t *) (instance->base + S3C24XX_UFCON); 149 pio_write_32(ufcon, pio_read_32(ufcon) & ~0x01); 126 pio_write_32(&uart->io->ufcon, 127 pio_read_32(&uart->io->ufcon) & ~0x01); 150 128 151 129 /* Set RX interrupt to pulse mode */ 152 ioport32_t *ucon; 153 ucon = (ioport32_t *) (instance->base + S3C24XX_UCON); 154 pio_write_32(ucon, pio_read_32(ucon) & ~(1 << 8)); 130 pio_write_32(&uart->io->ucon, 131 pio_read_32(&uart->io->ucon) & ~(1 << 8)); 155 132 156 133 if (!fb_exported) { … … 161 138 sysinfo_set_item_val("fb", NULL, true); 162 139 sysinfo_set_item_val("fb.kind", NULL, 3); 163 sysinfo_set_item_val("fb.address.physical", NULL, KA2PA( base));140 sysinfo_set_item_val("fb.address.physical", NULL, KA2PA(io)); 164 141 165 142 fb_exported = true; … … 169 146 } 170 147 171 void s3c24xx_uart_input_wire(s3c24xx_uart_ instance_t *instance, indev_t *indev)148 void s3c24xx_uart_input_wire(s3c24xx_uart_t *uart, indev_t *indev) 172 149 { 173 ASSERT( instance);150 ASSERT(uart); 174 151 ASSERT(indev); 175 152 176 instance->indev = indev;177 irq_register(& instance->irq);153 uart->indev = indev; 154 irq_register(&uart->irq); 178 155 } 179 156
Note:
See TracChangeset
for help on using the changeset viewer.