📄 s3c2410.c
字号:
/* * drivers/serial/serial_s3c2410.c: * specfic routines for S3C2410 UARTs * * Author: Janghoon Lyu * Created: October 16, 2003 * Copyright: MIZI Research, Inc. All rights reserved. * * Last modified: $Date: 2004/05/24 06:11:35 $ * $Revision: 1.4 $ * * 2003-10-22 Add timeout to prevent system halt. * By Janghoon Lyu. */#include <config.h>#include <machine.h>#define ULCON_OFS (0x00) /* R/W, UART line control register */#define UCON_OFS (0x04) /* R/W, UART control register */#define UFCON_OFS (0x08) /* R/W, UART FIFO control register */#define UMCON_OFS (0x0C) /* R/W, UART modem control register */#define UTRSTAT_OFS (0x10) /* R , UART Tx/Rx status register */#define UERSTAT_OFS (0x14) /* R , UART Rx error status register */#define UFSTAT_OFS (0x18) /* R , UART FIFO status register */#define UMSTAT_OFS (0x1C) /* R , UART Modem status register */#define UTXHL_OFS (0x20) /* W, UART transmit(little-end) buffer */#define UTXHB_OFS (0x23) /* W, UART transmit(big-end) buffer */#define URXHL_OFS (0x24) /* R , UART receive(little-end) buffer */#define URXHB_OFS (0x27) /* R , UART receive(big-end) buffer */#define UBRDIV_OFS (0x28) /* R/W, Baud rate divisor register */#if defined(CONFIG_SERIAL_UART0)#define OFFSET 0x0#define GPIO_OFFSET 2#elif defined(CONFIG_SERIAL_UART1)#define OFFSET 0x4000#define GPIO_OFFSET 4#elif defined(CONFIG_SERIAL_UART2)#define OFFSET 0x8000#define GPIO_OFFSET 6#else#error Not exist UART on this processor.#endifvoiduart_init(void){ unsigned long base_addr = 0x50000000 + OFFSET; unsigned long baudrate = CONFIG_SERIAL_DEFAULT_BAUDRATE; unsigned long ubrdiv = ((UART_REF_CLK / (baudrate * 16)) - 1); unsigned long timeout; /* set GPIOs */ GPHCON &= ~(0xf << GPIO_OFFSET); GPHCON |= (0xa << GPIO_OFFSET); GPHUP |= (0x3 << GPIO_OFFSET); /* set UART controller */ *(volatile unsigned long *)(base_addr+UFCON_OFS) = 0x0; *(volatile unsigned long *)(base_addr+UMCON_OFS) = 0x0; *(volatile unsigned long *)(base_addr+ULCON_OFS) = 0x3; *(volatile unsigned long *)(base_addr+UCON_OFS) = 0x45; *(volatile unsigned long *)(base_addr+UBRDIV_OFS) = ubrdiv; /* flush FIFO of UART */ timeout = 10000; while (1) { char c; unsigned long stat; stat = *(volatile unsigned long *)(base_addr+UTRSTAT_OFS); if ((stat & (1 << 2)) && (stat & (1 << 1))) break; c = *(volatile unsigned char *)(base_addr+UTXHL_OFS); /* Anyway, I will go. */ if (--timeout < 0) break; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -