xref: /haiku/src/system/kernel/arch/riscv64/arch_debug_console.cpp (revision 1a76488fc88584bf66b9751d7fb9b6527ac20d87)
1 /*
2  * Copyright 2003-2006, Axel Dörfler, axeld@pinc-software.de.
3  * Distributed under the terms of the MIT License.
4  *
5  * Copyright 2001, Travis Geiselbrecht. All rights reserved.
6  * Distributed under the terms of the NewOS License.
7  */
8 
9 
10 #include <arch/debug_console.h>
11 #include <arch/generic/debug_uart.h>
12 #include <arch/generic/debug_uart_8250.h>
13 #include <arch/riscv64/arch_uart_sifive.h>
14 #include <boot/kernel_args.h>
15 #include <kernel.h>
16 #include <vm/vm.h>
17 #include <Htif.h>
18 
19 #include <string.h>
20 
21 
22 static DebugUART* sArchDebugUART = NULL;
23 
24 
25 void
26 arch_debug_remove_interrupt_handler(uint32 line)
27 {
28 }
29 
30 
31 void
32 arch_debug_install_interrupt_handlers(void)
33 {
34 }
35 
36 
37 int
38 arch_debug_blue_screen_try_getchar(void)
39 {
40 	return 0;
41 }
42 
43 
44 char
45 arch_debug_blue_screen_getchar(void)
46 {
47 	return 0;
48 }
49 
50 
51 int
52 arch_debug_serial_try_getchar(void)
53 {
54 	// TODO: Implement correctly!
55 	return arch_debug_serial_getchar();
56 }
57 
58 
59 char
60 arch_debug_serial_getchar(void)
61 {
62 	if (sArchDebugUART != NULL)
63 		return sArchDebugUART->GetChar(false);
64 
65 	return 0;
66 }
67 
68 
69 void
70 arch_debug_serial_putchar(const char c)
71 {
72 	if (sArchDebugUART != NULL) {
73 		sArchDebugUART->PutChar(c);
74 		return;
75 	}
76 
77 	HtifOutChar(c);
78 }
79 
80 
81 void
82 arch_debug_serial_puts(const char *s)
83 {
84 	while (*s != '\0') {
85 		char ch = *s;
86 		if (ch == '\n') {
87 			arch_debug_serial_putchar('\r');
88 			arch_debug_serial_putchar('\n');
89 		} else if (ch != '\r')
90 			arch_debug_serial_putchar(ch);
91 		s++;
92 	}
93 }
94 
95 
96 void
97 arch_debug_serial_early_boot_message(const char *string)
98 {
99 	arch_debug_serial_puts(string);
100 }
101 
102 
103 status_t
104 arch_debug_console_init(kernel_args *args)
105 {
106 	if (strncmp(args->arch_args.uart.kind, UART_KIND_8250,
107 			sizeof(args->arch_args.uart.kind)) == 0) {
108 		sArchDebugUART = arch_get_uart_8250(args->arch_args.uart.regs.start,
109 			args->arch_args.uart.clock);
110 	} else if (strncmp(args->arch_args.uart.kind, UART_KIND_SIFIVE,
111 			sizeof(args->arch_args.uart.kind)) == 0) {
112 		sArchDebugUART = arch_get_uart_sifive(args->arch_args.uart.regs.start,
113 			args->arch_args.uart.clock);
114 	}
115 
116 	if (sArchDebugUART != NULL)
117 		sArchDebugUART->InitEarly();
118 
119 	return B_OK;
120 }
121 
122 
123 status_t
124 arch_debug_console_init_settings(kernel_args *args)
125 {
126 	return B_OK;
127 }
128