linux-2.4.29操作系统的源码

源代码在线查看: debug.c

软件大小: 37768 K
上传用户: sunqingyan
关键词: linux 29 操作系统 源码
下载地址: 免注册下载 普通下载 VIP

相关代码

				/*				 * linux/arch/m68k/mac/debug.c				 *				 * Shamelessly stolen (SCC code and general framework) from:				 *				 * linux/arch/m68k/atari/debug.c				 *				 * Atari debugging and serial console stuff				 *				 * Assembled of parts of former atari/config.c 97-12-18 by Roman Hodek				 *  				 * This file is subject to the terms and conditions of the GNU General Public				 * License.  See the file COPYING in the main directory of this archive				 * for more details.				 */								#include 				#include 				#include 				#include 				#include 				#include 				#include 								#define BOOTINFO_COMPAT_1_0				#include 				#include 				#include 				#include 								extern char m68k_debug_device[];								extern struct compat_bootinfo compat_boot_info;								extern unsigned long mac_videobase;				extern unsigned long mac_videodepth;				extern unsigned long mac_rowbytes;								extern void mac_serial_print(const char *);								#define DEBUG_HEADS				#undef DEBUG_SCREEN				#define DEBUG_SERIAL								/*				 * These two auxiliary debug functions should go away ASAP. Only usage: 				 * before the console output is up (after head.S come some other crucial				 * setup routines :-) it permits writing 'data' to the screen as bit patterns				 * (good luck reading those). Helped to figure that the bootinfo contained				 * garbage data on the amount and size of memory chunks ...				 *				 * The 'pos' argument now simply means 'linefeed after print' ...				 */								#ifdef DEBUG_SCREEN				static int peng=0, line=0;				#endif								void mac_debugging_short(int pos, short num)				{				#ifdef DEBUG_SCREEN					unsigned char *pengoffset;					unsigned char *pptr;					int i;				#endif								#ifdef DEBUG_SERIAL					printk("debug: %d !\n", num);				#endif								#ifdef DEBUG_SCREEN					if (!MACH_IS_MAC) {						/* printk("debug: %d !\n", num); */						return;					}									/* calculate current offset */					pengoffset=(unsigned char *)(mac_videobase+(150+line*2)*mac_rowbytes)						    +80*peng;										pptr=pengoffset;										for(i=0;i					{						/*        value        mask for bit i, reverse order */						*pptr++ = (num & ( 1 					}									peng++;									if (pos) {						line++;						peng = 0;					}				#endif				}								void mac_debugging_long(int pos, long addr)				{				#ifdef DEBUG_SCREEN					unsigned char *pengoffset;					unsigned char *pptr;					int i;				#endif								#ifdef DEBUG_SERIAL					printk("debug: #%ld !\n", addr);				#endif								#ifdef DEBUG_SCREEN					if (!MACH_IS_MAC) {						/* printk("debug: #%ld !\n", addr); */						return;					}										pengoffset=(unsigned char *)(mac_videobase+(150+line*2)*mac_rowbytes)						    +80*peng;										pptr=pengoffset;										for(i=0;i					{						*pptr++ = (addr & ( 1 					}									peng++;									if (pos) {						line++;						peng = 0;					}				#endif				}								#ifdef DEBUG_SERIAL				/*				 * TODO: serial debug code				 */								struct mac_SCC				 {				  u_char cha_b_ctrl;				  u_char char_dummy1;				  u_char cha_a_ctrl;				  u_char char_dummy2;				  u_char cha_b_data;				  u_char char_dummy3;				  u_char cha_a_data;				 };								# define scc (*((volatile struct mac_SCC*)mac_bi_data.sccbase))								/* Flag that serial port is already initialized and used */				int mac_SCC_init_done = 0;				/* Can be set somewhere, if a SCC master reset has already be done and should				 * not be repeated; used by kgdb */				int mac_SCC_reset_done = 0;								static int scc_port = -1;								static struct console mac_console_driver = {					name:		"debug",					flags:		CON_PRINTBUFFER,					index:		-1,				};								/*				 * Crude hack to get console output to the screen before the framebuffer				 * is initialized (happens a lot later in 2.1!).				 * We just use the console routines declared in head.S, this will interfere				 * with regular framebuffer console output and should be used exclusively				 * to debug kernel problems manifesting before framebuffer init (aka WSOD)				 *				 * To keep this hack from interfering with the regular console driver, either				 * deregister this driver before/on framebuffer console init, or silence this				 * function after the fbcon driver is running (will lose console messages!?).				 * To debug real early bugs, need to write a 'mac_register_console_hack()'				 * that is called from start_kernel() before setup_arch() and just registers				 * this driver if Mac.				 */								void mac_debug_console_write (struct console *co, const char *str,							      unsigned int count)				{					mac_serial_print(str);				}																/* Mac: loops_per_jiffy min. 19000 ^= .5 us; MFPDELAY was 0.6 us*/								#define uSEC 1								static inline void mac_sccb_out (char c)				{				    int i;				    do {					for( i = uSEC; i > 0; --i )						barrier();				    } while (!(scc.cha_b_ctrl & 0x04)); /* wait for tx buf empty */				    for( i = uSEC; i > 0; --i )					barrier();				    scc.cha_b_data = c;				}								static inline void mac_scca_out (char c)				{				    int i;				    do {					for( i = uSEC; i > 0; --i )						barrier();				    } while (!(scc.cha_a_ctrl & 0x04)); /* wait for tx buf empty */				    for( i = uSEC; i > 0; --i )					barrier();				    scc.cha_a_data = c;				}								void mac_sccb_console_write (struct console *co, const char *str,							      unsigned int count)				{				    while (count--) {					if (*str == '\n')					    mac_sccb_out( '\r' );					mac_sccb_out( *str++ );				    }				}								void mac_scca_console_write (struct console *co, const char *str,							      unsigned int count)				{				    while (count--) {					if (*str == '\n')					    mac_scca_out( '\r' );					mac_scca_out( *str++ );				    }				}								/* The following two functions do a quick'n'dirty initialization of the MFP or				 * SCC serial ports. They're used by the debugging interface, kgdb, and the				 * serial console code. */				#define SCCB_WRITE(reg,val)				\				    do {						\					int i;						\					scc.cha_b_ctrl = (reg);				\					for( i = uSEC; i > 0; --i )			\						barrier();				\					scc.cha_b_ctrl = (val);				\					for( i = uSEC; i > 0; --i )			\						barrier();				\				    } while(0)								#define SCCA_WRITE(reg,val)				\				    do {						\					int i;						\					scc.cha_a_ctrl = (reg);				\					for( i = uSEC; i > 0; --i )			\						barrier();				\					scc.cha_a_ctrl = (val);				\					for( i = uSEC; i > 0; --i )			\						barrier();				\				    } while(0)								/* loops_per_jiffy isn't initialized yet, so we can't use udelay(). This does a				 * delay of ~ 60us. */				/* Mac: loops_per_jiffy min. 19000 ^= .5 us; MFPDELAY was 0.6 us*/				#define LONG_DELAY()				\				    do {					\					int i;					\					for( i = 60*uSEC; i > 0; --i )		\					    barrier();				\				    } while(0)				    				#ifndef CONFIG_SERIAL_CONSOLE				static void __init mac_init_scc_port( int cflag, int port )				#else				void mac_init_scc_port( int cflag, int port )				#endif				{					extern int mac_SCC_reset_done;									/*					 * baud rates: 1200, 1800, 2400, 4800, 9600, 19.2k, 38.4k, 57.6k, 115.2k					 */									static int clksrc_table[9] =						/* reg 11: 0x50 = BRG, 0x00 = RTxC, 0x28 = TRxC */				    		{ 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x00, 0x00 };					static int clkmode_table[9] =						/* reg 4: 0x40 = x16, 0x80 = x32, 0xc0 = x64 */				    		{ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0xc0, 0x80 };					static int div_table[9] =						/* reg12 (BRG low) */				    		{ 94, 62, 46, 22, 10, 4, 1, 0, 0 };								    int baud = cflag & CBAUD;				    int clksrc, clkmode, div, reg3, reg5;				    				    if (cflag & CBAUDEX)					baud += B38400;				    if (baud < B1200 || baud > B38400+2)					baud = B9600; /* use default 9600bps for non-implemented rates */				    baud -= B1200; /* tables starts at 1200bps */								    clksrc  = clksrc_table[baud];				    clkmode = clkmode_table[baud];				    div     = div_table[baud];								    reg3 = (((cflag & CSIZE) == CS8) ? 0xc0 : 0x40);				    reg5 = (((cflag & CSIZE) == CS8) ? 0x60 : 0x20) | 0x82 /* assert DTR/RTS */;								    if (port == 1) {					    (void)scc.cha_b_ctrl;	/* reset reg pointer */					    SCCB_WRITE( 9, 0xc0 );	/* reset */					    LONG_DELAY();		/* extra delay after WR9 access */					    SCCB_WRITE( 4, (cflag & PARENB) ? ((cflag & PARODD) ? 0x01 : 0x03) : 0 |							  0x04 /* 1 stopbit */ |							  clkmode );					    SCCB_WRITE( 3, reg3 );					    SCCB_WRITE( 5, reg5 );					    SCCB_WRITE( 9, 0 );		/* no interrupts */					    LONG_DELAY();		/* extra delay after WR9 access */					    SCCB_WRITE( 10, 0 );	/* NRZ mode */					    SCCB_WRITE( 11, clksrc );	/* main clock source */					    SCCB_WRITE( 12, div );	/* BRG value */					    SCCB_WRITE( 13, 0 );		/* BRG high byte */					    SCCB_WRITE( 14, 1 );					    SCCB_WRITE( 3, reg3 | 1 );					    SCCB_WRITE( 5, reg5 | 8 );				    } else if (port == 0) {					    (void)scc.cha_a_ctrl;	/* reset reg pointer */					    SCCA_WRITE( 9, 0xc0 );	/* reset */					    LONG_DELAY();		/* extra delay after WR9 access */					    SCCA_WRITE( 4, (cflag & PARENB) ? ((cflag & PARODD) ? 0x01 : 0x03) : 0 |							  0x04 /* 1 stopbit */ |							  clkmode );					    SCCA_WRITE( 3, reg3 );					    SCCA_WRITE( 5, reg5 );					    SCCA_WRITE( 9, 0 );		/* no interrupts */					    LONG_DELAY();		/* extra delay after WR9 access */					    SCCA_WRITE( 10, 0 );	/* NRZ mode */					    SCCA_WRITE( 11, clksrc );	/* main clock source */					    SCCA_WRITE( 12, div );	/* BRG value */					    SCCA_WRITE( 13, 0 );		/* BRG high byte */					    SCCA_WRITE( 14, 1 );					    SCCA_WRITE( 3, reg3 | 1 );					    SCCA_WRITE( 5, reg5 | 8 );				    }								    mac_SCC_reset_done = 1;				    mac_SCC_init_done = 1;				}				#endif /* DEBUG_SERIAL */								void mac_init_scca_port( int cflag )				{					mac_init_scc_port(cflag, 0);				}								void mac_init_sccb_port( int cflag )				{					mac_init_scc_port(cflag, 1);				}								void __init mac_debug_init(void)				{				#ifdef DEBUG_SERIAL				    if (   !strcmp( m68k_debug_device, "ser"  )				        || !strcmp( m68k_debug_device, "ser1" )) {					/* Mac modem port */					mac_init_scc_port( B9600|CS8, 0 );					mac_console_driver.write = mac_scca_console_write;					scc_port = 0;				    }				    else if (!strcmp( m68k_debug_device, "ser2" )) {					/* Mac printer port */					mac_init_scc_port( B9600|CS8, 1 );					mac_console_driver.write = mac_sccb_console_write;					scc_port = 1;				    }				#endif				#ifdef DEBUG_HEADS				    if (   !strcmp( m68k_debug_device, "scn"  )				        || !strcmp( m68k_debug_device, "con" )) {					/* display, using head.S console routines */					mac_console_driver.write = mac_debug_console_write;				    }				#endif				    if (mac_console_driver.write)					register_console(&mac_console_driver);				}								/*				 * Local variables:				 *  c-indent-level: 4				 *  tab-width: 8				 * End:				 */							

相关资源