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