-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
unicore32 additional architecture files: low-level lib: ocd debug
This patch implements low-level debug libraries with On-Chip-Debugger hardware support. Signed-off-by: Guan Xuetao <gxt@mprc.pku.edu.cn> Acked-by: Arnd Bergmann <arnd@arndb.de>
- Loading branch information
GuanXuetao
committed
Mar 17, 2011
1 parent
6dea1ba
commit 28bab05
Showing
4 changed files
with
269 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
/* | ||
* linux/arch/unicore32/include/mach/ocd.h | ||
* | ||
* Code specific to PKUnity SoC and UniCore ISA | ||
* | ||
* Copyright (C) 2001-2010 GUAN Xue-tao | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
*/ | ||
|
||
#ifndef __MACH_PUV3_OCD_H__ | ||
#define __MACH_PUV3_OCD_H__ | ||
|
||
#if defined(CONFIG_DEBUG_OCD) | ||
static inline void ocd_putc(unsigned int c) | ||
{ | ||
int status, i = 0x2000000; | ||
|
||
do { | ||
if (--i < 0) | ||
return; | ||
|
||
asm volatile ("movc %0, p1.c0, #0" : "=r" (status)); | ||
} while (status & 2); | ||
|
||
asm("movc p1.c1, %0, #1" : : "r" (c)); | ||
} | ||
|
||
#define putc(ch) ocd_putc(ch) | ||
#else | ||
#define putc(ch) | ||
#endif | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
/* | ||
* linux/arch/unicore32/kernel/debug-macro.S | ||
* | ||
* Code specific to PKUnity SoC and UniCore ISA | ||
* | ||
* Copyright (C) 2001-2010 GUAN Xue-tao | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
* | ||
* Debugging macro include header | ||
*/ | ||
#include <generated/asm-offsets.h> | ||
#include <mach/hardware.h> | ||
|
||
.macro put_word_ocd, rd, rx=r16 | ||
1001: movc \rx, p1.c0, #0 | ||
cand.a \rx, #2 | ||
bne 1001b | ||
movc p1.c1, \rd, #1 | ||
.endm | ||
|
||
#ifdef CONFIG_DEBUG_OCD | ||
/* debug using UniCore On-Chip-Debugger */ | ||
.macro addruart, rx | ||
.endm | ||
|
||
.macro senduart, rd, rx | ||
put_word_ocd \rd, \rx | ||
.endm | ||
|
||
.macro busyuart, rd, rx | ||
.endm | ||
|
||
.macro waituart, rd, rx | ||
.endm | ||
#else | ||
#define UART_CLK_DEFAULT 3686400 * 20 | ||
/* Uartclk = MCLK/ 2, The MCLK on my board is 3686400 * 40 */ | ||
#define BAUD_RATE_DEFAULT 115200 | ||
/* The baud rate of the serial port */ | ||
|
||
#define UART_DIVISOR_DEFAULT (UART_CLK_DEFAULT \ | ||
/ (16 * BAUD_RATE_DEFAULT) - 1) | ||
|
||
.macro addruart,rx | ||
mrc p0, #0, \rx, c1, c0 | ||
tst \rx, #1 @ MMU enabled? | ||
moveq \rx, #0xee000000 @ physical base address | ||
movne \rx, #0x6e000000 @ virtual address | ||
|
||
@ We probe for the active serial port here | ||
@ However, now we assume UART0 is active: epip4d | ||
@ We assume r1 and r2 can be clobbered. | ||
|
||
movl r2, #UART_DIVISOR_DEFAULT | ||
mov r1, #0x80 | ||
str r1, [\rx, #UART_LCR_OFFSET] | ||
and r1, r2, #0xff00 | ||
mov r1, r1, lsr #8 | ||
str r1, [\rx, #UART_DLH_OFFSET] | ||
and r1, r2, #0xff | ||
str r1, [\rx, #UART_DLL_OFFSET] | ||
mov r1, #0x7 | ||
str r1, [\rx, #UART_FCR_OFFSET] | ||
mov r1, #0x3 | ||
str r1, [\rx, #UART_LCR_OFFSET] | ||
mov r1, #0x0 | ||
str r1, [\rx, #UART_IER_OFFSET] | ||
.endm | ||
|
||
.macro senduart,rd,rx | ||
str \rd, [\rx, #UART_THR_OFFSET] | ||
.endm | ||
|
||
.macro waituart,rd,rx | ||
1001: ldr \rd, [\rx, #UART_LSR_OFFSET] | ||
tst \rd, #UART_LSR_THRE | ||
beq 1001b | ||
.endm | ||
|
||
.macro busyuart,rd,rx | ||
1001: ldr \rd, [\rx, #UART_LSR_OFFSET] | ||
tst \rd, #UART_LSR_TEMT | ||
bne 1001b | ||
.endm | ||
#endif | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
/* | ||
* linux/arch/unicore32/kernel/debug.S | ||
* | ||
* Code specific to PKUnity SoC and UniCore ISA | ||
* | ||
* Copyright (C) 2001-2010 GUAN Xue-tao | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
* | ||
* 32-bit debugging code | ||
*/ | ||
#include <linux/linkage.h> | ||
#include <asm/assembler.h> | ||
|
||
.text | ||
|
||
/* | ||
* Some debugging routines (useful if you've got MM problems and | ||
* printk isn't working). For DEBUGGING ONLY!!! Do not leave | ||
* references to these in a production kernel! | ||
*/ | ||
#include "debug-macro.S" | ||
|
||
/* | ||
* Useful debugging routines | ||
*/ | ||
ENTRY(printhex8) | ||
mov r1, #8 | ||
b printhex | ||
ENDPROC(printhex8) | ||
|
||
ENTRY(printhex4) | ||
mov r1, #4 | ||
b printhex | ||
ENDPROC(printhex4) | ||
|
||
ENTRY(printhex2) | ||
mov r1, #2 | ||
printhex: adr r2, hexbuf | ||
add r3, r2, r1 | ||
mov r1, #0 | ||
stb r1, [r3] | ||
1: and r1, r0, #15 | ||
mov r0, r0 >> #4 | ||
csub.a r1, #10 | ||
beg 2f | ||
add r1, r1, #'0' - 'a' + 10 | ||
2: add r1, r1, #'a' - 10 | ||
stb.w r1, [r3+], #-1 | ||
cxor.a r3, r2 | ||
bne 1b | ||
mov r0, r2 | ||
b printascii | ||
ENDPROC(printhex2) | ||
|
||
.ltorg | ||
|
||
ENTRY(printascii) | ||
addruart r3 | ||
b 2f | ||
1: waituart r2, r3 | ||
senduart r1, r3 | ||
busyuart r2, r3 | ||
cxor.a r1, #'\n' | ||
cmoveq r1, #'\r' | ||
beq 1b | ||
2: cxor.a r0, #0 | ||
beq 3f | ||
ldb.w r1, [r0]+, #1 | ||
cxor.a r1, #0 | ||
bne 1b | ||
3: mov pc, lr | ||
ENDPROC(printascii) | ||
|
||
ENTRY(printch) | ||
addruart r3 | ||
mov r1, r0 | ||
mov r0, #0 | ||
b 1b | ||
ENDPROC(printch) | ||
|
||
hexbuf: .space 16 | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
/* | ||
* linux/arch/unicore32/kernel/early_printk.c | ||
* | ||
* Code specific to PKUnity SoC and UniCore ISA | ||
* | ||
* Copyright (C) 2001-2010 GUAN Xue-tao | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
*/ | ||
#include <linux/console.h> | ||
#include <linux/init.h> | ||
#include <linux/string.h> | ||
#include <mach/ocd.h> | ||
|
||
/* On-Chip-Debugger functions */ | ||
|
||
static void early_ocd_write(struct console *con, const char *s, unsigned n) | ||
{ | ||
while (*s && n-- > 0) { | ||
if (*s == '\n') | ||
ocd_putc((int)'\r'); | ||
ocd_putc((int)*s); | ||
s++; | ||
} | ||
} | ||
|
||
static struct console early_ocd_console = { | ||
.name = "earlyocd", | ||
.write = early_ocd_write, | ||
.flags = CON_PRINTBUFFER, | ||
.index = -1, | ||
}; | ||
|
||
/* Direct interface for emergencies */ | ||
static struct console *early_console = &early_ocd_console; | ||
|
||
static int __initdata keep_early; | ||
|
||
static int __init setup_early_printk(char *buf) | ||
{ | ||
if (!buf) | ||
return 0; | ||
|
||
if (strstr(buf, "keep")) | ||
keep_early = 1; | ||
|
||
if (!strncmp(buf, "ocd", 3)) | ||
early_console = &early_ocd_console; | ||
|
||
if (keep_early) | ||
early_console->flags &= ~CON_BOOT; | ||
else | ||
early_console->flags |= CON_BOOT; | ||
register_console(early_console); | ||
return 0; | ||
} | ||
early_param("earlyprintk", setup_early_printk); |