aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChristian Cunningham <cc@localhost>2022-01-20 23:22:42 -0700
committerChristian Cunningham <cc@localhost>2022-01-20 23:22:42 -0700
commit73a80de4228a498b483c8e10ab317920d978d507 (patch)
treeeea73a138a509d7758ef477d4997cf7147233604 /src
parentc2e52566ed53b53227a6fe577a05170766a1ae4c (diff)
Moved globals to file
Diffstat (limited to 'src')
-rw-r--r--src/boot.S1
-rw-r--r--src/cpu/irq.c23
-rw-r--r--src/globals.S14
-rw-r--r--src/globals.c27
-rw-r--r--src/graphics/drawer.c3
-rw-r--r--src/graphics/lfb.c33
-rw-r--r--src/lib/mem.c25
-rw-r--r--src/sys/core.c30
-rw-r--r--src/sys/kernel.S15
-rw-r--r--src/sys/schedule.S6
-rw-r--r--src/sys/schedule.c32
-rw-r--r--src/sys/timer.c6
-rw-r--r--src/util/mutex.c1
-rw-r--r--src/util/status.c16
14 files changed, 125 insertions, 107 deletions
diff --git a/src/boot.S b/src/boot.S
index 0b09baa..42e991a 100644
--- a/src/boot.S
+++ b/src/boot.S
@@ -6,6 +6,7 @@
_start:
reset:
+ cpsid if
// disable core0,1,2.
mrc p15, #0, r1, c0, c0, #5
and r1, r1, #3
diff --git a/src/cpu/irq.c b/src/cpu/irq.c
index fb73b8a..c966935 100644
--- a/src/cpu/irq.c
+++ b/src/cpu/irq.c
@@ -1,9 +1,9 @@
#include <cpu/irq.h>
#include <drivers/uart.h>
+#include <globals.h>
#include <graphics/drawer.h>
#include <symbols.h>
#include <sys/core.h>
-#include <sys/kernel.h>
#include <sys/schedule.h>
#include <sys/timer.h>
#include <util/mutex.h>
@@ -67,7 +67,7 @@ void c_irq_handler(void)
} else if (data == 0x61) {
cmd[off] = (char) data;
off += 1;
- //_start(); // Trigger reset
+ _start(); // Trigger reset
//heap_info_u();
// Else output
} else {
@@ -98,12 +98,18 @@ void c_irq_handler(void)
write_string(&g_Drawer, cmd);
return;
}
+ } else if (*(unsigned long*)SYS_TIMER_CS == SYS_TIMER_SC_M0) {
+ volatile unsigned long* timer_cs = (unsigned long*)SYS_TIMER_CS;
+ volatile unsigned long* timer_chi = (unsigned long*)SYS_TIMER_CHI;
+ volatile unsigned long* nexttime = (unsigned long*)SYS_TIMER_C0;
+ *timer_cs = SYS_TIMER_SC_M0;
+ *nexttime = *timer_chi + 60000000;
+ } else {
+ uart_string("Pending?");
}
} else if (source & (1 << 3)) {
c_timer();
return;
- } else {
- uart_string("Unknown Interrupt Detected!");
}
return;
}
@@ -194,12 +200,17 @@ void c_fiq_handler(void)
write_string(&g_Drawer, cmd);
return;
}
+ } else if (*(unsigned long*)SYS_TIMER_CS == SYS_TIMER_SC_M0) {
+ volatile unsigned long* timer_cs = (unsigned long*)SYS_TIMER_CS;
+ volatile unsigned long* timer_chi = (unsigned long*)SYS_TIMER_CHI;
+ volatile unsigned long* nexttime = (unsigned long*)SYS_TIMER_C0;
+ *timer_cs = SYS_TIMER_SC_M0;
+ //*nexttime = *timer_chi + 60000000;
+ *nexttime = *timer_chi + 10000;
}
} else if (source & (1 << 3)) {
c_timer();
return;
- } else {
- uart_string("Unknown Interrupt Detected!");
}
return;
}
diff --git a/src/globals.S b/src/globals.S
new file mode 100644
index 0000000..68101d7
--- /dev/null
+++ b/src/globals.S
@@ -0,0 +1,14 @@
+.section ".bss"
+.globl cntfrq
+cntfrq:
+ .word 0
+.globl cmdidx
+cmdidx:
+ .word 0
+.global cmd
+cmd:
+ .space 2049
+
+.section ".bss.heap"
+mheap:
+ .space 0x100000
diff --git a/src/globals.c b/src/globals.c
new file mode 100644
index 0000000..d14103d
--- /dev/null
+++ b/src/globals.c
@@ -0,0 +1,27 @@
+#define GLOBALS_C
+#include <lib/mem.h>
+#include <util/mutex.h>
+#include <graphics/drawer.h>
+#include <sys/schedule.h>
+#ifndef VERSION
+char* os_info_v = "?";
+#else
+char* os_info_v = VERSION;
+#endif
+
+__attribute__((section(".bss"))) unsigned long exe_cnt;
+__attribute__((section(".bss"))) struct Mutex exe_cnt_m;
+__attribute__((section(".bss.mmheap"))) unsigned char rpi_heap[MAX_MM];
+__attribute__((section(".bss"))) void* rpi_heap_top;
+__attribute__((section(".bss"))) unsigned long nextpid;
+__attribute__((section(".bss"))) unsigned long stimel;
+__attribute__((section(".bss"))) unsigned long stimeh;
+__attribute__((section(".bss"))) struct Drawer g_Drawer;
+__attribute__((section(".bss"))) struct Scheduler scheduler;
+__attribute__((section(".bss"))) unsigned long svcsp;
+__attribute__((section(".bss"))) struct cpu_context svccpu;
+__attribute__((section(".bss"))) unsigned int gwidth;
+__attribute__((section(".bss"))) unsigned int gheight;
+__attribute__((section(".bss"))) unsigned int gpitch;
+__attribute__((section(".bss"))) unsigned int gisrgb;
+__attribute__((section(".bss"))) unsigned char stacks_table[MAX_THREADS];
diff --git a/src/graphics/drawer.c b/src/graphics/drawer.c
index 35aea32..4445919 100644
--- a/src/graphics/drawer.c
+++ b/src/graphics/drawer.c
@@ -1,9 +1,6 @@
#include <graphics/drawer.h>
#include <graphics/lfb.h>
-#define GRAPHICS_DRAWER_C
-struct Drawer g_Drawer = {.x = 0, .y = 0};
-
void write_cchar(struct Drawer* d, char s, unsigned int c)
{
d->x %= GG_MAX_X;
diff --git a/src/graphics/lfb.c b/src/graphics/lfb.c
index 3ad9917..c3a3cac 100644
--- a/src/graphics/lfb.c
+++ b/src/graphics/lfb.c
@@ -1,11 +1,10 @@
#include <drivers/uart.h>
+#include <globals.h>
#include <graphics/glyphs.h>
#include <graphics/lfb.h>
#include <graphics/mbox.h>
#include <graphics/philosopher_toad.h>
-#define GRAPHICS_LFB_C
-unsigned int width, height, pitch, isrgb; /* dimensions and channel order */
unsigned char *lfb; /* raw frame buffer address */
#define SCR_WIDTH 1024
@@ -64,10 +63,10 @@ void lfb_init(void)
//the closest supported resolution instead
if(mbox_call(MBOX_CH_PROP) && mbox[20]==32 && mbox[28]!=0) {
mbox[28]&=0x3FFFFFFF; //convert GPU address to ARM address
- width=mbox[5]; //get actual physical width
- height=mbox[6]; //get actual physical height
- pitch=mbox[33]; //get number of bytes per line
- isrgb=mbox[24]; //get the actual channel order
+ gwidth=mbox[5]; //get actual physical width
+ gheight=mbox[6]; //get actual physical height
+ gpitch=mbox[33]; //get number of bytes per line
+ gisrgb=mbox[24]; //get the actual channel order
lfb=(void*)((unsigned long)mbox[28]);
} else {
uart_string("Unable to set screen resolution to 1024x768x32\n");
@@ -77,8 +76,8 @@ void lfb_init(void)
void clear_screen(void)
{
unsigned char *ptr=lfb;
- for(unsigned int y = 0; y < height; y++) {
- for(unsigned int x = 0; x < width; x++) {
+ for(unsigned int y = 0; y < gheight; y++) {
+ for(unsigned int x = 0; x < gwidth; x++) {
*(unsigned int*)ptr = 0x000000;
ptr += 4;
}
@@ -95,16 +94,16 @@ void lfb_showpicture(void)
unsigned char *ptr=lfb;
char *data=toad_data, pixel[4];
- ptr = lfb + (height-toad_height)*pitch + (width-toad_width)*4;
+ ptr = lfb + (gheight-toad_height)*gpitch + (gwidth-toad_width)*4;
for(y=0;y<toad_height;y++) {
for(x=0;x<toad_width;x++) {
HEADER_PIXEL(data, pixel);
// the image is in RGB. So if we have an RGB framebuffer, we can copy the pixels
// directly, but for BGR we must swap R (pixel[0]) and B (pixel[2]) channels.
- *((unsigned int*)ptr)=isrgb ? *((unsigned int *)&pixel) : (unsigned int)(pixel[0]<<16 | pixel[1]<<8 | pixel[2]);
+ *((unsigned int*)ptr)=gisrgb ? *((unsigned int *)&pixel) : (unsigned int)(pixel[0]<<16 | pixel[1]<<8 | pixel[2]);
ptr+=4;
}
- ptr+=pitch-toad_width*4;
+ ptr+=gpitch-toad_width*4;
}
}
@@ -112,7 +111,7 @@ void draw_cbyte(unsigned char lx, unsigned char ly, unsigned char letter, unsign
{
unsigned int x, y;
unsigned char* ptr = lfb;
- ptr += (pitch*ly*GLYPH_Y+lx*4*GLYPH_X);
+ ptr += (gpitch*ly*GLYPH_Y+lx*4*GLYPH_X);
unsigned char ltr = (letter & 0xF) + 0x30;
if (ltr > 0x39) {
ltr += 7;
@@ -120,13 +119,13 @@ void draw_cbyte(unsigned char lx, unsigned char ly, unsigned char letter, unsign
for(y=0; y<GLYPH_Y; y++) {
for(x=0; x<GLYPH_X; x++) {
if((0x80 >> ((GLYPH_X-1)-x)) & glyphs[y+GLYPH_Y*(ltr)]) {
- *((unsigned int*)ptr) = isrgb ? (unsigned int)((c&0xFF)<<16 | (c&0xFF00) | (c&0xFF0000)>>16) : c;
+ *((unsigned int*)ptr) = gisrgb ? (unsigned int)((c&0xFF)<<16 | (c&0xFF00) | (c&0xFF0000)>>16) : c;
} else {
*((unsigned int*)ptr) = 0x000000;
}
ptr += 4;
}
- ptr += pitch - GLYPH_X*4;
+ ptr += gpitch - GLYPH_X*4;
}
}
@@ -139,18 +138,18 @@ void draw_cletter(unsigned char lx, unsigned char ly, unsigned char letter, unsi
{
unsigned int x, y;
unsigned char* ptr = lfb;
- ptr += (pitch*ly*GLYPH_Y+lx*4*GLYPH_X);
+ ptr += (gpitch*ly*GLYPH_Y+lx*4*GLYPH_X);
unsigned char ltr = letter & 0x7F;
for(y=0; y<GLYPH_Y; y++) {
for(x=0; x<GLYPH_X; x++) {
if((0x80 >> ((GLYPH_X-1)-x)) & glyphs[y+GLYPH_Y*(ltr)]) {
- *((unsigned int*)ptr) = isrgb ? (unsigned int)((c&0xFF)<<16 | (c&0xFF00) | (c&0xFF0000)>>16) : c;
+ *((unsigned int*)ptr) = gisrgb ? (unsigned int)((c&0xFF)<<16 | (c&0xFF00) | (c&0xFF0000)>>16) : c;
} else {
*((unsigned int*)ptr) = 0x000000;
}
ptr += 4;
}
- ptr += pitch - GLYPH_X*4;
+ ptr += gpitch - GLYPH_X*4;
}
}
diff --git a/src/lib/mem.c b/src/lib/mem.c
index bc5f23c..82f7f45 100644
--- a/src/lib/mem.c
+++ b/src/lib/mem.c
@@ -1,4 +1,5 @@
#include <drivers/uart.h>
+#include <globals.h>
#include <lib/mem.h>
void memcpyrot(unsigned char* src, struct RotBuffer* rb, unsigned int n)
@@ -16,6 +17,26 @@ void memcpyrot(unsigned char* src, struct RotBuffer* rb, unsigned int n)
rb->woffset = offset;
}
+void memshow(unsigned char* addr, unsigned int n)
+{
+ unsigned char temp;
+ for(unsigned int i = 0; i < n; i++) {
+ temp = addr[i] >> 4;
+ temp += 0x30;
+ if (temp > 0x39)
+ temp += 7;
+ uart_char(temp);
+ temp = addr[i];
+ temp += 0x30;
+ if (temp > 0x39)
+ temp += 7;
+ uart_char(temp);
+ if (i+1 != n)
+ uart_char(0x20);
+ }
+ uart_char(0x0a);
+}
+
void memshow32(unsigned long* addr, unsigned int n)
{
for(unsigned int i = 0; i < n; i++) {
@@ -72,10 +93,6 @@ unsigned char memcmp32(unsigned long* a, unsigned long* b, unsigned int n)
return 1;
}
-#define MAX_MM 0x100000
-static unsigned char rpi_heap[MAX_MM] = {0,};
-static void* rpi_heap_top = &rpi_heap;
-
void* malloc(unsigned char size)
{
diff --git a/src/sys/core.c b/src/sys/core.c
index d658d90..15a403a 100644
--- a/src/sys/core.c
+++ b/src/sys/core.c
@@ -1,5 +1,6 @@
#include <cpu/irq.h>
#include <drivers/uart.h>
+#include <globals.h>
#include <graphics/drawer.h>
#include <graphics/lfb.h>
#include <lib/mem.h>
@@ -7,7 +8,6 @@
#include <lib/strings.h>
#include <symbols.h>
#include <sys/core.h>
-#include <sys/kernel.h>
#include <sys/power.h>
#include <sys/schedule.h>
#include <sys/timer.h>
@@ -15,25 +15,19 @@
#include <util/status.h>
#include <util/time.h>
-#define SYS_CORE_C
-#ifndef VERSION
-char* os_info_v = "?";
-#else
-char* os_info_v = VERSION;
-#endif
-
void testlocal(void);
// Initialize IRQs
void sysinit(void)
{
// Clear System Globals
- *(unsigned long*)exe_cnt_m.addr = 0;
+ exe_cnt_m.addr = &exe_cnt;
exe_cnt_m.pid = NULL_PID;
- cmdidx = 0;
- for(int i = 0; i < 2048; i++)
- cmd[i] = 0;
- *(unsigned long*) SYS_TIMER_C0 = 60000000; // 60 second trigger
+ nextpid = SCHED_PID + 1;
+ rpi_heap_top = &rpi_heap;
+ stimeh = *(unsigned long*)SYS_TIMER_CHI;
+ stimel = *(unsigned long*)SYS_TIMER_CLO;
+ *(unsigned long*) SYS_TIMER_C0 = 60000000 + stimeh; // 6 second trigger
///...
// Route GPU interrupts to Core 0
@@ -56,6 +50,8 @@ void sysinit(void)
routing_core0cntv_to_core0fiq();
// Enable timer
enablecntv();
+ // Enable system timer
+ store32(SYS_TIMER_SC_M0, IRQ_ENABLE1);
// Graphics Initialize
lfb_init();
@@ -73,7 +69,6 @@ void sysinit(void)
//add_thread(testlocal, 3);
}
-struct Mutex testm = {.addr = (void*)0xDEADBEEF, .pid = NULL_PID};
void testlocal1(void)
{
unsigned long a = 5;
@@ -104,13 +99,6 @@ void testlocal(void)
schedule();
}
if (t->data.pid == 3) {
- yield();
- yield();
- yield();
- yield();
- yield();
- yield();
- yield();
// Example
/*
while (uart_tx_full) {
diff --git a/src/sys/kernel.S b/src/sys/kernel.S
index 356cedd..d9819a2 100644
--- a/src/sys/kernel.S
+++ b/src/sys/kernel.S
@@ -24,18 +24,3 @@ kernel_main:
1:
wfe
b 1b
-
-.section ".data"
-.globl cntfrq
-cntfrq: // 32 bits
- .word 0
-.globl cmdidx
-cmdidx:
- .word 0
-.globl cmd
-cmd:
- .space 2049
-
-.section ".bss.heap"
-mheap:
- .space 0x100000
diff --git a/src/sys/schedule.S b/src/sys/schedule.S
index aa33942..a46654c 100644
--- a/src/sys/schedule.S
+++ b/src/sys/schedule.S
@@ -91,7 +91,7 @@ schedule.current_thread_nexists:
ldr r1, [r0, #0x8]
// r1 = struct Thread* next_thread
// Store system stack pointer
- ldr r2, =syssp
+ ldr r2, =svcsp
push {r1}
ldr r1, [r2]
cmp r1, #0
@@ -127,9 +127,9 @@ schedule.no_next_thread:
// r1 = 0 = struct LL* current_thread_ll
// No thread to run
// Restore sys context
- ldr r0, =syscpu
+ ldr r0, =svccpu
str r0, [r3, #0x4] // Store context
- ldr r0, =syssp
+ ldr r0, =svcsp
ldr r1, [r0]
cmp r1, #0
beq schedule.exit
diff --git a/src/sys/schedule.c b/src/sys/schedule.c
index 1b02476..c300ae0 100644
--- a/src/sys/schedule.c
+++ b/src/sys/schedule.c
@@ -1,29 +1,10 @@
#include <cpu/irq.h>
#include <drivers/uart.h>
+#include <globals.h>
#include <sys/core.h>
#include <sys/schedule.h>
#include <util/mutex.h>
-#define SYS_SCHEDULE_C
-struct Scheduler scheduler = {
- .tlist = {
- {.prev = 0, .next = 0, .data = 0},
- {.prev = 0, .next = 0, .data = 0},
- {.prev = 0, .next = 0, .data = 0},
- {.prev = 0, .next = 0, .data = 0},
- {.prev = 0, .next = 0, .data = 0},
- {.prev = 0, .next = 0, .data = 0},
- },
- .rthread_ll = 0,
- .ctx = 0,
-};
-unsigned long syssp = 0;
-struct cpu_context syscpu = {
- .r4 = 0, .r5 = 0, .r6 = 0, .r7 = 0,
- .r8 = 0, .r9 = 0, .r10 = 0, .r11 = 0,
- .r12 = 0, .lr = 0,
-};
-
void init_scheduler(void)
{
for(int i = 0; i < PRIORITIES; i++) {
@@ -32,11 +13,9 @@ void init_scheduler(void)
scheduler.tlist[i].data = 0;
}
scheduler.rthread_ll = 0;
- scheduler.ctx = &syscpu;
+ scheduler.ctx = &svccpu;
}
-unsigned char stacks_table[MAX_THREADS] = {0, };
-
void* get_stack(void)
{
for (int i = 0; i < MAX_THREADS; i++) {
@@ -48,7 +27,6 @@ void* get_stack(void)
return 0;
}
-static unsigned long nextpid = 3;
void add_thread(void (*thread_fxn)(void), unsigned char priority)
{
struct Thread* thread = (struct Thread*)malloca(sizeof(struct Thread), 4);
@@ -119,7 +97,7 @@ void schedule_c(void)
}
else if (next_thread_ll != 0) {
struct Thread* next_thread = next_thread_ll->data;
- preserve_sys_stack(&syssp);
+ preserve_sys_stack(&svcsp);
restore_stack(next_thread);
scheduler.rthread_ll = next_thread_ll;
scheduler.ctx = &next_thread->data.cpu_context;
@@ -129,8 +107,8 @@ void schedule_c(void)
restore_ctx(scheduler.ctx);
asm volatile ("bx %0" :: "r"(rthread->thread));
} else {
- scheduler.ctx = &syscpu;
- restore_sys_stack(&syssp);
+ scheduler.ctx = &svccpu;
+ restore_sys_stack(&svcsp);
restore_ctx(scheduler.ctx);
}
}
diff --git a/src/sys/timer.c b/src/sys/timer.c
index 4ccdf5d..548bf1a 100644
--- a/src/sys/timer.c
+++ b/src/sys/timer.c
@@ -1,17 +1,13 @@
#include <drivers/uart.h>
+#include <globals.h>
#include <graphics/drawer.h>
#include <sys/core.h>
-#include <sys/kernel.h>
#include <sys/timer.h>
#include <util/mutex.h>
#include <util/status.h>
#include <util/time.h>
#include <symbols.h>
-#define SYS_TIMER_C
-static unsigned long exe_cnt = 0;
-struct Mutex exe_cnt_m = {.addr = &exe_cnt, .pid = NULL_PID};
-
void increase_counter(void)
{
if (lock_mutex(&exe_cnt_m, SCHED_PID) == 0) {
diff --git a/src/util/mutex.c b/src/util/mutex.c
index de7a515..f97760b 100644
--- a/src/util/mutex.c
+++ b/src/util/mutex.c
@@ -1,4 +1,5 @@
#include <cpu/atomic/swap.h>
+#include <globals.h>
#include <lib/mem.h>
#include <sys/schedule.h>
#include <util/mutex.h>
diff --git a/src/util/status.c b/src/util/status.c
index 7abf931..d07bf0a 100644
--- a/src/util/status.c
+++ b/src/util/status.c
@@ -1,4 +1,5 @@
#include <cpu.h>
+#include <globals.h>
#include <graphics/drawer.h>
#include <graphics/lfb.h>
#include <symbols.h>
@@ -93,10 +94,10 @@ void status(void)
// Video Status
write_string(&g_Drawer, "\nVIDEO: ");
write_cstring(&g_Drawer, "Enabled ", 0x00FF00);
- write_10(&g_Drawer, width);
+ write_10(&g_Drawer, gwidth);
write_string(&g_Drawer, "x");
- write_10(&g_Drawer, height);
- if(isrgb) {
+ write_10(&g_Drawer, gheight);
+ if(gisrgb) {
write_string(&g_Drawer, " RGB");
} else {
write_string(&g_Drawer, " BGR");
@@ -162,13 +163,16 @@ void status(void)
"and %0, %0, #3" : "=r"(coren) :: "cc");
write_string(&g_Drawer, "Status Updated by Core #");
write_10(&g_Drawer, coren);
- write_string(&g_Drawer, "\nSys Timer Status: ");
- coren = *(unsigned long*)SYS_TIMER_CS;
+ write_string(&g_Drawer, "\nSys Timer Status ");
+ coren = *(volatile unsigned long*)SYS_TIMER_CS;
write_10(&g_Drawer, coren);
- write_string(&g_Drawer, " : ");
+ write_string(&g_Drawer, ":");
unsigned long long tval = get_time();
write_hex32(&g_Drawer, (tval >> 32));
write_hex32(&g_Drawer, tval);
+ write_string(&g_Drawer, ":");
+ coren = *(volatile unsigned long*)SYS_TIMER_C0;
+ write_10(&g_Drawer, coren);
write_char(&g_Drawer, '\n');
write_10(&g_Drawer, ((unsigned long)tval)/1000000);