xref: /haiku/src/system/kernel/arch/arm/arch_debug_console.cpp (revision a5c0d1a80e18f50987966fda2005210092d7671b)
1 /*
2  * Copyright 2007, François Revol, revol@free.fr.
3  * Distributed under the terms of the MIT License.
4  *
5  * Copyright 2003-2006, Axel Dörfler, axeld@pinc-software.de.
6  * Distributed under the terms of the MIT License.
7  *
8  * Copyright 2001, Travis Geiselbrecht. All rights reserved.
9  * Distributed under the terms of the NewOS License.
10  */
11 
12 
13 #include <arch/debug_console.h>
14 #include <arch/generic/debug_uart.h>
15 #include <arch/generic/debug_uart_8250.h>
16 #include <arch/arm/arch_uart_8250_omap.h>
17 #include <arch/arm/arch_uart_pl011.h>
18 #include <boot/kernel_args.h>
19 #include <kernel.h>
20 #include <vm/vm.h>
21 #include <string.h>
22 
23 
24 static DebugUART *sArchDebugUART = NULL;
25 
26 
27 void
28 arch_debug_remove_interrupt_handler(uint32 line)
29 {
30 }
31 
32 
33 void
34 arch_debug_install_interrupt_handlers(void)
35 {
36 }
37 
38 
39 int
40 arch_debug_blue_screen_try_getchar(void)
41 {
42 	// TODO: Implement correctly!
43 	return arch_debug_blue_screen_getchar();
44 }
45 
46 
47 char
48 arch_debug_blue_screen_getchar(void)
49 {
50 	return arch_debug_serial_getchar();
51 }
52 
53 
54 int
55 arch_debug_serial_try_getchar(void)
56 {
57 	// TODO: Implement correctly!
58 	return arch_debug_serial_getchar();
59 }
60 
61 
62 char
63 arch_debug_serial_getchar(void)
64 {
65 	if (sArchDebugUART == NULL)
66 		return NULL;
67 
68 	return sArchDebugUART->GetChar(false);
69 }
70 
71 
72 void
73 arch_debug_serial_putchar(const char c)
74 {
75 	if (sArchDebugUART == NULL)
76 		return;
77 
78 	sArchDebugUART->PutChar(c);
79 }
80 
81 
82 void
83 arch_debug_serial_puts(const char *s)
84 {
85 	while (*s != '\0') {
86 		char ch = *s;
87 		if (ch == '\n') {
88 			arch_debug_serial_putchar('\r');
89 			arch_debug_serial_putchar('\n');
90 		} else if (ch != '\r')
91 			arch_debug_serial_putchar(ch);
92 		s++;
93 	}
94 }
95 
96 
97 void
98 arch_debug_serial_early_boot_message(const char *string)
99 {
100 	// this function will only be called in fatal situations
101 	arch_debug_serial_puts(string);
102 }
103 
104 
105 status_t
106 arch_debug_console_init(kernel_args *args)
107 {
108 	if (strncmp(args->arch_args.uart.kind, UART_KIND_PL011,
109 		sizeof(args->arch_args.uart.kind)) == 0) {
110 		sArchDebugUART = arch_get_uart_pl011(args->arch_args.uart.regs.start,
111 			args->arch_args.uart.clock);
112 	} else if (strncmp(args->arch_args.uart.kind, UART_KIND_8250_OMAP,
113 		sizeof(args->arch_args.uart.kind)) == 0) {
114 		sArchDebugUART = arch_get_uart_8250_omap(args->arch_args.uart.regs.start,
115 			args->arch_args.uart.clock);
116 	} else if (strncmp(args->arch_args.uart.kind, UART_KIND_8250,
117 		sizeof(args->arch_args.uart.kind)) == 0) {
118 		sArchDebugUART = arch_get_uart_8250(args->arch_args.uart.regs.start,
119 			args->arch_args.uart.clock);
120 	}
121 
122 	// As a last try, lets assume qemu's pl011 at a sane address
123 	if (sArchDebugUART == NULL)
124 		sArchDebugUART = arch_get_uart_pl011(0x9000000, 0x16e3600);
125 
126 	// Oh well.
127 	if (sArchDebugUART == NULL)
128 		return B_ERROR;
129 
130 	sArchDebugUART->InitEarly();
131 
132 	return B_OK;
133 }
134 
135 
136 status_t
137 arch_debug_console_init_settings(kernel_args *args)
138 {
139 	return B_OK;
140 }
141