iop480_uart.c

来自「最新版的u-boot,2008-10-18发布」· C语言 代码 · 共 238 行

C
238
字号
/* * (C) Copyright 2000-2006 * Wolfgang Denk, DENX Software Engineering, wd@denx.de. * * See file CREDITS for list of people who contributed to this * project. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA */#include <common.h>#include <commproc.h>#include <asm/processor.h>#include <asm/io.h>#include <watchdog.h>#ifdef CONFIG_SERIAL_MULTI#include <serial.h>#endifDECLARE_GLOBAL_DATA_PTR;#ifdef CONFIG_IOP480#define SPU_BASE         0x40000000#define spu_LineStat_rc  0x00	/* Line Status Register (Read/Clear) */#define spu_LineStat_w   0x04	/* Line Status Register (Set) */#define spu_Handshk_rc   0x08	/* Handshake Status Register (Read/Clear) */#define spu_Handshk_w    0x0c	/* Handshake Status Register (Set) */#define spu_BRateDivh    0x10	/* Baud rate divisor high */#define spu_BRateDivl    0x14	/* Baud rate divisor low */#define spu_CtlReg       0x18	/* Control Register */#define spu_RxCmd        0x1c	/* Rx Command Register */#define spu_TxCmd        0x20	/* Tx Command Register */#define spu_RxBuff       0x24	/* Rx data buffer */#define spu_TxBuff       0x24	/* Tx data buffer *//*-----------------------------------------------------------------------------+  | Line Status Register.  +-----------------------------------------------------------------------------*/#define asyncLSRport1           0x40000000#define asyncLSRport1set        0x40000004#define asyncLSRDataReady             0x80#define asyncLSRFramingError          0x40#define asyncLSROverrunError          0x20#define asyncLSRParityError           0x10#define asyncLSRBreakInterrupt        0x08#define asyncLSRTxHoldEmpty           0x04#define asyncLSRTxShiftEmpty          0x02/*-----------------------------------------------------------------------------+  | Handshake Status Register.  +-----------------------------------------------------------------------------*/#define asyncHSRport1           0x40000008#define asyncHSRport1set        0x4000000c#define asyncHSRDsr                   0x80#define asyncLSRCts                   0x40/*-----------------------------------------------------------------------------+  | Control Register.  +-----------------------------------------------------------------------------*/#define asyncCRport1            0x40000018#define asyncCRNormal                 0x00#define asyncCRLoopback               0x40#define asyncCRAutoEcho               0x80#define asyncCRDtr                    0x20#define asyncCRRts                    0x10#define asyncCRWordLength7            0x00#define asyncCRWordLength8            0x08#define asyncCRParityDisable          0x00#define asyncCRParityEnable           0x04#define asyncCREvenParity             0x00#define asyncCROddParity              0x02#define asyncCRStopBitsOne            0x00#define asyncCRStopBitsTwo            0x01#define asyncCRDisableDtrRts          0x00/*-----------------------------------------------------------------------------+  | Receiver Command Register.  +-----------------------------------------------------------------------------*/#define asyncRCRport1           0x4000001c#define asyncRCRDisable               0x00#define asyncRCREnable                0x80#define asyncRCRIntDisable            0x00#define asyncRCRIntEnabled            0x20#define asyncRCRDMACh2                0x40#define asyncRCRDMACh3                0x60#define asyncRCRErrorInt              0x10#define asyncRCRPauseEnable           0x08/*-----------------------------------------------------------------------------+  | Transmitter Command Register.  +-----------------------------------------------------------------------------*/#define asyncTCRport1           0x40000020#define asyncTCRDisable               0x00#define asyncTCREnable                0x80#define asyncTCRIntDisable            0x00#define asyncTCRIntEnabled            0x20#define asyncTCRDMACh2                0x40#define asyncTCRDMACh3                0x60#define asyncTCRTxEmpty               0x10#define asyncTCRErrorInt              0x08#define asyncTCRStopPause             0x04#define asyncTCRBreakGen              0x02/*-----------------------------------------------------------------------------+  | Miscellanies defines.  +-----------------------------------------------------------------------------*/#define asyncTxBufferport1      0x40000024#define asyncRxBufferport1      0x40000024#define asyncDLABLsbport1       0x40000014#define asyncDLABMsbport1       0x40000010#define asyncXOFFchar                 0x13#define asyncXONchar                  0x11/* * Minimal serial functions needed to use one of the SMC ports * as serial console interface. */int serial_init (void){	volatile char val;	unsigned short br_reg;	br_reg = ((((CONFIG_CPUCLOCK * 1000000) / 16) / gd->baudrate) - 1);	/*	 * Init onboard UART	 */	out_8((u8 *)SPU_BASE + spu_LineStat_rc, 0x78); /* Clear all bits in Line Status Reg */	out_8((u8 *)SPU_BASE + spu_BRateDivl, (br_reg & 0x00ff)); /* Set baud rate divisor... */	out_8((u8 *)SPU_BASE + spu_BRateDivh, ((br_reg & 0xff00) >> 8)); /* ... */	out_8((u8 *)SPU_BASE + spu_CtlReg, 0x08);	/* Set 8 bits, no parity and 1 stop bit */	out_8((u8 *)SPU_BASE + spu_RxCmd, 0xb0);	/* Enable Rx */	out_8((u8 *)SPU_BASE + spu_TxCmd, 0x9c);	/* Enable Tx */	out_8((u8 *)SPU_BASE + spu_Handshk_rc, 0xff);	/* Clear Handshake */	val = in_8((u8 *)SPU_BASE + spu_RxBuff);	/* Dummy read, to clear receiver */	return (0);}void serial_setbrg (void){	unsigned short br_reg;	br_reg = ((((CONFIG_CPUCLOCK * 1000000) / 16) / gd->baudrate) - 1);	out_8((u8 *)SPU_BASE + spu_BRateDivl,	      (br_reg & 0x00ff)); /* Set baud rate divisor... */	out_8((u8 *)SPU_BASE + spu_BRateDivh,	      ((br_reg & 0xff00) >> 8)); /* ... */}void serial_putc (const char c){	if (c == '\n')		serial_putc ('\r');	/* load status from handshake register */	if (in_8((u8 *)SPU_BASE + spu_Handshk_rc) != 00)		out_8((u8 *)SPU_BASE + spu_Handshk_rc, 0xff);	/* Clear Handshake */	out_8((u8 *)SPU_BASE + spu_TxBuff, c);	/* Put char */	while ((in_8((u8 *)SPU_BASE + spu_LineStat_rc) & 04) != 04) {		if (in_8((u8 *)SPU_BASE + spu_Handshk_rc) != 00)			out_8((u8 *)SPU_BASE + spu_Handshk_rc, 0xff);	/* Clear Handshake */	}}void serial_puts (const char *s){	while (*s) {		serial_putc (*s++);	}}int serial_getc (){	unsigned char status = 0;	while (1) {		status = in_8((u8 *)asyncLSRport1);		if ((status & asyncLSRDataReady) != 0x0) {			break;		}		if ((status & ( asyncLSRFramingError |				asyncLSROverrunError |				asyncLSRParityError  |				asyncLSRBreakInterrupt )) != 0) {			(void) out_8((u8 *)asyncLSRport1,				     asyncLSRFramingError |				     asyncLSROverrunError |				     asyncLSRParityError  |				     asyncLSRBreakInterrupt );		}	}	return (0x000000ff & (int) in_8((u8 *)asyncRxBufferport1));}int serial_tstc (){	unsigned char status;	status = in_8((u8 *)asyncLSRport1);	if ((status & asyncLSRDataReady) != 0x0) {		return (1);	}	if ((status & ( asyncLSRFramingError |			asyncLSROverrunError |			asyncLSRParityError  |			asyncLSRBreakInterrupt )) != 0) {		(void) out_8((u8 *)asyncLSRport1,			     asyncLSRFramingError |			     asyncLSROverrunError |			     asyncLSRParityError  |			     asyncLSRBreakInterrupt);	}	return 0;}#endif	/* CONFIG_IOP480 */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?