1/* 2 * Copyright (C) 2001 MontaVista Software Inc. 3 * Author: Jun Sun, jsun@mvista.com or jsun@junsun.net 4 * 5 * This program is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License as published by the 7 * Free Software Foundation; either version 2 of the License, or (at your 8 * option) any later version. 9 * 10 */ 11 12 13#include "uart16550.h" 14 15/* === CONFIG === */ 16 17#define BASE 0xb8058000 18#define MAX_BAUD 1152000 19#define REG_OFFSET 4 20 21/* === END OF CONFIG === */ 22 23/* register offset */ 24#define OFS_RCV_BUFFER (0*REG_OFFSET) 25#define OFS_TRANS_HOLD (0*REG_OFFSET) 26#define OFS_SEND_BUFFER (0*REG_OFFSET) 27#define OFS_INTR_ENABLE (1*REG_OFFSET) 28#define OFS_INTR_ID (2*REG_OFFSET) 29#define OFS_DATA_FORMAT (3*REG_OFFSET) 30#define OFS_LINE_CONTROL (3*REG_OFFSET) 31#define OFS_MODEM_CONTROL (4*REG_OFFSET) 32#define OFS_RS232_OUTPUT (4*REG_OFFSET) 33#define OFS_LINE_STATUS (5*REG_OFFSET) 34#define OFS_MODEM_STATUS (6*REG_OFFSET) 35#define OFS_RS232_INPUT (6*REG_OFFSET) 36#define OFS_SCRATCH_PAD (7*REG_OFFSET) 37 38#define OFS_DIVISOR_LSB (0*REG_OFFSET) 39#define OFS_DIVISOR_MSB (1*REG_OFFSET) 40 41 42/* memory-mapped read/write of the port */ 43#define UART16550_READ(y) (*((volatile uint32*)(BASE + y))) 44#define UART16550_WRITE(y, z) ((*((volatile uint32*)(BASE + y))) = z) 45 46#define DEBUG_LED (*(unsigned short*)0xb7ffffc0) 47#define OutputLED(x) (DEBUG_LED = x) 48 49void Uart16550Init(uint32 baud, uint8 data, uint8 parity, uint8 stop) 50{ 51 /* disable interrupts */ 52 UART16550_WRITE(OFS_INTR_ENABLE, 0); 53 54 /* set up buad rate */ 55 { 56 uint32 divisor; 57 58 /* set DIAB bit */ 59 UART16550_WRITE(OFS_LINE_CONTROL, 0x80); 60 61 /* set divisor */ 62 divisor = MAX_BAUD / baud; 63 UART16550_WRITE(OFS_DIVISOR_LSB, divisor & 0xff); 64 UART16550_WRITE(OFS_DIVISOR_MSB, (divisor & 0xff00)>>8); 65 66 /* clear DIAB bit */ 67 UART16550_WRITE(OFS_LINE_CONTROL, 0x0); 68 } 69 70 /* set data format */ 71 UART16550_WRITE(OFS_DATA_FORMAT, data | parity | stop); 72} 73 74uint8 Uart16550GetPoll() 75{ 76 while((UART16550_READ(OFS_LINE_STATUS) & 0x1) == 0); 77 return UART16550_READ(OFS_RCV_BUFFER); 78} 79 80 81void Uart16550Put(uint8 byte) 82{ 83 while ((UART16550_READ(OFS_LINE_STATUS) &0x20) == 0); 84 UART16550_WRITE(OFS_SEND_BUFFER, byte); 85} 86 87