77 lines
		
	
	
	
		
			2.1 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			77 lines
		
	
	
	
		
			2.1 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
|   | /*
 | ||
|  |  * kgdb debug routines for SiByte boards. | ||
|  |  * | ||
|  |  * Copyright (C) 2001 MontaVista Software Inc. | ||
|  |  * Author: Jun Sun, jsun@mvista.com or jsun@junsun.net | ||
|  |  * | ||
|  |  * 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. | ||
|  |  * | ||
|  |  */ | ||
|  | 
 | ||
|  | /* -------------------- BEGINNING OF CONFIG --------------------- */ | ||
|  | 
 | ||
|  | #include <linux/delay.h>
 | ||
|  | #include <asm/io.h>
 | ||
|  | #include <asm/sibyte/sb1250.h>
 | ||
|  | #include <asm/sibyte/sb1250_regs.h>
 | ||
|  | #include <asm/sibyte/sb1250_uart.h>
 | ||
|  | #include <asm/sibyte/sb1250_int.h>
 | ||
|  | #include <asm/addrspace.h>
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |  * We use the second serial port for kgdb traffic. | ||
|  |  * 	115200, 8, N, 1. | ||
|  |  */ | ||
|  | 
 | ||
|  | #define	BAUD_RATE		115200
 | ||
|  | #define	CLK_DIVISOR		V_DUART_BAUD_RATE(BAUD_RATE)
 | ||
|  | #define	DATA_BITS		V_DUART_BITS_PER_CHAR_8		/* or 7    */
 | ||
|  | #define	PARITY			V_DUART_PARITY_MODE_NONE	/* or even */
 | ||
|  | #define	STOP_BITS		M_DUART_STOP_BIT_LEN_1		/* or 2    */
 | ||
|  | 
 | ||
|  | static int duart_initialized = 0;	/* 0: need to be init'ed by kgdb */ | ||
|  | 
 | ||
|  | /* -------------------- END OF CONFIG --------------------- */ | ||
|  | extern int kgdb_port; | ||
|  | 
 | ||
|  | #define	duart_out(reg, val)	csr_out32(val, IOADDR(A_DUART_CHANREG(kgdb_port,reg)))
 | ||
|  | #define duart_in(reg)		csr_in32(IOADDR(A_DUART_CHANREG(kgdb_port,reg)))
 | ||
|  | 
 | ||
|  | void putDebugChar(unsigned char c); | ||
|  | unsigned char getDebugChar(void); | ||
|  | static void | ||
|  | duart_init(int clk_divisor, int data, int parity, int stop) | ||
|  | { | ||
|  | 	duart_out(R_DUART_MODE_REG_1, data | parity); | ||
|  | 	duart_out(R_DUART_MODE_REG_2, stop); | ||
|  | 	duart_out(R_DUART_CLK_SEL, clk_divisor); | ||
|  | 
 | ||
|  | 	duart_out(R_DUART_CMD, M_DUART_RX_EN | M_DUART_TX_EN);	/* enable rx and tx */ | ||
|  | } | ||
|  | 
 | ||
|  | void | ||
|  | putDebugChar(unsigned char c) | ||
|  | { | ||
|  | 	if (!duart_initialized) { | ||
|  | 		duart_initialized = 1; | ||
|  | 		duart_init(CLK_DIVISOR, DATA_BITS, PARITY, STOP_BITS); | ||
|  | 	} | ||
|  | 	while ((duart_in(R_DUART_STATUS) & M_DUART_TX_RDY) == 0); | ||
|  | 	duart_out(R_DUART_TX_HOLD, c); | ||
|  | } | ||
|  | 
 | ||
|  | unsigned char | ||
|  | getDebugChar(void) | ||
|  | { | ||
|  | 	if (!duart_initialized) { | ||
|  | 		duart_initialized = 1; | ||
|  | 		duart_init(CLK_DIVISOR, DATA_BITS, PARITY, STOP_BITS); | ||
|  | 	} | ||
|  | 	while ((duart_in(R_DUART_STATUS) & M_DUART_RX_RDY) == 0) ; | ||
|  | 	return duart_in(R_DUART_RX_HOLD); | ||
|  | } | ||
|  | 
 |