Enable native desktop applications and synchronized resolution changes
This commit is contained in:
1 parent
b71e6d67b4
commit
e462165049
28 files changed
+459
-428
No files matched your search
@@ -22,7 +22,7 @@ unit app.base64;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
io.stdio, core.util, arch.x86.util, core.strings, debug.tracer, core.enc.base64, memory.heap;
|
io.stdio, core.util, arch.platform.cpu, core.strings, debug.tracer, core.enc.base64, memory.heap;
|
||||||
|
|
||||||
procedure init();
|
procedure init();
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ uses
|
|||||||
core.strings,
|
core.strings,
|
||||||
io.stdio,
|
io.stdio,
|
||||||
debug.tracer,
|
debug.tracer,
|
||||||
core.util, arch.x86.util,
|
core.util, arch.platform.cpu,
|
||||||
driver.storage.vol.mgr;
|
driver.storage.vol.mgr;
|
||||||
|
|
||||||
var
|
var
|
||||||
@@ -254,7 +254,7 @@ begin
|
|||||||
{ Allocate a zero buffer - 64 sectors at a time }
|
{ Allocate a zero buffer - 64 sectors at a time }
|
||||||
bufSects := 64;
|
bufSects := 64;
|
||||||
buf := puint32(kalloc(bufSects * device^.sectorSize));
|
buf := puint32(kalloc(bufSects * device^.sectorSize));
|
||||||
memset(uint32(buf), 0, bufSects * device^.sectorSize);
|
memset(PtrUInt(buf), 0, bufSects * device^.sectorSize);
|
||||||
|
|
||||||
print('Wiping device ');
|
print('Wiping device ');
|
||||||
printint(idx);
|
printint(idx);
|
||||||
|
|||||||
+12
-11
@@ -34,7 +34,7 @@ uses
|
|||||||
driver.video,
|
driver.video,
|
||||||
driver.storage.vol.mgr,
|
driver.storage.vol.mgr,
|
||||||
driver.video.windows,
|
driver.video.windows,
|
||||||
core.util, arch.x86.util;
|
core.util, arch.platform.cpu;
|
||||||
|
|
||||||
const
|
const
|
||||||
WIN_W = 740;
|
WIN_W = 740;
|
||||||
@@ -129,9 +129,9 @@ begin
|
|||||||
item := PUIText(kalloc(sizeof(TUIText)+n+m+1));
|
item := PUIText(kalloc(sizeof(TUIText)+n+m+1));
|
||||||
if item = nil then exit;
|
if item = nil then exit;
|
||||||
item^.Next := TextTemps; TextTemps := item;
|
item^.Next := TextTemps; TextTemps := item;
|
||||||
dest := pchar(uint32(item)+sizeof(TUIText));
|
dest := pchar(PtrUInt(item)+sizeof(TUIText));
|
||||||
if n > 0 then memcpy(uint32(a), uint32(dest), n);
|
if n > 0 then memcpy(PtrUInt(a), PtrUInt(dest), n);
|
||||||
if m > 0 then memcpy(uint32(b), uint32(dest)+n, m);
|
if m > 0 then memcpy(PtrUInt(b), PtrUInt(dest)+n, m);
|
||||||
dest[n+m] := #0; uiConcat := dest;
|
dest[n+m] := #0; uiConcat := dest;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@@ -606,7 +606,7 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
memset(uint32(@part), 0, sizeof(TPartition_table));
|
memset(PtrUInt(@part), 0, sizeof(TPartition_table));
|
||||||
driver.storage.vol.mbr.setup_partition(@part, lba, sectors);
|
driver.storage.vol.mbr.setup_partition(@part, lba, sectors);
|
||||||
cbCtx := begin_partition_ui(1);
|
cbCtx := begin_partition_ui(1);
|
||||||
if cbCtx = nil then exit;
|
if cbCtx = nil then exit;
|
||||||
@@ -702,18 +702,19 @@ end;
|
|||||||
procedure operation_done(error : TError; userdata : pointer);
|
procedure operation_done(error : TError; userdata : pointer);
|
||||||
var
|
var
|
||||||
ctx : PFmtUICallbackCtx;
|
ctx : PFmtUICallbackCtx;
|
||||||
flags : uint32;
|
flags : PtrUInt;
|
||||||
begin
|
begin
|
||||||
ctx := PFmtUICallbackCtx(userdata);
|
ctx := PFmtUICallbackCtx(userdata);
|
||||||
if ctx <> nil then begin
|
if ctx <> nil then begin
|
||||||
asm pushfd; cli; pop flags end;
|
flags := arch.platform.cpu.lock;
|
||||||
if ctx^.SessionID = ui_session_id then begin
|
if ctx^.SessionID = ui_session_id then begin
|
||||||
fmt_done_error := error;
|
fmt_done_error := error;
|
||||||
fmt_done_vol_idx := ctx^.VolumeIdx;
|
fmt_done_vol_idx := ctx^.VolumeIdx;
|
||||||
done_kind := ctx^.Kind; done_device := ctx^.DeviceIdx;
|
done_kind := ctx^.Kind;
|
||||||
|
done_device := ctx^.DeviceIdx;
|
||||||
puint32(@fmt_done_flag)^ := 1;
|
puint32(@fmt_done_flag)^ := 1;
|
||||||
end;
|
end;
|
||||||
if (flags and $200) <> 0 then asm sti end;
|
arch.platform.cpu.unlock(flags);
|
||||||
kfree(void(ctx));
|
kfree(void(ctx));
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
@@ -824,7 +825,7 @@ begin
|
|||||||
fs := driver.storage.fs.mgr.get_filesystem(selIdx);
|
fs := driver.storage.fs.mgr.get_filesystem(selIdx);
|
||||||
if fs = nil then begin closeMsgBox; exit; end;
|
if fs = nil then begin closeMsgBox; exit; end;
|
||||||
|
|
||||||
memset(uint32(@params), 0, sizeof(TFSFormatParams));
|
memset(PtrUInt(@params), 0, sizeof(TFSFormatParams));
|
||||||
params.Version := FS_FORMAT_PARAMS_VERSION_1;
|
params.Version := FS_FORMAT_PARAMS_VERSION_1;
|
||||||
paramPtr := nil;
|
paramPtr := nil;
|
||||||
|
|
||||||
@@ -874,7 +875,7 @@ begin
|
|||||||
if fs^.validateLabelCallback(text,normalized) <> eNone then begin
|
if fs^.validateLabelCallback(text,normalized) <> eNone then begin
|
||||||
set_fmt_param_error('Use up to 11 ASCII characters without punctuation such as / or :'); exit;
|
set_fmt_param_error('Use up to 11 ASCII characters without punctuation such as / or :'); exit;
|
||||||
end;
|
end;
|
||||||
memcpy(uint32(@normalized[0]),uint32(@params.LabelText[0]),12);
|
memcpy(PtrUInt(@normalized[0]),PtrUInt(@params.LabelText[0]),12);
|
||||||
params.Flags := params.Flags or FS_FORMAT_PARAM_LABEL; paramPtr := @params;
|
params.Flags := params.Flags or FS_FORMAT_PARAM_LABEL; paramPtr := @params;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ uses
|
|||||||
core.gfx.fileicons,
|
core.gfx.fileicons,
|
||||||
debug.tracer,
|
debug.tracer,
|
||||||
core.util,
|
core.util,
|
||||||
arch.x86.util;
|
arch.platform.cpu;
|
||||||
|
|
||||||
const
|
const
|
||||||
WIN_W = 800;
|
WIN_W = 800;
|
||||||
@@ -785,9 +785,9 @@ begin
|
|||||||
dir_names := PNameBuf(kalloc(sizeof(TNameBuf)));
|
dir_names := PNameBuf(kalloc(sizeof(TNameBuf)));
|
||||||
file_names := PNameBuf(kalloc(sizeof(TNameBuf)));
|
file_names := PNameBuf(kalloc(sizeof(TNameBuf)));
|
||||||
file_sizes := PSizeBuf(kalloc(sizeof(TSizeBuf)));
|
file_sizes := PSizeBuf(kalloc(sizeof(TSizeBuf)));
|
||||||
memset(uint32(dir_names), 0, sizeof(TNameBuf));
|
memset(PtrUInt(dir_names), 0, sizeof(TNameBuf));
|
||||||
memset(uint32(file_names), 0, sizeof(TNameBuf));
|
memset(PtrUInt(file_names), 0, sizeof(TNameBuf));
|
||||||
memset(uint32(file_sizes), 0, sizeof(TSizeBuf));
|
memset(PtrUInt(file_sizes), 0, sizeof(TSizeBuf));
|
||||||
|
|
||||||
{ Load directory from VFS — this may do disk I/O }
|
{ Load directory from VFS — this may do disk I/O }
|
||||||
Map := driver.storage.vfs.GetDirectoryListingFrom(state^.cur_path, '/');
|
Map := driver.storage.vfs.GetDirectoryListingFrom(state^.cur_path, '/');
|
||||||
@@ -1330,7 +1330,7 @@ begin
|
|||||||
parent := stringCopy('/')
|
parent := stringCopy('/')
|
||||||
else begin
|
else begin
|
||||||
parent := pchar(kalloc(uint32(i) + 1));
|
parent := pchar(kalloc(uint32(i) + 1));
|
||||||
memcpy(uint32(cur), uint32(parent), uint32(i));
|
memcpy(PtrUInt(cur), PtrUInt(parent), uint32(i));
|
||||||
parent[i] := char(0);
|
parent[i] := char(0);
|
||||||
end;
|
end;
|
||||||
navigate_to(state, parent);
|
navigate_to(state, parent);
|
||||||
@@ -1440,7 +1440,7 @@ begin
|
|||||||
|
|
||||||
{ Segment name label }
|
{ Segment name label }
|
||||||
segBuf := pchar(kalloc(segEnd - segStart + 1));
|
segBuf := pchar(kalloc(segEnd - segStart + 1));
|
||||||
memcpy(uint32(@path[segStart]), uint32(segBuf), segEnd - segStart);
|
memcpy(PtrUInt(@path[segStart]), uint32(segBuf), segEnd - segStart);
|
||||||
segBuf[segEnd - segStart] := char(0);
|
segBuf[segEnd - segStart] := char(0);
|
||||||
lbl := lv_label_create(btn);
|
lbl := lv_label_create(btn);
|
||||||
lv_label_set_text(lbl, segBuf);
|
lv_label_set_text(lbl, segBuf);
|
||||||
@@ -1979,7 +1979,7 @@ begin
|
|||||||
if state^.tabs[idx] <> nil then
|
if state^.tabs[idx] <> nil then
|
||||||
free_tab_snapshot(state^.tabs[idx]);
|
free_tab_snapshot(state^.tabs[idx]);
|
||||||
snap := PTabSnapshot(kalloc(sizeof(TTabSnapshot)));
|
snap := PTabSnapshot(kalloc(sizeof(TTabSnapshot)));
|
||||||
memset(uint32(snap), 0, sizeof(TTabSnapshot));
|
memset(PtrUInt(snap), 0, sizeof(TTabSnapshot));
|
||||||
if state^.cur_path <> nil then
|
if state^.cur_path <> nil then
|
||||||
snap^.cur_path := stringCopy(state^.cur_path)
|
snap^.cur_path := stringCopy(state^.cur_path)
|
||||||
else
|
else
|
||||||
@@ -2090,7 +2090,7 @@ begin
|
|||||||
save_tab(state, state^.active_tab);
|
save_tab(state, state^.active_tab);
|
||||||
{ Create snapshot for new tab }
|
{ Create snapshot for new tab }
|
||||||
snap := PTabSnapshot(kalloc(sizeof(TTabSnapshot)));
|
snap := PTabSnapshot(kalloc(sizeof(TTabSnapshot)));
|
||||||
memset(uint32(snap), 0, sizeof(TTabSnapshot));
|
memset(PtrUInt(snap), 0, sizeof(TTabSnapshot));
|
||||||
snap^.cur_path := stringCopy(path);
|
snap^.cur_path := stringCopy(path);
|
||||||
snap^.hist_len := 0;
|
snap^.hist_len := 0;
|
||||||
snap^.hist_pos := 0;
|
snap^.hist_pos := 0;
|
||||||
@@ -3053,7 +3053,7 @@ begin
|
|||||||
|
|
||||||
{ Allocate and zero-initialise state }
|
{ Allocate and zero-initialise state }
|
||||||
state := PFileBrowserState(kalloc(sizeof(TFileBrowserState)));
|
state := PFileBrowserState(kalloc(sizeof(TFileBrowserState)));
|
||||||
memset(uint32(state), 0, sizeof(TFileBrowserState));
|
memset(PtrUInt(state), 0, sizeof(TFileBrowserState));
|
||||||
state^.win_id := g_win_id;
|
state^.win_id := g_win_id;
|
||||||
state^.cur_path := stringCopy('/');
|
state^.cur_path := stringCopy('/');
|
||||||
state^.view_mode := vmDetail;
|
state^.view_mode := vmDetail;
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ uses
|
|||||||
core.strings.helpers,
|
core.strings.helpers,
|
||||||
io.syslog,
|
io.syslog,
|
||||||
debug.tracer,
|
debug.tracer,
|
||||||
core.util, arch.x86.util,
|
core.util, arch.platform.cpu,
|
||||||
driver.storage.vfs;
|
driver.storage.vfs;
|
||||||
|
|
||||||
const
|
const
|
||||||
@@ -325,9 +325,9 @@ begin
|
|||||||
dir_names := PNameBuf(kalloc(sizeof(TNameBuf)));
|
dir_names := PNameBuf(kalloc(sizeof(TNameBuf)));
|
||||||
file_names := PNameBuf(kalloc(sizeof(TNameBuf)));
|
file_names := PNameBuf(kalloc(sizeof(TNameBuf)));
|
||||||
file_sizes := PSizeBuf(kalloc(sizeof(TSizeBuf)));
|
file_sizes := PSizeBuf(kalloc(sizeof(TSizeBuf)));
|
||||||
memset(uint32(dir_names), 0, sizeof(TNameBuf));
|
memset(PtrUInt(dir_names), 0, sizeof(TNameBuf));
|
||||||
memset(uint32(file_names), 0, sizeof(TNameBuf));
|
memset(PtrUInt(file_names), 0, sizeof(TNameBuf));
|
||||||
memset(uint32(file_sizes), 0, sizeof(TSizeBuf));
|
memset(PtrUInt(file_sizes), 0, sizeof(TSizeBuf));
|
||||||
|
|
||||||
{ Sync path bar }
|
{ Sync path bar }
|
||||||
if p^.path_bar <> nil then
|
if p^.path_bar <> nil then
|
||||||
@@ -898,7 +898,7 @@ begin
|
|||||||
io.syslog.logln('FPCIK', 'make_picker: enter');
|
io.syslog.logln('FPCIK', 'make_picker: enter');
|
||||||
|
|
||||||
p := PPicker(kalloc(sizeof(TPicker)));
|
p := PPicker(kalloc(sizeof(TPicker)));
|
||||||
memset(uint32(p), 0, sizeof(TPicker));
|
memset(PtrUInt(p), 0, sizeof(TPicker));
|
||||||
p^.cb := cb;
|
p^.cb := cb;
|
||||||
p^.userdata := userdata;
|
p^.userdata := userdata;
|
||||||
p^.is_save := is_save;
|
p^.is_save := is_save;
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ unit app.md5sum;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
io.stdio, core.util, arch.x86.util, core.strings, debug.tracer, core.enc.md5;
|
memory.heap, io.stdio, core.util, arch.platform.cpu, core.strings, debug.tracer, core.enc.md5;
|
||||||
|
|
||||||
procedure init();
|
procedure init();
|
||||||
|
|
||||||
@@ -36,6 +36,10 @@ var
|
|||||||
i : uint32;
|
i : uint32;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
|
if paramCount(Params) = 0 then begin
|
||||||
|
io.stdio.bufWriteStrLn(stderr_buf, 'Usage: MD5SUM <word>');
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
md5word:= getParam(0, Params);
|
md5word:= getParam(0, Params);
|
||||||
wordlen:= stringSize(md5word);
|
wordlen:= stringSize(md5word);
|
||||||
MD5_Hash := MD5Buffer(puint8(md5word), wordlen);
|
MD5_Hash := MD5Buffer(puint8(md5word), wordlen);
|
||||||
@@ -43,6 +47,7 @@ begin
|
|||||||
io.stdio.bufWriteHexPair(stdout_buf, MD5_Hash^[i]);
|
io.stdio.bufWriteHexPair(stdout_buf, MD5_Hash^[i]);
|
||||||
end;
|
end;
|
||||||
io.stdio.bufWriteStrLn(stdout_buf, ' ');
|
io.stdio.bufWriteStrLn(stdout_buf, ' ');
|
||||||
|
memory.heap.kfree(void(MD5_Hash));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure init();
|
procedure init();
|
||||||
@@ -51,4 +56,4 @@ begin
|
|||||||
io.stdio.registerCommand('MD5SUM', @Run, 'Perform MD5SUM on a word.');
|
io.stdio.registerCommand('MD5SUM', @Run, 'Perform MD5SUM on a word.');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
+23
-43
@@ -22,7 +22,7 @@ unit app.meminfo;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
io.stdio, arch.x86.multiboot, arch.x86.memory.physical, memory.heap, debug.tracer;
|
io.stdio, arch.platform.memory, memory.heap, debug.tracer;
|
||||||
|
|
||||||
procedure init();
|
procedure init();
|
||||||
|
|
||||||
@@ -30,50 +30,30 @@ implementation
|
|||||||
|
|
||||||
procedure run(Params : PParamList; stdin_buf, stdout_buf, stderr_buf : POutBuf);
|
procedure run(Params : PParamList; stdin_buf, stdout_buf, stderr_buf : POutBuf);
|
||||||
var
|
var
|
||||||
pmm_total, pmm_free, pmm_used : uint32;
|
total, available: uint64;
|
||||||
lmm_pages, lmm_free : uint32;
|
heapPages: uint32;
|
||||||
begin
|
begin
|
||||||
{ Multiboot memory info }
|
total := arch.platform.memory.totalPhysicalBytes;
|
||||||
io.stdio.bufWriteStrLn(stdout_buf, '--- Multiboot ---');
|
available := arch.platform.memory.freePhysicalBytes;
|
||||||
io.stdio.bufWriteStr(stdout_buf, 'Lower Memory : ');
|
io.stdio.bufWriteStr(stdout_buf, 'Usable Physical: ');
|
||||||
io.stdio.bufWriteInt(stdout_buf, multibootinfo^.mem_lower);
|
io.stdio.bufWriteInt(stdout_buf, total div 1024);
|
||||||
io.stdio.bufWriteStrLn(stdout_buf, ' KB');
|
io.stdio.bufWriteStrLn(stdout_buf, ' KiB');
|
||||||
io.stdio.bufWriteStr(stdout_buf, 'Upper Memory : ');
|
io.stdio.bufWriteStr(stdout_buf, 'Free Physical : ');
|
||||||
io.stdio.bufWriteInt(stdout_buf, multibootinfo^.mem_upper);
|
io.stdio.bufWriteInt(stdout_buf, available div 1024);
|
||||||
io.stdio.bufWriteStrLn(stdout_buf, ' KB');
|
io.stdio.bufWriteStrLn(stdout_buf, ' KiB');
|
||||||
io.stdio.bufWriteStr(stdout_buf, 'Total Memory : ');
|
io.stdio.bufWriteStr(stdout_buf, 'Used Physical : ');
|
||||||
io.stdio.bufWriteInt(stdout_buf, ((multibootinfo^.mem_upper + 1000) div 1024) + 1);
|
io.stdio.bufWriteInt(stdout_buf, (total - available) div 1024);
|
||||||
io.stdio.bufWriteStrLn(stdout_buf, ' MB');
|
io.stdio.bufWriteStrLn(stdout_buf, ' KiB');
|
||||||
|
heapPages := memory.heap.lmm_page_count;
|
||||||
{ PMM stats }
|
io.stdio.bufWriteStr(stdout_buf, 'Heap Regions : ');
|
||||||
io.stdio.bufWriteStrLn(stdout_buf, '--- PMM (4 MB blocks) ---');
|
io.stdio.bufWriteIntLn(stdout_buf, heapPages);
|
||||||
pmm_total := arch.x86.memory.physical.pmm_total_blocks;
|
io.stdio.bufWriteStr(stdout_buf, 'Heap Size : ');
|
||||||
pmm_free := arch.x86.memory.physical.pmm_free_blocks;
|
io.stdio.bufWriteInt(stdout_buf, uint64(heapPages) * PAGE_SIZE_LMM div 1024);
|
||||||
pmm_used := pmm_total - pmm_free;
|
io.stdio.bufWriteStrLn(stdout_buf, ' KiB');
|
||||||
io.stdio.bufWriteStr(stdout_buf, 'Total Blocks : ');
|
io.stdio.bufWriteStr(stdout_buf, 'Heap Free : ');
|
||||||
io.stdio.bufWriteIntLn(stdout_buf, pmm_total);
|
io.stdio.bufWriteInt(stdout_buf, memory.heap.lmm_total_free div 1024);
|
||||||
io.stdio.bufWriteStr(stdout_buf, 'Free Blocks : ');
|
io.stdio.bufWriteStrLn(stdout_buf, ' KiB');
|
||||||
io.stdio.bufWriteIntLn(stdout_buf, pmm_free);
|
|
||||||
io.stdio.bufWriteStr(stdout_buf, 'Used Blocks : ');
|
|
||||||
io.stdio.bufWriteIntLn(stdout_buf, pmm_used);
|
|
||||||
io.stdio.bufWriteStr(stdout_buf, 'Free Physical : ');
|
|
||||||
io.stdio.bufWriteInt(stdout_buf, pmm_free * 4);
|
|
||||||
io.stdio.bufWriteStrLn(stdout_buf, ' MB');
|
|
||||||
|
|
||||||
{ LMM heap stats }
|
|
||||||
io.stdio.bufWriteStrLn(stdout_buf, '--- LMM (Heap) ---');
|
|
||||||
lmm_pages := memory.heap.lmm_page_count;
|
|
||||||
lmm_free := memory.heap.lmm_total_free;
|
|
||||||
io.stdio.bufWriteStr(stdout_buf, 'Heap Pages : ');
|
|
||||||
io.stdio.bufWriteIntLn(stdout_buf, lmm_pages);
|
|
||||||
io.stdio.bufWriteStr(stdout_buf, 'Heap Size : ');
|
|
||||||
io.stdio.bufWriteInt(stdout_buf, lmm_pages * 4);
|
|
||||||
io.stdio.bufWriteStrLn(stdout_buf, ' MB');
|
|
||||||
io.stdio.bufWriteStr(stdout_buf, 'Heap Free : ');
|
|
||||||
io.stdio.bufWriteInt(stdout_buf, lmm_free div 1024);
|
|
||||||
io.stdio.bufWriteStrLn(stdout_buf, ' KB');
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure init();
|
procedure init();
|
||||||
begin
|
begin
|
||||||
debug.tracer.push_trace('meminfo.init');
|
debug.tracer.push_trace('meminfo.init');
|
||||||
|
|||||||
+14
-29
@@ -11,8 +11,7 @@
|
|||||||
- Status bar showing Line, Col, filename, and dirty flag
|
- Status bar showing Line, Col, filename, and dirty flag
|
||||||
|
|
||||||
Key design notes:
|
Key design notes:
|
||||||
- lv_event_t.stop_processing (bit 1 at struct byte offset 24) is set
|
- lv_event_stop_processing prevents LVGL's default textarea handler from also
|
||||||
directly to prevent LVGL's default textarea key handler from also
|
|
||||||
acting on keys we have fully handled ourselves.
|
acting on keys we have fully handled ourselves.
|
||||||
- Shift state is read from driver.hid.keyboard.is_shift / driver.hid.keyboard.is_ctrl.
|
- Shift state is read from driver.hid.keyboard.is_shift / driver.hid.keyboard.is_ctrl.
|
||||||
- selection anchor (sel_anchor) is stored as a sint32 byte offset;
|
- selection anchor (sel_anchor) is stored as a sint32 byte offset;
|
||||||
@@ -43,7 +42,7 @@ uses
|
|||||||
io.syslog,
|
io.syslog,
|
||||||
io.stdio,
|
io.stdio,
|
||||||
debug.tracer,
|
debug.tracer,
|
||||||
core.util, arch.x86.util,
|
core.util, arch.platform.cpu,
|
||||||
driver.storage.vfs,
|
driver.storage.vfs,
|
||||||
driver.video,
|
driver.video,
|
||||||
driver.video.windows;
|
driver.video.windows;
|
||||||
@@ -62,19 +61,6 @@ const
|
|||||||
|
|
||||||
FILE_BUF_SIZE = 65536; { 64 KB read / write buffer }
|
FILE_BUF_SIZE = 65536; { 64 KB read / write buffer }
|
||||||
|
|
||||||
{
|
|
||||||
Byte offset and bitmask for lv_event_t.stop_processing.
|
|
||||||
struct lv_event_t (32-bit ABI):
|
|
||||||
offset 0: current_target (ptr)
|
|
||||||
offset 4: original_target (ptr)
|
|
||||||
offset 8: code (uint32 — lv_event_code_t)
|
|
||||||
offset 12: user_data (ptr)
|
|
||||||
offset 16: param (ptr)
|
|
||||||
offset 20: prev (ptr)
|
|
||||||
offset 24: flags byte [bit0=deleted, bit1=stop_processing, bit2=stop_bubbling]
|
|
||||||
}
|
|
||||||
LV_EVT_STOP_OFF = 24;
|
|
||||||
LV_EVT_STOP_BIT = 2; { bit 1 = stop_processing }
|
|
||||||
|
|
||||||
type
|
type
|
||||||
PNotepadState = ^TNotepadState;
|
PNotepadState = ^TNotepadState;
|
||||||
@@ -130,8 +116,7 @@ procedure removeInstance(state: PNotepadState); forward;
|
|||||||
============================================================ }
|
============================================================ }
|
||||||
procedure stopEvent(e: Plv_event);
|
procedure stopEvent(e: Plv_event);
|
||||||
begin
|
begin
|
||||||
puint8(uint32(e) + LV_EVT_STOP_OFF)^ :=
|
lv_event_stop_processing(e);
|
||||||
puint8(uint32(e) + LV_EVT_STOP_OFF)^ or LV_EVT_STOP_BIT;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ ============================================================
|
{ ============================================================
|
||||||
@@ -157,18 +142,18 @@ begin
|
|||||||
if to_idx < from_idx then to_idx := from_idx;
|
if to_idx < from_idx then to_idx := from_idx;
|
||||||
result_len := from_idx + ins_len + (src_len - to_idx);
|
result_len := from_idx + ins_len + (src_len - to_idx);
|
||||||
buf := pchar(kalloc(result_len + 1));
|
buf := pchar(kalloc(result_len + 1));
|
||||||
memset(uint32(buf), 0, result_len + 1);
|
memset(PtrUInt(buf), 0, result_len + 1);
|
||||||
pos := 0;
|
pos := 0;
|
||||||
if from_idx > 0 then begin
|
if from_idx > 0 then begin
|
||||||
memcpy(uint32(src), uint32(buf), from_idx);
|
memcpy(PtrUInt(src), PtrUInt(buf), from_idx);
|
||||||
pos := from_idx;
|
pos := from_idx;
|
||||||
end;
|
end;
|
||||||
if ins_len > 0 then begin
|
if ins_len > 0 then begin
|
||||||
memcpy(uint32(insert), uint32(@buf[pos]), ins_len);
|
memcpy(PtrUInt(insert), PtrUInt(@buf[pos]), ins_len);
|
||||||
pos := pos + ins_len;
|
pos := pos + ins_len;
|
||||||
end;
|
end;
|
||||||
if to_idx < src_len then
|
if to_idx < src_len then
|
||||||
memcpy(uint32(@src[to_idx]), uint32(@buf[pos]), src_len - to_idx);
|
memcpy(PtrUInt(@src[to_idx]), PtrUInt(@buf[pos]), src_len - to_idx);
|
||||||
buildSplicedString := buf;
|
buildSplicedString := buf;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@@ -198,12 +183,12 @@ begin
|
|||||||
|
|
||||||
{ Generous output buffer: original + 4 bytes per line (worst case ~512 lines) }
|
{ Generous output buffer: original + 4 bytes per line (worst case ~512 lines) }
|
||||||
out_buf := pchar(kalloc(src_len + 2049));
|
out_buf := pchar(kalloc(src_len + 2049));
|
||||||
memset(uint32(out_buf), 0, src_len + 2049);
|
memset(PtrUInt(out_buf), 0, src_len + 2049);
|
||||||
out_pos := 0;
|
out_pos := 0;
|
||||||
|
|
||||||
{ Copy everything before the affected region verbatim }
|
{ Copy everything before the affected region verbatim }
|
||||||
if first_ls > 0 then begin
|
if first_ls > 0 then begin
|
||||||
memcpy(uint32(src), uint32(out_buf), first_ls);
|
memcpy(PtrUInt(src), PtrUInt(out_buf), first_ls);
|
||||||
out_pos := first_ls;
|
out_pos := first_ls;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@@ -215,7 +200,7 @@ begin
|
|||||||
if i >= sel_end then begin
|
if i >= sel_end then begin
|
||||||
{ Past the affected region: copy the remainder verbatim }
|
{ Past the affected region: copy the remainder verbatim }
|
||||||
if i < src_len then begin
|
if i < src_len then begin
|
||||||
memcpy(uint32(@src[i]), uint32(@out_buf[out_pos]), src_len - i);
|
memcpy(PtrUInt(@src[i]), PtrUInt(@out_buf[out_pos]), src_len - i);
|
||||||
out_pos := out_pos + (src_len - i);
|
out_pos := out_pos + (src_len - i);
|
||||||
end;
|
end;
|
||||||
break;
|
break;
|
||||||
@@ -426,8 +411,8 @@ begin
|
|||||||
len := stringSize(txt);
|
len := stringSize(txt);
|
||||||
if len > FILE_BUF_SIZE - 1 then len := FILE_BUF_SIZE - 1;
|
if len > FILE_BUF_SIZE - 1 then len := FILE_BUF_SIZE - 1;
|
||||||
buf := pchar(kalloc(FILE_BUF_SIZE));
|
buf := pchar(kalloc(FILE_BUF_SIZE));
|
||||||
memset(uint32(buf), 0, FILE_BUF_SIZE);
|
memset(PtrUInt(buf), 0, FILE_BUF_SIZE);
|
||||||
memcpy(uint32(txt), uint32(buf), len);
|
memcpy(PtrUInt(txt), PtrUInt(buf), len);
|
||||||
fHandle := driver.storage.vfs.OpenFile(state^.currentPath, omReadWrite, @fError);
|
fHandle := driver.storage.vfs.OpenFile(state^.currentPath, omReadWrite, @fError);
|
||||||
if fHandle = 0 then
|
if fHandle = 0 then
|
||||||
fHandle := driver.storage.vfs.OpenFile(state^.currentPath, omCreate, @fError);
|
fHandle := driver.storage.vfs.OpenFile(state^.currentPath, omCreate, @fError);
|
||||||
@@ -477,7 +462,7 @@ begin
|
|||||||
exit;
|
exit;
|
||||||
end;
|
end;
|
||||||
buf := pchar(kalloc(FILE_BUF_SIZE));
|
buf := pchar(kalloc(FILE_BUF_SIZE));
|
||||||
memset(uint32(buf), 0, FILE_BUF_SIZE);
|
memset(PtrUInt(buf), 0, FILE_BUF_SIZE);
|
||||||
driver.storage.vfs.ReadFile(fHandle, 0, puint8(buf), FILE_BUF_SIZE - 1);
|
driver.storage.vfs.ReadFile(fHandle, 0, puint8(buf), FILE_BUF_SIZE - 1);
|
||||||
driver.storage.vfs.CloseFile(fHandle);
|
driver.storage.vfs.CloseFile(fHandle);
|
||||||
if state^.currentPath <> nil then kfree(void(state^.currentPath));
|
if state^.currentPath <> nil then kfree(void(state^.currentPath));
|
||||||
@@ -943,7 +928,7 @@ begin
|
|||||||
|
|
||||||
{ Allocate and zero-initialise state }
|
{ Allocate and zero-initialise state }
|
||||||
state := PNotepadState(kalloc(sizeof(TNotepadState)));
|
state := PNotepadState(kalloc(sizeof(TNotepadState)));
|
||||||
memset(uint32(state), 0, sizeof(TNotepadState));
|
memset(PtrUInt(state), 0, sizeof(TNotepadState));
|
||||||
state^.win_id := wid;
|
state^.win_id := wid;
|
||||||
state^.sel_anchor := -1;
|
state^.sel_anchor := -1;
|
||||||
addInstance(state);
|
addInstance(state);
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ unit app.setres;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
io.stdio, driver.video.gpu, core.util, arch.x86.util, core.strings, debug.tracer, io.syslog;
|
io.stdio, driver.video.lvgl, driver.video.gpu, core.util, arch.platform.cpu, core.strings, debug.tracer, io.syslog;
|
||||||
|
|
||||||
procedure init();
|
procedure init();
|
||||||
|
|
||||||
@@ -25,6 +25,7 @@ var
|
|||||||
w, h : uint32;
|
w, h : uint32;
|
||||||
wStr, hStr : pchar;
|
wStr, hStr : pchar;
|
||||||
info : TGPUModeInfo;
|
info : TGPUModeInfo;
|
||||||
|
changed: boolean;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
debug.tracer.push_trace('setres.run');
|
debug.tracer.push_trace('setres.run');
|
||||||
@@ -55,7 +56,10 @@ begin
|
|||||||
io.stdio.bufWriteStrLn(stdout_buf, 'x32...');
|
io.stdio.bufWriteStrLn(stdout_buf, 'x32...');
|
||||||
|
|
||||||
{ Step 1: Set display mode via GPU framework (tries BGA first, then VBE) }
|
{ Step 1: Set display mode via GPU framework (tries BGA first, then VBE) }
|
||||||
if not driver.video.gpu.setMode(w, h, 32, info) then begin
|
driver.video.lvgl.lvgl_lock;
|
||||||
|
changed := driver.video.gpu.setMode(w, h, 32, info);
|
||||||
|
driver.video.lvgl.lvgl_unlock;
|
||||||
|
if not changed then begin
|
||||||
io.stdio.bufWriteStrLn(stderr_buf, 'Error: Mode switch failed. Mode may not be supported.');
|
io.stdio.bufWriteStrLn(stderr_buf, 'Error: Mode switch failed. Mode may not be supported.');
|
||||||
debug.tracer.pop_trace;
|
debug.tracer.pop_trace;
|
||||||
exit;
|
exit;
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ unit app.uidebug;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
driver.video.lvgl, driver.video.windows, driver.hid.mouse, driver.video, arch.x86.multiboot, debug.tracer;
|
driver.video.lvgl, driver.video.windows, driver.hid.mouse, driver.video, boot.multiboot, debug.tracer;
|
||||||
|
|
||||||
{ Call once per frame from the main loop (before lvgl_handler). }
|
{ Call once per frame from the main loop (before lvgl_handler). }
|
||||||
procedure update;
|
procedure update;
|
||||||
|
|||||||
+55
-46
File diff suppressed because it is too large.
Load diff
@@ -12,9 +12,6 @@ unit driver.hid.mouse;
|
|||||||
|
|
||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
|
||||||
driver.video;
|
|
||||||
|
|
||||||
type
|
type
|
||||||
TMouseEventType = (
|
TMouseEventType = (
|
||||||
MOUSE_MOVE,
|
MOUSE_MOVE,
|
||||||
@@ -36,6 +33,7 @@ function getMouseRMB: boolean;
|
|||||||
function getMouseScroll: sint32;
|
function getMouseScroll: sint32;
|
||||||
|
|
||||||
{ Setters - called by driver.hid.mouse drivers (PS/2, driver.bus.usb) }
|
{ Setters - called by driver.hid.mouse drivers (PS/2, driver.bus.usb) }
|
||||||
|
procedure setBounds(width, height: uint32);
|
||||||
procedure setMousePos(x, y: sint32);
|
procedure setMousePos(x, y: sint32);
|
||||||
procedure setMouseLMB(down: boolean);
|
procedure setMouseLMB(down: boolean);
|
||||||
procedure setMouseRMB(down: boolean);
|
procedure setMouseRMB(down: boolean);
|
||||||
@@ -53,6 +51,7 @@ const
|
|||||||
MAX_MOUSE_HOOKS = 8;
|
MAX_MOUSE_HOOKS = 8;
|
||||||
|
|
||||||
var
|
var
|
||||||
|
maxW, maxH : sint32;
|
||||||
MouseX : sint32 = 0;
|
MouseX : sint32 = 0;
|
||||||
MouseY : sint32 = 0;
|
MouseY : sint32 = 0;
|
||||||
MouseLMB : boolean = false;
|
MouseLMB : boolean = false;
|
||||||
@@ -87,12 +86,17 @@ begin
|
|||||||
ScrollAccum := 0;
|
ScrollAccum := 0;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure setBounds(width, height: uint32);
|
||||||
|
begin
|
||||||
|
if width > $7FFFFFFF then width := $7FFFFFFF;
|
||||||
|
if height > $7FFFFFFF then height := $7FFFFFFF;
|
||||||
|
maxW := sint32(width);
|
||||||
|
maxH := sint32(height);
|
||||||
|
setMousePos(MouseX, MouseY);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure setMousePos(x, y: sint32);
|
procedure setMousePos(x, y: sint32);
|
||||||
var
|
|
||||||
maxW, maxH : sint32;
|
|
||||||
begin
|
begin
|
||||||
maxW := sint32(driver.video.frontBufferWidth);
|
|
||||||
maxH := sint32(driver.video.frontBufferHeight);
|
|
||||||
if x < 0 then x := 0;
|
if x < 0 then x := 0;
|
||||||
if y < 0 then y := 0;
|
if y < 0 then y := 0;
|
||||||
if (maxW > 0) and (x >= maxW) then x := maxW - 1;
|
if (maxW > 0) and (x >= maxW) then x := maxW - 1;
|
||||||
|
|||||||
@@ -12,18 +12,17 @@ unit driver.hid.ps2.keyboard;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
boot.mgr,
|
|
||||||
driver.hid.keyboard,
|
driver.hid.keyboard,
|
||||||
io.syslog,
|
io.syslog,
|
||||||
core.util, arch.x86.util,
|
core.util, arch.platform.cpu,
|
||||||
arch.x86.isr.ps2keyboard;
|
arch.platform.interrupts, arch.common.legacyirq;
|
||||||
|
|
||||||
var
|
var
|
||||||
key_matrix : array [1..256] of TKeyInfo;
|
key_matrix : array [0..255] of TKeyInfo;
|
||||||
key_matrix_shift : array [1..256] of TKeyInfo;
|
key_matrix_shift : array [0..255] of TKeyInfo;
|
||||||
|
|
||||||
procedure init();
|
procedure init();
|
||||||
procedure init_layout(keyboard_layout : array of TKeyInfo);
|
procedure init_layout(const keyboard_layout : array of TKeyInfo);
|
||||||
procedure disable;
|
procedure disable;
|
||||||
procedure lang_USA();
|
procedure lang_USA();
|
||||||
|
|
||||||
@@ -32,14 +31,16 @@ implementation
|
|||||||
uses
|
uses
|
||||||
driver.mgr;
|
driver.mgr;
|
||||||
|
|
||||||
procedure callback(scan_code : void);
|
var enabled: boolean = false;
|
||||||
|
|
||||||
|
procedure callback(scan_code : uint8);
|
||||||
var
|
var
|
||||||
info : TKeyInfo;
|
info : TKeyInfo;
|
||||||
raw : uint8;
|
raw : uint8;
|
||||||
baseCode : uint8;
|
baseCode : uint8;
|
||||||
isBreak : boolean;
|
isBreak : boolean;
|
||||||
begin
|
begin
|
||||||
raw := uint8(scan_code);
|
raw := scan_code;
|
||||||
|
|
||||||
{ In PS/2 scancode set 1, bit 7 set = key release (break code) }
|
{ In PS/2 scancode set 1, bit 7 set = key release (break code) }
|
||||||
isBreak := (raw AND $80) <> 0;
|
isBreak := (raw AND $80) <> 0;
|
||||||
@@ -71,26 +72,36 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure keyboardIRQ;
|
||||||
|
var
|
||||||
|
code: uint8;
|
||||||
|
begin
|
||||||
|
if (inb($64) and $21) <> 1 then exit;
|
||||||
|
code := inb($60);
|
||||||
|
if enabled then callback(code);
|
||||||
|
end;
|
||||||
|
|
||||||
function load(ptr : void) : boolean;
|
function load(ptr : void) : boolean;
|
||||||
begin
|
begin
|
||||||
arch.x86.isr.ps2keyboard.register();
|
enabled := true;
|
||||||
arch.x86.isr.ps2keyboard.hook(uint32(@callback));
|
arch.platform.interrupts.registerIRQ(33, @keyboardIRQ);
|
||||||
|
arch.common.legacyirq.enableLine(1);
|
||||||
io.syslog.logln('PS/2 KEYBOARD', 'LOADED.');
|
io.syslog.logln('PS/2 KEYBOARD', 'LOADED.');
|
||||||
load := true;
|
load := true;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure disable;
|
procedure disable;
|
||||||
begin
|
begin
|
||||||
arch.x86.isr.ps2keyboard.unhook(uint32(@callback));
|
enabled := false;
|
||||||
io.syslog.logln('PS/2 KEYBOARD', 'Disabled (driver.bus.usb driver.hid.keyboard active).');
|
io.syslog.logln('PS/2 KEYBOARD', 'Disabled (driver.bus.usb driver.hid.keyboard active).');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure init_layout(keyboard_layout : array of TKeyInfo);
|
procedure init_layout(const keyboard_layout : array of TKeyInfo);
|
||||||
var
|
var
|
||||||
devid : TDeviceIdentifier;
|
devid : TDeviceIdentifier;
|
||||||
begin
|
begin
|
||||||
io.syslog.logln('PS/2 KEYBOARD', 'INIT BEGIN.');
|
io.syslog.logln('PS/2 KEYBOARD', 'INIT BEGIN.');
|
||||||
if keyboard_layout[1].key_code = 0 then lang_USA();
|
if (High(keyboard_layout) < 1) or (keyboard_layout[1].key_code = 0) then lang_USA();
|
||||||
devid.bus := biUnknown;
|
devid.bus := biUnknown;
|
||||||
devid.id0 := 0;
|
devid.id0 := 0;
|
||||||
devid.id1 := 0;
|
devid.id1 := 0;
|
||||||
@@ -354,7 +365,4 @@ begin
|
|||||||
key_matrix_shift[53].key_code := $3F;
|
key_matrix_shift[53].key_code := $3F;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
initialization
|
|
||||||
boot.mgr.registerBoot('driver.hid.ps2.keyboard', @init, 'PS/2 Keyboard Driver', BOOT_MGR_BARRIER_DEVICE);
|
|
||||||
|
|
||||||
end.
|
end.
|
||||||
@@ -11,15 +11,14 @@ unit driver.hid.ps2.mouse;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
boot.mgr,
|
|
||||||
debug.tracer,
|
debug.tracer,
|
||||||
driver.hid.mouse,
|
driver.hid.mouse,
|
||||||
io.syslog,
|
io.syslog,
|
||||||
driver.video,
|
driver.video,
|
||||||
core.util, arch.x86.util,
|
core.util, arch.platform.cpu,
|
||||||
memory.heap,
|
memory.heap,
|
||||||
core.strings,
|
core.strings,
|
||||||
arch.x86.isr.mgr,
|
arch.platform.interrupts, arch.common.legacyirq,
|
||||||
driver.mgr;
|
driver.mgr;
|
||||||
|
|
||||||
type
|
type
|
||||||
@@ -114,6 +113,7 @@ end;
|
|||||||
procedure main();
|
procedure main();
|
||||||
var
|
var
|
||||||
i : integer;
|
i : integer;
|
||||||
|
bytesRead: uint32;
|
||||||
b : byte;
|
b : byte;
|
||||||
packet : TMousePacket;
|
packet : TMousePacket;
|
||||||
x, y, f : byte;
|
x, y, f : byte;
|
||||||
@@ -124,7 +124,9 @@ begin
|
|||||||
When it returns true, data is ready — read it directly with inb($60).
|
When it returns true, data is ready — read it directly with inb($60).
|
||||||
Do NOT call mouse_read here: it uses mouse_wait_long (100k iterations)
|
Do NOT call mouse_read here: it uses mouse_wait_long (100k iterations)
|
||||||
and would spin-block the ISR if the next packet byte hasn't arrived yet. }
|
and would spin-block the ISR if the next packet byte hasn't arrived yet. }
|
||||||
while mouse_wait(0) do begin
|
bytesRead := 0;
|
||||||
|
while (bytesRead < 32) and ((inb($64) and $21) = $21) do begin
|
||||||
|
inc(bytesRead);
|
||||||
b := inb($60);
|
b := inb($60);
|
||||||
if Cycle = 0 then begin
|
if Cycle = 0 then begin
|
||||||
if (b AND $08) = $08 then begin
|
if (b AND $08) = $08 then begin
|
||||||
@@ -213,8 +215,10 @@ var
|
|||||||
status : uint8;
|
status : uint8;
|
||||||
devid_byte : uint8;
|
devid_byte : uint8;
|
||||||
tmp : uint8;
|
tmp : uint8;
|
||||||
|
irqFlags: PtrUInt;
|
||||||
begin
|
begin
|
||||||
push_trace('driver.hid.ps2.mouse.load');
|
push_trace('driver.hid.ps2.mouse.load');
|
||||||
|
irqFlags := arch.platform.cpu.lock;
|
||||||
|
|
||||||
{ Disable both PS/2 ports while configuring }
|
{ Disable both PS/2 ports while configuring }
|
||||||
mouse_wait_long(1);
|
mouse_wait_long(1);
|
||||||
@@ -290,10 +294,12 @@ begin
|
|||||||
|
|
||||||
mouse_write($F4);
|
mouse_write($F4);
|
||||||
mouse_read();
|
mouse_read();
|
||||||
arch.x86.isr.mgr.registerISR(44, @Main);
|
arch.platform.interrupts.registerIRQ(44, @Main);
|
||||||
|
arch.common.legacyirq.enableLine(12);
|
||||||
io.syslog.logln('PS/2 MOUSE', 'LOADED.');
|
io.syslog.logln('PS/2 MOUSE', 'LOADED.');
|
||||||
io.syslog.log('PS/2 MOUSE', 'Memory: ');
|
io.syslog.log('PS/2 MOUSE', 'Memory: ');
|
||||||
io.syslog.writehexln(uint32(@current));
|
io.syslog.writehexln(PtrUInt(@current));
|
||||||
|
arch.platform.cpu.unlock(irqFlags);
|
||||||
load := true;
|
load := true;
|
||||||
pop_trace;
|
pop_trace;
|
||||||
end;
|
end;
|
||||||
@@ -320,7 +326,4 @@ begin
|
|||||||
pop_trace;
|
pop_trace;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
initialization
|
|
||||||
boot.mgr.registerBoot('driver.hid.ps2.mouse', @init, 'PS/2 Mouse Driver', BOOT_MGR_BARRIER_DEVICE);
|
|
||||||
|
|
||||||
end.
|
end.
|
||||||
@@ -17,9 +17,8 @@ unit driver.video.bga;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
boot.mgr,
|
core.util, arch.platform.cpu, io.syslog, debug.tracer, driver.video.gpu, driver.bus.pci, driver.types, driver.mgr,
|
||||||
core.util, arch.x86.util, io.syslog, debug.tracer, driver.video.gpu, driver.bus.pci, driver.types, driver.mgr,
|
arch.platform.memory, memory.heap;
|
||||||
arch.x86.memory.virtual, memory.heap;
|
|
||||||
|
|
||||||
procedure init;
|
procedure init;
|
||||||
|
|
||||||
@@ -58,6 +57,7 @@ const
|
|||||||
var
|
var
|
||||||
BGAPresent : boolean = false;
|
BGAPresent : boolean = false;
|
||||||
BGAFramebuffer: uint32 = 0;
|
BGAFramebuffer: uint32 = 0;
|
||||||
|
BGAMemoryBytes: uint64 = 0;
|
||||||
BGAPCIBus : uint8 = 0;
|
BGAPCIBus : uint8 = 0;
|
||||||
BGAPCISlot : uint8 = 0;
|
BGAPCISlot : uint8 = 0;
|
||||||
BGAPCIFunc : uint8 = 0;
|
BGAPCIFunc : uint8 = 0;
|
||||||
@@ -76,22 +76,6 @@ begin
|
|||||||
bgaReadReg := inw(BGA_PORT_DATA);
|
bgaReadReg := inw(BGA_PORT_DATA);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ Map the framebuffer physical memory pages so we can access it }
|
|
||||||
procedure mapFramebuffer(address, width, height : uint32; bpp : uint8);
|
|
||||||
var
|
|
||||||
framebufferSize : uint32;
|
|
||||||
lowerPage, upperPage, page : uint32;
|
|
||||||
begin
|
|
||||||
push_trace('driver.video.bga.mapFramebuffer');
|
|
||||||
framebufferSize := (width * height * uint32(bpp)) div 8;
|
|
||||||
lowerPage := (address SHR 22) - 1;
|
|
||||||
upperPage := ((address + framebufferSize) SHR 22) + 1;
|
|
||||||
for page := lowerPage to upperPage do begin
|
|
||||||
kpalloc(page SHL 22);
|
|
||||||
end;
|
|
||||||
pop_trace;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{ Drivermanagement load callback: called when driver.bus.pci finds a matching device }
|
{ Drivermanagement load callback: called when driver.bus.pci finds a matching device }
|
||||||
function load(ptr : void) : boolean;
|
function load(ptr : void) : boolean;
|
||||||
var
|
var
|
||||||
@@ -141,6 +125,18 @@ begin
|
|||||||
id := bgaReadReg(BGA_REG_ID);
|
id := bgaReadReg(BGA_REG_ID);
|
||||||
if (id >= BGA_ID_MIN) and (id <= BGA_ID_MAX) then begin
|
if (id >= BGA_ID_MIN) and (id <= BGA_ID_MAX) then begin
|
||||||
BGAPresent := true;
|
BGAPresent := true;
|
||||||
|
{ PCI's legacy device_id field contains the vendor ID. VirtualBox's
|
||||||
|
BGA data port returns VRAM bytes on a 32-bit read; index $0A is its
|
||||||
|
monitor-count interface, not the Bochs 64 KiB memory register.
|
||||||
|
See VirtualBox DevVGA.cpp, vgaIoPortReadVbeData. }
|
||||||
|
if (dev^.device_id = $80EE) or (dev^.device_id = $15AD) then
|
||||||
|
BGAMemoryBytes := inl(BGA_PORT_DATA)
|
||||||
|
else if id >= $B0C5 then
|
||||||
|
BGAMemoryBytes := uint64(bgaReadReg($0A)) * 65536
|
||||||
|
else if id = $B0C4 then
|
||||||
|
BGAMemoryBytes := 8 * 1024 * 1024
|
||||||
|
else
|
||||||
|
BGAMemoryBytes := 4 * 1024 * 1024;
|
||||||
io.syslog.log('BGA', 'Detected BGA version $');
|
io.syslog.log('BGA', 'Detected BGA version $');
|
||||||
io.syslog.writehexln(id);
|
io.syslog.writehexln(id);
|
||||||
|
|
||||||
@@ -164,6 +160,10 @@ end;
|
|||||||
{ GPU framework: setMode callback }
|
{ GPU framework: setMode callback }
|
||||||
function bgaSetMode(width, height : uint32; bpp : uint8;
|
function bgaSetMode(width, height : uint32; bpp : uint8;
|
||||||
var info : TGPUModeInfo) : boolean;
|
var info : TGPUModeInfo) : boolean;
|
||||||
|
var
|
||||||
|
mapped: pointer;
|
||||||
|
bytes: uint64;
|
||||||
|
oldWidth, oldHeight, oldBPP, oldEnable: uint16;
|
||||||
begin
|
begin
|
||||||
push_trace('driver.video.bga.bgaSetMode');
|
push_trace('driver.video.bga.bgaSetMode');
|
||||||
bgaSetMode := false;
|
bgaSetMode := false;
|
||||||
@@ -173,6 +173,18 @@ begin
|
|||||||
exit;
|
exit;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
if (width = 0) or (height = 0) or (width > 65535) or
|
||||||
|
(height > 65535) or (bpp <> 32) then exit;
|
||||||
|
bytes := uint64(width) * height * 4;
|
||||||
|
if (BGAMemoryBytes = 0) or (bytes > BGAMemoryBytes) or
|
||||||
|
(bytes > High(SizeUInt)) then exit;
|
||||||
|
mapped := arch.platform.memory.mapDevice(BGAFramebuffer, SizeUInt(bytes));
|
||||||
|
if mapped = nil then exit;
|
||||||
|
oldWidth := bgaReadReg(BGA_REG_XRES);
|
||||||
|
oldHeight := bgaReadReg(BGA_REG_YRES);
|
||||||
|
oldBPP := bgaReadReg(BGA_REG_BPP);
|
||||||
|
oldEnable := bgaReadReg(BGA_REG_ENABLE);
|
||||||
|
|
||||||
{ Disable the display while changing mode }
|
{ Disable the display while changing mode }
|
||||||
bgaWriteReg(BGA_REG_ENABLE, BGA_DISABLED);
|
bgaWriteReg(BGA_REG_ENABLE, BGA_DISABLED);
|
||||||
|
|
||||||
@@ -191,20 +203,28 @@ begin
|
|||||||
bgaWriteReg(BGA_REG_ENABLE, BGA_ENABLED or BGA_LFB_ENABLED);
|
bgaWriteReg(BGA_REG_ENABLE, BGA_ENABLED or BGA_LFB_ENABLED);
|
||||||
|
|
||||||
{ Verify mode was set }
|
{ Verify mode was set }
|
||||||
if bgaReadReg(BGA_REG_XRES) <> (width and $FFFF) then begin
|
if (bgaReadReg(BGA_REG_XRES) <> width) or
|
||||||
|
(bgaReadReg(BGA_REG_YRES) <> height) or
|
||||||
|
(bgaReadReg(BGA_REG_BPP) <> bpp) then begin
|
||||||
|
bgaWriteReg(BGA_REG_ENABLE, BGA_DISABLED);
|
||||||
|
bgaWriteReg(BGA_REG_XRES, oldWidth);
|
||||||
|
bgaWriteReg(BGA_REG_YRES, oldHeight);
|
||||||
|
bgaWriteReg(BGA_REG_BPP, oldBPP);
|
||||||
|
bgaWriteReg(BGA_REG_VIRT_WIDTH, oldWidth);
|
||||||
|
bgaWriteReg(BGA_REG_VIRT_HEIGHT, oldHeight);
|
||||||
|
bgaWriteReg(BGA_REG_ENABLE, oldEnable);
|
||||||
io.syslog.logln('BGA', 'setMode: XRES verify failed.');
|
io.syslog.logln('BGA', 'setMode: XRES verify failed.');
|
||||||
pop_trace;
|
pop_trace;
|
||||||
exit;
|
exit;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ Map the framebuffer pages }
|
|
||||||
mapFramebuffer(BGAFramebuffer, width, height, bpp);
|
|
||||||
|
|
||||||
{ Fill in the mode info for the caller }
|
{ Fill in the mode info for the caller }
|
||||||
info.Width := width;
|
info.Width := width;
|
||||||
info.Height := height;
|
info.Height := height;
|
||||||
info.BPP := bpp;
|
info.BPP := bpp;
|
||||||
info.Framebuffer := BGAFramebuffer;
|
info.Framebuffer := PtrUInt(mapped);
|
||||||
info.Pitch := (width * uint32(bpp)) div 8;
|
info.Pitch := (width * uint32(bpp)) div 8;
|
||||||
|
|
||||||
io.syslog.log('BGA', 'Mode set: ');
|
io.syslog.log('BGA', 'Mode set: ');
|
||||||
@@ -247,7 +267,5 @@ begin
|
|||||||
pop_trace;
|
pop_trace;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
initialization
|
|
||||||
boot.mgr.registerBoot('driver.video.bga', @init, 'BGA Display Driver Initialization', 'driver.video');
|
|
||||||
|
|
||||||
end.
|
end.
|
||||||
File diff suppressed because it is too large.
Load diff
@@ -22,17 +22,26 @@ unit driver.video.doublebuffer;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
memory.heap, debug.tracer, driver.video.types, driver.io.serial, core.util, arch.x86.util;
|
memory.heap, debug.tracer, driver.video.types, driver.io.serial, core.util, arch.platform.cpu;
|
||||||
|
|
||||||
//Init the driver, and register with the driver.video interface in a state ready for execution.
|
//Init the driver, and register with the driver.video interface in a state ready for execution.
|
||||||
procedure init(Register : FRegisterDriver);
|
procedure init(Register : FRegisterDriver);
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
function allocateBackBuffer(Width : uint32; Height : uint32; BitsPerPixel : uint8) : uint64;
|
function allocateBackBuffer(Width : uint32; Height : uint32; BitsPerPixel : uint8) : PtrUInt;
|
||||||
|
var
|
||||||
|
bytes: uint64;
|
||||||
begin
|
begin
|
||||||
|
allocateBackBuffer := 0;
|
||||||
|
if (Width = 0) or (Height = 0) or (BitsPerPixel = 0) or
|
||||||
|
(BitsPerPixel mod 8 <> 0) then exit;
|
||||||
|
bytes := uint64(Width) * (BitsPerPixel div 8);
|
||||||
|
if bytes > High(uint32) then exit;
|
||||||
|
bytes := bytes * Height;
|
||||||
|
if bytes > High(SizeUInt) then exit;
|
||||||
debug.tracer.push_trace('driver.video.doublebuffer.allocateBackBuffer.enter');
|
debug.tracer.push_trace('driver.video.doublebuffer.allocateBackBuffer.enter');
|
||||||
allocateBackBuffer:= uint64(klalloc((Width * Height * BitsPerPixel) div 8));
|
allocateBackBuffer := PtrUInt(klalloc(SizeUInt(bytes)));
|
||||||
debug.tracer.push_trace('driver.video.doublebuffer.allocateBackBuffer.exit');
|
debug.tracer.push_trace('driver.video.doublebuffer.allocateBackBuffer.exit');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@@ -44,6 +53,7 @@ begin
|
|||||||
if (VInterface^.BackBuffer.Location <> 0) then begin
|
if (VInterface^.BackBuffer.Location <> 0) then begin
|
||||||
VInterface^.BackBuffer.Width:= Width;
|
VInterface^.BackBuffer.Width:= Width;
|
||||||
VInterface^.BackBuffer.Height:= Height;
|
VInterface^.BackBuffer.Height:= Height;
|
||||||
|
VInterface^.BackBuffer.Pitch := Width * (BitsPerPixel div 8);
|
||||||
VInterface^.BackBuffer.BitsPerPixel:= BitsPerPixel;
|
VInterface^.BackBuffer.BitsPerPixel:= BitsPerPixel;
|
||||||
VInterface^.BackBuffer.Initialized:= True;
|
VInterface^.BackBuffer.Initialized:= True;
|
||||||
end;
|
end;
|
||||||
@@ -53,27 +63,18 @@ end;
|
|||||||
|
|
||||||
procedure Flush(FrontBuffer : PVideoBuffer; BackBuffer : PVideoBuffer);
|
procedure Flush(FrontBuffer : PVideoBuffer; BackBuffer : PVideoBuffer);
|
||||||
var
|
var
|
||||||
idx : uint32;
|
row, bytes : uint32;
|
||||||
Back,Front : uint32;
|
|
||||||
BufferSize : uint32;
|
|
||||||
|
|
||||||
const
|
|
||||||
//COPY_WIDTH = 64; //Use this for 64bit copies
|
|
||||||
COPY_WIDTH = 128; //Use this for SSE copies
|
|
||||||
|
|
||||||
begin
|
begin
|
||||||
//debug.tracer.push_trace('driver.video.doublebuffer.Flush.enter');
|
if not (FrontBuffer^.Initialized and BackBuffer^.Initialized) then exit;
|
||||||
if not(BackBuffer^.Initialized) then exit;
|
if (BackBuffer^.Width > FrontBuffer^.Width) or
|
||||||
if ((FrontBuffer^.Width > BackBuffer^.Width) or (FrontBuffer^.Height > BackBuffer^.Height)) then exit;
|
(BackBuffer^.Height > FrontBuffer^.Height) or
|
||||||
Back:= BackBuffer^.Location;
|
(BackBuffer^.BitsPerPixel <> FrontBuffer^.BitsPerPixel) then exit;
|
||||||
Front:= FrontBuffer^.Location;
|
bytes := BackBuffer^.Pitch;
|
||||||
BufferSize:= ( ( BackBuffer^.Width * BackBuffer^.Height * BackBuffer^.BitsPerPixel) div COPY_WIDTH ) - 1;
|
if (bytes = 0) or (bytes > FrontBuffer^.Pitch) or
|
||||||
for idx:=0 to BufferSize do begin
|
(BackBuffer^.Height = 0) then exit;
|
||||||
//Front[idx]:= Back[idx];
|
for row := 0 to BackBuffer^.Height - 1 do
|
||||||
// -- TODO: Get SSE working here for 128bit copies --
|
memcpy(BackBuffer^.Location + SizeUInt(row) * bytes,
|
||||||
__SSE_128_memcpy(Back + (idx * 16), Front + (idx * 16));
|
FrontBuffer^.Location + SizeUInt(row) * FrontBuffer^.Pitch, bytes);
|
||||||
end;
|
|
||||||
//debug.tracer.push_trace('driver.video.doublebuffer.Flush.exit');
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function enable(VideoInterface : PVideoInterface) : boolean;
|
function enable(VideoInterface : PVideoInterface) : boolean;
|
||||||
@@ -96,4 +97,4 @@ begin
|
|||||||
debug.tracer.push_trace('driver.video.doublebuffer.init.exit');
|
debug.tracer.push_trace('driver.video.doublebuffer.init.exit');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
@@ -15,8 +15,7 @@ unit driver.video.gpu;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
boot.mgr,
|
core.util, arch.platform.cpu, io.syslog, debug.tracer, core.strings;
|
||||||
core.util, arch.x86.util, io.syslog, debug.tracer, core.strings;
|
|
||||||
|
|
||||||
const
|
const
|
||||||
GPU_MAX_DRIVERS = 8;
|
GPU_MAX_DRIVERS = 8;
|
||||||
@@ -28,7 +27,7 @@ type
|
|||||||
Width : uint32;
|
Width : uint32;
|
||||||
Height : uint32;
|
Height : uint32;
|
||||||
BPP : uint8;
|
BPP : uint8;
|
||||||
Framebuffer : uint32; { physical address of linear framebuffer }
|
Framebuffer : PtrUInt; { mapped address of linear framebuffer }
|
||||||
Pitch : uint32; { bytes per scanline }
|
Pitch : uint32; { bytes per scanline }
|
||||||
end;
|
end;
|
||||||
PGPUModeInfo = ^TGPUModeInfo;
|
PGPUModeInfo = ^TGPUModeInfo;
|
||||||
@@ -173,6 +172,7 @@ procedure fireModeChangeCallbacks(const info : TGPUModeInfo);
|
|||||||
var
|
var
|
||||||
i : uint8;
|
i : uint8;
|
||||||
begin
|
begin
|
||||||
|
if CallbackCount = 0 then exit;
|
||||||
for i := 0 to CallbackCount - 1 do begin
|
for i := 0 to CallbackCount - 1 do begin
|
||||||
if Callbacks[i] <> nil then
|
if Callbacks[i] <> nil then
|
||||||
Callbacks[i](info);
|
Callbacks[i](info);
|
||||||
@@ -185,6 +185,7 @@ var
|
|||||||
begin
|
begin
|
||||||
push_trace('driver.video.gpu.setMode');
|
push_trace('driver.video.gpu.setMode');
|
||||||
setMode := false;
|
setMode := false;
|
||||||
|
if DriverCount = 0 then exit;
|
||||||
|
|
||||||
for i := 0 to DriverCount - 1 do begin
|
for i := 0 to DriverCount - 1 do begin
|
||||||
if Drivers[i].Available and (Drivers[i].SetMode <> nil) then begin
|
if Drivers[i].Available and (Drivers[i].SetMode <> nil) then begin
|
||||||
@@ -224,7 +225,4 @@ begin
|
|||||||
activeDriverName := 'none';
|
activeDriverName := 'none';
|
||||||
end;
|
end;
|
||||||
|
|
||||||
initialization
|
|
||||||
boot.mgr.registerBoot('driver.video.gpu', @init, 'GPU Driver Framework Initialization', 'driver.mgr');
|
|
||||||
|
|
||||||
end.
|
end.
|
||||||
File diff suppressed because it is too large.
Load diff
@@ -22,8 +22,8 @@ unit driver.video;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
boot.mgr, io.syslog,
|
io.syslog,
|
||||||
memory.heap, debug.tracer, core.gfx.color, driver.video.types, core.ds.hashmap, core.util, arch.x86.util, core.gfx.texture, driver.video.gpu, core.gfx.fonts;
|
memory.heap, debug.tracer, core.gfx.color, driver.video.types, core.ds.hashmap, core.util, arch.platform.cpu, core.gfx.texture, driver.video.gpu, core.gfx.fonts;
|
||||||
|
|
||||||
procedure init();
|
procedure init();
|
||||||
procedure DrawPixel(X : uint32; Y : uint32; Pixel : TRGB32);
|
procedure DrawPixel(X : uint32; Y : uint32; Pixel : TRGB32);
|
||||||
@@ -31,7 +31,7 @@ procedure DrawLine(x1,y1,x2,y2 : uint32; thickness : uint32; Color : TRGB32);
|
|||||||
procedure DrawRect(x1,y1,x2,y2 : uint32; line_thickness : uint32; Color : TRGB32);
|
procedure DrawRect(x1,y1,x2,y2 : uint32; line_thickness : uint32; Color : TRGB32);
|
||||||
procedure FillRect(x1,y1,x2,y2 : uint32; line_thickness : uint32; Line_Color : TRGB32; Fill_Color : TRGB32);
|
procedure FillRect(x1,y1,x2,y2 : uint32; line_thickness : uint32; Line_Color : TRGB32; Fill_Color : TRGB32);
|
||||||
procedure Flush();
|
procedure Flush();
|
||||||
procedure reinit(fb_addr, width, height, pitch : uint32; bpp : uint8);
|
procedure reinit(fb_addr : PtrUInt; width, height, pitch : uint32; bpp : uint8);
|
||||||
|
|
||||||
function register(DriverIdentifier : pchar; EnableCallback : FEnableDriver) : boolean;
|
function register(DriverIdentifier : pchar; EnableCallback : FEnableDriver) : boolean;
|
||||||
function enable(DriverIdentifier : pchar) : boolean;
|
function enable(DriverIdentifier : pchar) : boolean;
|
||||||
@@ -42,12 +42,12 @@ function frontBufferBpp : uint8;
|
|||||||
function backBufferWidth : uint32;
|
function backBufferWidth : uint32;
|
||||||
function backBufferHeight : uint32;
|
function backBufferHeight : uint32;
|
||||||
function backBufferBpp : uint8;
|
function backBufferBpp : uint8;
|
||||||
function backBufferLocation : uint32;
|
function backBufferLocation : PtrUInt;
|
||||||
function frontBufferLocation : uint32;
|
function frontBufferLocation : PtrUInt;
|
||||||
|
|
||||||
Procedure basicFDrawTexture(Buffer : PVideoBuffer; X : uint32; Y : uint32; Texture : PTexture);
|
Procedure basicFDrawTexture(Buffer : PVideoBuffer; X : uint32; Y : uint32; Texture : PTexture);
|
||||||
|
|
||||||
{ Text drawing — renders 8x16 bitmap font glyphs directly to the
|
{ Text drawing — renders 8x16 bitmap font glyphs directly to the
|
||||||
framebuffer via DrawPixel. Useful for panic screens and other
|
framebuffer via DrawPixel. Useful for panic screens and other
|
||||||
contexts where LVGL is unavailable. }
|
contexts where LVGL is unavailable. }
|
||||||
function DrawChar(X, Y : uint32; C : char; Color : TRGB32) : uint32;
|
function DrawChar(X, Y : uint32; C : char; Color : TRGB32) : uint32;
|
||||||
@@ -58,8 +58,9 @@ function DrawInt(X, Y : uint32; Value : uint32; Color : TRGB32) : uint32;
|
|||||||
implementation
|
implementation
|
||||||
|
|
||||||
uses
|
uses
|
||||||
|
driver.hid.mouse,
|
||||||
driver.video.vesa8, driver.video.vesa16, driver.video.vesa24, driver.video.vesa32,
|
driver.video.vesa8, driver.video.vesa16, driver.video.vesa24, driver.video.vesa32,
|
||||||
driver.video.lvgl, driver.video.doublebuffer, driver.video.vesa;
|
driver.video.doublebuffer;
|
||||||
|
|
||||||
Procedure dummyFDrawPixel(Buffer : PVideoBuffer; X : uint32; Y : uint32; Pixel : TRGB32);
|
Procedure dummyFDrawPixel(Buffer : PVideoBuffer; X : uint32; Y : uint32; Pixel : TRGB32);
|
||||||
begin
|
begin
|
||||||
@@ -206,7 +207,7 @@ var
|
|||||||
DriverMap : PHashMap;
|
DriverMap : PHashMap;
|
||||||
|
|
||||||
{ ============================================================
|
{ ============================================================
|
||||||
GPU mode-change callback — reinits front/back buffers
|
GPU mode-change callback — reinits front/back buffers
|
||||||
============================================================ }
|
============================================================ }
|
||||||
procedure videoModeChanged(const info : TGPUModeInfo);
|
procedure videoModeChanged(const info : TGPUModeInfo);
|
||||||
begin
|
begin
|
||||||
@@ -221,6 +222,7 @@ var
|
|||||||
begin
|
begin
|
||||||
debug.tracer.push_trace('driver.video.init.enter');
|
debug.tracer.push_trace('driver.video.init.enter');
|
||||||
io.syslog.logln('VIDEO', 'Initializing Base Video Driver.');
|
io.syslog.logln('VIDEO', 'Initializing Base Video Driver.');
|
||||||
|
driver.hid.mouse.setBounds(0, 0);
|
||||||
//Ensure the frontbuffer is empty & nil, ready for initialization by a driver.
|
//Ensure the frontbuffer is empty & nil, ready for initialization by a driver.
|
||||||
VideoInterface.FrontBuffer.Initialized:= false;
|
VideoInterface.FrontBuffer.Initialized:= false;
|
||||||
VideoInterface.FrontBuffer.Width:= 0;
|
VideoInterface.FrontBuffer.Width:= 0;
|
||||||
@@ -255,23 +257,6 @@ begin
|
|||||||
debug.tracer.push_trace('driver.video.init.exit');
|
debug.tracer.push_trace('driver.video.init.exit');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure lateInit();
|
|
||||||
begin
|
|
||||||
driver.video.vesa.init(@driver.video.register);
|
|
||||||
driver.video.doublebuffer.init(@driver.video.register);
|
|
||||||
|
|
||||||
io.syslog.logln('VIDEO', 'VESA Enable.');
|
|
||||||
driver.video.enable('VESA');
|
|
||||||
|
|
||||||
io.syslog.logln('VIDEO', 'Double Buffer Enable.');
|
|
||||||
driver.video.enable('BASIC_DOUBLE_BUFFER');
|
|
||||||
|
|
||||||
{ Initialize LVGL early so the boot.splash screen can use it }
|
|
||||||
io.syslog.logln('VIDEO', 'LVGL: INIT BEGIN.');
|
|
||||||
lvgl_init(driver.video.frontBufferWidth, driver.video.frontBufferHeight);
|
|
||||||
io.syslog.logln('VIDEO', 'LVGL: INIT END.');
|
|
||||||
end;
|
|
||||||
|
|
||||||
function register(DriverIdentifier : pchar; EnableCallback : FEnableDriver) : boolean;
|
function register(DriverIdentifier : pchar; EnableCallback : FEnableDriver) : boolean;
|
||||||
var
|
var
|
||||||
Value : Void;
|
Value : Void;
|
||||||
@@ -297,6 +282,7 @@ begin
|
|||||||
Value:= core.ds.hashmap.get(DriverMap, DriverIdentifier);
|
Value:= core.ds.hashmap.get(DriverMap, DriverIdentifier);
|
||||||
if (Value <> nil) then begin
|
if (Value <> nil) then begin
|
||||||
enable:= FEnableDriver(Value)(@VideoInterface);
|
enable:= FEnableDriver(Value)(@VideoInterface);
|
||||||
|
driver.hid.mouse.setBounds(frontBufferWidth, frontBufferHeight);
|
||||||
end;
|
end;
|
||||||
debug.tracer.push_trace('driver.video.enable.exit');
|
debug.tracer.push_trace('driver.video.enable.exit');
|
||||||
end;
|
end;
|
||||||
@@ -304,7 +290,9 @@ end;
|
|||||||
procedure DrawPixel(X : uint32; Y : uint32; Pixel : TRGB32);
|
procedure DrawPixel(X : uint32; Y : uint32; Pixel : TRGB32);
|
||||||
begin
|
begin
|
||||||
//debug.tracer.push_trace('driver.video.DrawPixel.enter');
|
//debug.tracer.push_trace('driver.video.DrawPixel.enter');
|
||||||
VideoInterface.DrawRoutines.DrawPixel(VideoInterface.DefaultBuffer, X, Y, Pixel);
|
if (X < VideoInterface.DefaultBuffer^.Width) and
|
||||||
|
(Y < VideoInterface.DefaultBuffer^.Height) then
|
||||||
|
VideoInterface.DrawRoutines.DrawPixel(VideoInterface.DefaultBuffer, X, Y, Pixel);
|
||||||
//debug.tracer.push_trace('driver.video.DrawPixel.exit');
|
//debug.tracer.push_trace('driver.video.DrawPixel.exit');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@@ -360,18 +348,18 @@ begin
|
|||||||
backBufferBpp:= VideoInterface.BackBuffer.BitsPerPixel;
|
backBufferBpp:= VideoInterface.BackBuffer.BitsPerPixel;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function backBufferLocation : uint32;
|
function backBufferLocation : PtrUInt;
|
||||||
begin
|
begin
|
||||||
backBufferLocation:= VideoInterface.BackBuffer.Location;
|
backBufferLocation:= VideoInterface.BackBuffer.Location;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function frontBufferLocation : uint32;
|
function frontBufferLocation : PtrUInt;
|
||||||
begin
|
begin
|
||||||
frontBufferLocation:= VideoInterface.FrontBuffer.Location;
|
frontBufferLocation:= VideoInterface.FrontBuffer.Location;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ ============================================================
|
{ ============================================================
|
||||||
Text drawing — 8x16 bitmap font via Std_Font
|
Text drawing — 8x16 bitmap font via Std_Font
|
||||||
============================================================ }
|
============================================================ }
|
||||||
|
|
||||||
const
|
const
|
||||||
@@ -445,7 +433,7 @@ begin
|
|||||||
DrawInt := DrawString(X, Y, @buf[0], Color);
|
DrawInt := DrawString(X, Y, @buf[0], Color);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure reinit(fb_addr, width, height, pitch : uint32; bpp : uint8);
|
procedure reinit(fb_addr : PtrUInt; width, height, pitch : uint32; bpp : uint8);
|
||||||
begin
|
begin
|
||||||
debug.tracer.push_trace('driver.video.reinit.enter');
|
debug.tracer.push_trace('driver.video.reinit.enter');
|
||||||
{ Free old back buffer if allocated }
|
{ Free old back buffer if allocated }
|
||||||
@@ -468,8 +456,10 @@ begin
|
|||||||
|
|
||||||
{ Set front buffer directly from GPU mode info }
|
{ Set front buffer directly from GPU mode info }
|
||||||
VideoInterface.FrontBuffer.Location := fb_addr;
|
VideoInterface.FrontBuffer.Location := fb_addr;
|
||||||
|
VideoInterface.FrontBuffer.Pitch := pitch;
|
||||||
VideoInterface.FrontBuffer.Width := width;
|
VideoInterface.FrontBuffer.Width := width;
|
||||||
VideoInterface.FrontBuffer.Height := height;
|
VideoInterface.FrontBuffer.Height := height;
|
||||||
|
driver.hid.mouse.setBounds(width, height);
|
||||||
VideoInterface.FrontBuffer.BitsPerPixel := bpp;
|
VideoInterface.FrontBuffer.BitsPerPixel := bpp;
|
||||||
if fb_addr <> 0 then
|
if fb_addr <> 0 then
|
||||||
VideoInterface.FrontBuffer.Initialized := true;
|
VideoInterface.FrontBuffer.Initialized := true;
|
||||||
@@ -488,8 +478,4 @@ begin
|
|||||||
debug.tracer.push_trace('driver.video.reinit.exit');
|
debug.tracer.push_trace('driver.video.reinit.exit');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
initialization
|
|
||||||
boot.mgr.registerBoot('driver.video', @init, 'Video Driver Initialization', 'driver.video.gpu');
|
|
||||||
boot.mgr.registerBoot('driver.video_late', @lateInit, 'Video Driver Late Initialization', 'driver.video.*');
|
|
||||||
|
|
||||||
end.
|
end.
|
||||||
Loaded 20 of 28 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user