ppc4xx_serial.c

来自「是关于linux2.5.1的完全源码」· C语言 代码 · 共 191 行

C
191
字号
/* * linux/arch/ppc/kernel/ppc405_serial.c * * This is a fairly standard 165xx type device that will eventually * be merged with other similar processor/boards.	-- Dan * * BRIEF MODULE DESCRIPTION *	Console I/O support for Early kernel bringup.  * * Copyright 2000 MontaVista Software Inc. * Author: MontaVista Software, Inc. *         	frank_rowand@mvista.com or source@mvista.com * 	   	debbie_chu@mvista.com * * *  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  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT, *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * *  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., *  675 Mass Ave, Cambridge, MA 02139, USA. */#include <linux/config.h>#if defined(CONFIG_IBM405GP) || defined(CONFIG_IBM405CR)#ifdef CONFIG_KGDB#include <asm/kgdb.h>#include <linux/init.h>#endif#ifdef CONFIG_DEBUG_BRINGUP#include <linux/console.h>extern void ftr_reset_preferred_console(void);static int ppc405_sercons_setup(struct console *co, char *options){#ifdef CONFIG_UART0_DEBUG_CONSOLE    volatile unsigned char *uart_dll  = (char *)0xef600300;    volatile unsigned char *uart_fcr  = (char *)0xef600302;    volatile unsigned char *uart_lcr  = (char *)0xef600303;#endif#ifdef CONFIG_UART1_DEBUG_CONSOLE    volatile unsigned char *uart_dll  = (char *)0xef600400;    volatile unsigned char *uart_fcr  = (char *)0xef600402;    volatile unsigned char *uart_lcr  = (char *)0xef600403;#endif    *uart_lcr = *uart_lcr | 0x80;   /* DLAB on  *//* ftr revisit - there is no config option for this**  also see include/asm-ppc/ppc405_serial.h**** #define CONFIG_IBM405GP_INTERNAL_CLOCK*/#ifdef  CONFIG_IBM405GP_INTERNAL_CLOCK     /* ftr revisit    ** why is bit 19 of chcr0 (0x1000) being set?    */    /* 0x2a results in data corruption, kgdb works with 0x28 */    *uart_dll = 0x28;		    /* 9600 baud */    _put_CHCR0((_get_CHCR0() & 0xffffe000) | 0x103e);#else    *uart_dll = 0x48;		    /* 9600 baud */#endif    *uart_lcr = *uart_lcr & 0x7f;   /* DLAB off */    return 0;}/* * This is a bringup hack, writing directly to uart0 or uart1 */static voidppc405_sercons_write(struct console *co, const char *ptr,            unsigned nb){     int i;#ifdef CONFIG_UART0_DEBUG_CONSOLE    volatile unsigned char *uart_xmit = (char *)0xef600300;    volatile unsigned char *uart_lsr  = (char *)0xef600305;#endif#ifdef CONFIG_UART1_DEBUG_CONSOLE    volatile unsigned char *uart_xmit = (char *)0xef600400;    volatile unsigned char *uart_lsr  = (char *)0xef600405;#endif    for (i = 0; i < nb; ++i) {	/* wait for transmit reg (possibly fifo) to empty */	while ((*uart_lsr & 0x40) == 0)	    ;	*uart_xmit = (ptr[i] & 0xff);	if (ptr[i] == '\n') {	    /* add a carriage return */		    /* wait for transmit reg (possibly fifo) to empty */	    while ((*uart_lsr & 0x40) == 0)		;	    *uart_xmit = '\r';	}    }    return;}static intppc405_sercons_read(struct console *co, char *ptr, unsigned nb){ #ifdef CONFIG_UART0_DEBUG_CONSOLE    volatile unsigned char *uart_rcv  = (char *)0xef600300;    volatile unsigned char *uart_lsr  = (char *)0xef600305;#endif#ifdef CONFIG_UART1_DEBUG_CONSOLE    volatile unsigned char *uart_rcv  = (char *)0xef600400;    volatile unsigned char *uart_lsr  = (char *)0xef600405;#endif    /* ftr revisit: not tested */    if (nb == 0)	return(0);    if (!ptr)	return(-1);    /* wait for receive reg (possibly fifo) to contain data */    while ((*uart_lsr & 0x01) == 0)	;    *ptr = *uart_rcv;    return(1);}static struct console ppc405_sercons = {	name:		"dbg_cons",	write:		ppc405_console_write,	setup:		ppc405_console_setup,	flags:		CON_PRINTBUFFER,	index:		-1,};voidregister_debug_console(void){	register_console(&ppc405_sercons); }voidunregister_debug_console(void){	unregister_console(&ppc405_sercons);}#endif	/* CONFIG_DEBUG_BRINGUP */#endif	/* #if defined(CONFIG_IBM405GP) || defined(CONFIG_IBM405CR) */

⌨️ 快捷键说明

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