Merge pull request 'Merge feature/graphics-interrupts into develop' (#14) from feature/graphics-interrupts into develop
continuous-integration/drone/push Build is passing

Reviewed-on: #14
This commit was merged in pull request #14.
This commit is contained in:
2026-03-02 19:19:46 +00:00
3 changed files with 115 additions and 24 deletions
+52
View File
@@ -0,0 +1,52 @@
{
Driver->Timer->GraphicsRefresh - Timer-driven graphics refresh at ~120FPS.
Hooks into the 1024Hz timer (TMR_0_ISR) and calls the desktop, uidebug,
LVGL and video flush routines every ~9 ticks (1024/9 ≈ 113.8 FPS).
@author(Kieron Morris <[email protected]>)
}
unit graphicsrefresh;
interface
procedure init;
implementation
uses
util,
TMR_0_ISR,
desktop,
uidebug,
lvgl,
video,
syslog;
const
{ 1024 / 4 ≈ 256 FPS }
TICKS_PER_FRAME = 4;
var
TickCounter : uint32;
procedure on_tick(data : void);
begin
TickCounter := TickCounter + 1;
if TickCounter >= TICKS_PER_FRAME then begin
TickCounter := 0;
desktop.update;
uidebug.update;
lvgl_handler;
video.Flush;
end;
end;
procedure init;
begin
TickCounter := 0;
TMR_0_ISR.hook(uint32(@on_tick));
syslog.logln('GFXREFRESH', 'Hooked into 1024Hz timer (~120 FPS).');
end;
end.
+46
View File
@@ -0,0 +1,46 @@
{
Driver->Timer->USBHotplug - Timer-driven USB hotplug polling at ~1Hz.
Hooks into the 1024Hz timer (TMR_0_ISR) and calls
usbcore.usb_check_hotplug every 1024 ticks (approximately once per second).
@author(Kieron Morris <[email protected]>)
}
unit usbhotplug;
interface
procedure init;
implementation
uses
util,
TMR_0_ISR,
usbcore,
syslog;
const
{ 1024 ticks at 1024Hz ≈ 1 second }
TICKS_PER_POLL = 1024;
var
TickCounter : uint32;
procedure on_tick(data : void);
begin
TickCounter := TickCounter + 1;
if TickCounter >= TICKS_PER_POLL then begin
TickCounter := 0;
usbcore.usb_check_hotplug;
end;
end;
procedure init;
begin
TickCounter := 0;
TMR_0_ISR.hook(uint32(@on_tick));
syslog.logln('USBHOTPLUG', 'Hooked into 1024Hz timer (~1Hz polling).');
end;
end.
+17 -24
View File
@@ -66,7 +66,8 @@ uses
rand,
hashmap, vfs,
video, vesa, doublebuffer, color, lvgl, desktop, uidebug,
vterminal;
vterminal,
graphicsrefresh, usbhotplug;
procedure kmain(mbinfo: Pmultiboot_info_t; mbmagic: uint32); stdcall;
@@ -103,18 +104,14 @@ begin
pop_trace;
end;
procedure myUserLandFunction;
var
i : uint32;
procedure yield();
begin
i:=0;
while true do begin
i:=i+1;
asm
MOV EAX, i
end;
end;
asm
sti
@idle:
hlt
jmp @idle
end;
end;
procedure kmain(mbinfo: Pmultiboot_info_t; mbmagic: uint32); stdcall; [public, alias: 'kmain'];
@@ -132,6 +129,7 @@ begin
{ Syslog Init — right after serial so log hooks work }
syslog.init();
syslog.writestringln('Booting Asuro...');
{ Store Multiboot info }
multibootinfo:= mbinfo;
@@ -140,10 +138,8 @@ begin
{ Ensure tracer is frozen }
tracer.freeze();
syslog.writestringln('Booting Asuro...');
syslog.writestringln('Checking for Multiboot Compliance');
{ Check for Multiboot }
syslog.writestringln('Checking for Multiboot Compliance');
if (multibootmagic <> MULTIBOOT_BOOTLOADER_MAGIC) then begin
syslog.logln('KERNEL', 'Multiboot Compliant Boot-Loader Needed!');
syslog.logln('KERNEL', 'HALTING.');
@@ -276,16 +272,13 @@ begin
usb_keyboard.UnitTest;
usb_mouse.UnitTest;
{ Main render loop — USB completions are now interrupt-driven }
syslog.logln('KERNEL', 'Entering main render loop.');
while true do begin
desktop.update;
uidebug.update;
lvgl_handler;
usbcore.usb_check_hotplug;
video.Flush();
end;
{ Register timer-driven tasks }
graphicsrefresh.init;
usbhotplug.init;
{ All work is now driven by timer interrupts — idle the CPU }
syslog.logln('KERNEL', 'All tasks registered. Halting into idle.');
kernel.yield();
end;
end.