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);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 |