summaryrefslogtreecommitdiff
path: root/src/framebuffer.c
diff options
context:
space:
mode:
author3gg <3gg@shellblade.net>2025-10-13 20:44:06 -0700
committer3gg <3gg@shellblade.net>2025-10-13 20:44:06 -0700
commit338bd46fb6dbcb8271102ddb6b896a335eb909dc (patch)
treedafa50f732804df571521751c619de57d12299aa /src/framebuffer.c
parent079cd940e727c1705e9f1b30706b9531d5aedda6 (diff)
Finish framebuffer initializationHEADmain
Diffstat (limited to 'src/framebuffer.c')
-rw-r--r--src/framebuffer.c35
1 files changed, 23 insertions, 12 deletions
diff --git a/src/framebuffer.c b/src/framebuffer.c
index a90bcaa..e3303b6 100644
--- a/src/framebuffer.c
+++ b/src/framebuffer.c
@@ -4,27 +4,38 @@
4 4
5#include <stdint.h> 5#include <stdint.h>
6 6
7#define WIDTH 640 7#define WIDTH 640
8#define HEIGHT 480 8#define HEIGHT 480
9#define DEPTH 32 9#define DEPTH 32
10#define ALIGNMENT 16 // Framebuffer byte alignment.
10 11
11bool framebuffer_init(uint32_t* error) { 12bool framebuffer_init(uint32_t* error) {
12 volatile const Mail* mail; 13 volatile __attribute__((aligned(MAIL_ALIGN))) uint32_t ConfigureScreen[20] = {
13 14 80, // Size in bytes, aligned to MAIL_ALIGN.
14 volatile __attribute__((aligned(MAIL_ALIGN))) uint32_t InitFramebuffer[] = {
15 80, // Size in bytes aligned to MAIL_ALIGN(16).
16 MAILBOX_REQUEST, 15 MAILBOX_REQUEST,
17 TAG_FRAMEBUFFER_SET_PHYSICAL_SCREEN_SIZE, 8, MAILBOX_REQUEST, WIDTH, HEIGHT, 16 TAG_FRAMEBUFFER_SET_PHYSICAL_SCREEN_SIZE, 8, MAILBOX_REQUEST, WIDTH, HEIGHT,
18 TAG_FRAMEBUFFER_SET_VIRTUAL_SCREEN_SIZE, 8, MAILBOX_REQUEST, WIDTH, HEIGHT, 17 TAG_FRAMEBUFFER_SET_VIRTUAL_SCREEN_SIZE, 8, MAILBOX_REQUEST, WIDTH, HEIGHT,
19 TAG_FRAMEBUFFER_SET_DEPTH, 4, MAILBOX_REQUEST, DEPTH, 18 TAG_FRAMEBUFFER_SET_DEPTH, 4, MAILBOX_REQUEST, DEPTH,
20 TAG_END, 19 TAG_END,
21 0, 0, 0 // Pad. 20 0, 0, 0 // Padding.
21 };
22 mbox_write(PROPERTY_CHANNEL, ConfigureScreen);
23 const Mail* response = mbox_read(PROPERTY_CHANNEL);
24 if (response->code != MAILBOX_SUCCESS) {
25 goto end;
26 }
27
28 volatile __attribute__((aligned(MAIL_ALIGN))) uint32_t InitFramebuffer[8] = {
29 32, // Size in bytes, aligned to MAIL_ALIGN.
30 MAILBOX_REQUEST,
31 TAG_FRAMEBUFFER_ALLOCATE, 8, MAILBOX_REQUEST, ALIGNMENT, 0,
32 TAG_END
22 }; 33 };
23
24 mbox_write(PROPERTY_CHANNEL, InitFramebuffer); 34 mbox_write(PROPERTY_CHANNEL, InitFramebuffer);
25 while ((mail = mbox_read(PROPERTY_CHANNEL)) != (volatile Mail*)(InitFramebuffer)); 35 response = mbox_read(PROPERTY_CHANNEL);
26 36
27 *error = mail->code; 37end:
28 return mail->code == MAILBOX_SUCCESS; 38 *error = response->code;
39 return response->code == MAILBOX_SUCCESS;
29} 40}
30 41