From e842c512179d3f34731ce78e3a906c5fec162e07 Mon Sep 17 00:00:00 2001 From: Christian Cunningham Date: Sat, 4 Dec 2021 19:24:16 -0700 Subject: Created UART console layout --- src/cpu/irq.c | 11 ++++---- src/sys/core.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++------ src/sys/timer.c | 13 +++++---- src/sys/timer.h | 4 +++ src/util/mutex.h | 3 +- 5 files changed, 95 insertions(+), 20 deletions(-) (limited to 'src') diff --git a/src/cpu/irq.c b/src/cpu/irq.c index cdbd615..2673cc8 100644 --- a/src/cpu/irq.c +++ b/src/cpu/irq.c @@ -23,23 +23,22 @@ void c_irq_handler(void) { cntfrq = read_cntfrq(); write_cntv_tval(cntfrq); enable_cntv(); - uart_string((char*)"Timer \033[92mEnabled\033[0m\n"); + uart_string((char*)"\033[?25l\033[s\033[4;1H\033[0KTimer: \033[92mEnabled\033[0m\033[u\033[?25h"); } else { disable_cntv(); - uart_string((char*)"Timer \033[91mDisabled\033[0m\n"); + uart_string((char*)"\033[?25l\033[s\033[4;1H\033[0KTimer: \033[91mDisabled\033[0m\033[u\033[?25h"); } } else { if (data == 0x0D) { - uart_char(0x0a); + //uart_char(0x0a); + uart_char(data); + uart_string("\033[?25l> \033[0K\033[?25h"); } else if (data == 0x08) { uart_char((unsigned char)data); uart_char(0x20); uart_char((unsigned char)data); } else { uart_char((unsigned char)data); - //uart_char(0x20); - //uart_hexn(data); - //uart_string((char*)" c_irq_handler\n"); } } enable_irq(); diff --git a/src/sys/core.c b/src/sys/core.c index c82de5a..d15c686 100644 --- a/src/sys/core.c +++ b/src/sys/core.c @@ -1,20 +1,21 @@ #include "../drivers/uart.a.h" #include "../drivers/uart.h" #include "../util/time.h" +#include "../util/mutex.h" #include "../sys/core.h" #include "../sys/timer.h" #include "../sys/power.h" -static char* os_info_h = "\033[93mInitialized the Real Time Operating System\033[0m\n\033[96mName\033[0m: \033[94mDendritOS\033[0m\n\033[96mVersion\033[0m: \033[95m"; -static char* os_info_t = "\033[0m\n\nQEMU\n====\n Monitor : Ctrl-A c\n Timer : Ctrl-T\n Exit : Ctrl-A x\n\n"; +//char* os_info_h = "\033[93mInitialized the Real Time Operating System\033[0m\n\033[96mName\033[0m: \033[94mDendritOS\033[0m\n\033[96mVersion\033[0m: \033[95m"; +//char* os_info_t = "\033[0m\n\nQEMU\n====\n Monitor : Ctrl-A c\n Timer : Ctrl-T\n Exit : Ctrl-A x\n\n"; #ifndef VERSION -static char* os_info_v = "?"; +char* os_info_v = "?"; #else -static char* os_info_v = VERSION; +char* os_info_v = VERSION; #endif -static char* irq_on = " \033[92mEnabled\033[0m\n"; -static char* irq_off = " \033[91mDisabled\033[0m\n"; +static char* irq_on = " \033[92mEnabled\033[0m"; +static char* irq_off = " \033[91mDisabled\033[0m"; // Initialize IRQs void sysinit() { @@ -69,6 +70,7 @@ void chk_irq_stat() { } else { uart_string(irq_off); } + uart_char(0x0a); // Check TIMER IRQ uart_string((char*)" TIMER:"); @@ -83,6 +85,7 @@ void chk_irq_stat() { } else { uart_string(irq_off); } + uart_char(0x0a); // Check FIQ unsigned long f_val = load32(FIQ_CONTROL); @@ -93,6 +96,7 @@ void chk_irq_stat() { } else { uart_string(irq_off); } + uart_char(0x0a); // Check GPU Interrupt Routing unsigned long g_val = load32(GPU_INTERRUPTS_ROUTING); @@ -106,8 +110,72 @@ void chk_irq_stat() { uart_char(0x0a); } +void output_irq_status(void) { + // Basic IRQ + unsigned long ib_val = load32(IRQ_BASIC_ENABLE); + // IRQ 1 + unsigned long i1_val = load32(IRQ_ENABLE1); + // IRQ 2 + unsigned long i2_val = load32(IRQ_ENABLE2); + // FIQ + unsigned long f_val = load32(FIQ_CONTROL); + + uart_string("\033[5;1H"); + // Check UART IRQ + uart_string((char*)"UART:"); + if (i2_val & (1<<25)) { + uart_string(irq_on); + } else { + uart_string(irq_off); + } + // Check TIMER IRQ + uart_string((char*)" TIMER:"); + if (ib_val & (1<<0)) { + uart_string(irq_on); + // Output the frequency + uart_string(" @ "); + unsigned long frq = read_cntfrq()/1000; + //uart_hexn(cntfrq); + uart_10(frq); + uart_string((char*)" kHz"); + } else { + uart_string(irq_off); + } + + uart_string("\033[6;1H"); + // Check GPU Interrupt Routing + unsigned long g_val = load32(GPU_INTERRUPTS_ROUTING); + uart_string((char*)"GPU IRQ: Core "); + uart_char(0x30 + (g_val & 0x3)); + uart_string((char*)" | GPU FIQ: Core "); + uart_char(0x30 + ((g_val>>2) & 0x3)); + + uart_string("\033[7;1H"); + uart_hex(ib_val); + uart_char(0x20); + uart_hex(i1_val); + uart_char(0x20); + uart_hex(i2_val); + uart_char(0x20); + uart_hex(f_val); +} + void postinit() { - uart_string(os_info_h); + // OS Info + uart_string("\033[2J\033[1;1H\033[91mDendritOS \033[96mv"); uart_string(os_info_v); - uart_string(os_info_t); + uart_string("\033[0m #"); + if (lock_mutex(&exe_cnt_m, SYS_PID) == 0) { + uart_10(*(exe_cnt_m.addr)); + release_mutex(&exe_cnt_m, SYS_PID); + } + // Commands + uart_string("\033[2;1HMonitor: Ctrl-A m\033[2;20HExit: Ctrl-A x"); + uart_string("\033[3;1HTimer: Ctrl-T\033[3;20H"); + // Timer Status + uart_string("\033[4;1HTimer: \033[92mEnabled\033[0m"); + // GPU IRQ Statuses + output_irq_status(); + // Input line + uart_string("\033[8;1H> "); } diff --git a/src/sys/timer.c b/src/sys/timer.c index 16e6fdb..13ce317 100644 --- a/src/sys/timer.c +++ b/src/sys/timer.c @@ -5,10 +5,11 @@ #include "../drivers/uart.a.h" #include "../drivers/uart.h" -static unsigned long exe_cnt = 0; -static struct Mutex exe_cnt_m = {.addr = &exe_cnt, .pid = NULL_PID}; +#define TIMER_C +extern char* os_info_v; -//static unsigned long execution_count = 0; +unsigned long exe_cnt = 0; +struct Mutex exe_cnt_m = {.addr = &exe_cnt, .pid = NULL_PID}; void c_timer() { // Reset the counter @@ -24,9 +25,11 @@ void c_timer() { // Lock the execution counter if (lock_mutex(&exe_cnt_m, SCHED_PID) == 0) { *(exe_cnt_m.addr) += 1; - uart_string((char*)"Executed #"); + uart_string("\033[?25l\033[s\033[1;1H\033[91mDendritOS \033[96mv"); + uart_string(os_info_v); + uart_string("\033[0m #"); uart_10(*(exe_cnt_m.addr)); - uart_string((char*)" Times\n"); + uart_string("\033[u\033[?25h"); release_mutex(&exe_cnt_m, SCHED_PID); } } diff --git a/src/sys/timer.h b/src/sys/timer.h index 641a581..4774ed4 100644 --- a/src/sys/timer.h +++ b/src/sys/timer.h @@ -1,6 +1,10 @@ #ifndef SYS_TIMER_H #define SYS_TIMER_H +#ifndef TIMER_C +extern struct Mutex exe_cnt_m; +#endif + void c_timer(); #endif diff --git a/src/util/mutex.h b/src/util/mutex.h index 37def4b..f99b7a8 100644 --- a/src/util/mutex.h +++ b/src/util/mutex.h @@ -2,7 +2,8 @@ #define UTIL_MUTEX_H #define NULL_PID 0 -#define SCHED_PID 1 +#define SYS_PID 1 +#define SCHED_PID 2 struct Mutex { unsigned long* addr; -- cgit v1.2.1