From 338bd46fb6dbcb8271102ddb6b896a335eb909dc Mon Sep 17 00:00:00 2001 From: 3gg <3gg@shellblade.net> Date: Mon, 13 Oct 2025 20:44:06 -0700 Subject: Finish framebuffer initialization --- src/framebuffer.c | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) (limited to 'src/framebuffer.c') 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 @@ #include -#define WIDTH 640 -#define HEIGHT 480 -#define DEPTH 32 +#define WIDTH 640 +#define HEIGHT 480 +#define DEPTH 32 +#define ALIGNMENT 16 // Framebuffer byte alignment. bool framebuffer_init(uint32_t* error) { - volatile const Mail* mail; - - volatile __attribute__((aligned(MAIL_ALIGN))) uint32_t InitFramebuffer[] = { - 80, // Size in bytes aligned to MAIL_ALIGN(16). + volatile __attribute__((aligned(MAIL_ALIGN))) uint32_t ConfigureScreen[20] = { + 80, // Size in bytes, aligned to MAIL_ALIGN. MAILBOX_REQUEST, TAG_FRAMEBUFFER_SET_PHYSICAL_SCREEN_SIZE, 8, MAILBOX_REQUEST, WIDTH, HEIGHT, TAG_FRAMEBUFFER_SET_VIRTUAL_SCREEN_SIZE, 8, MAILBOX_REQUEST, WIDTH, HEIGHT, TAG_FRAMEBUFFER_SET_DEPTH, 4, MAILBOX_REQUEST, DEPTH, TAG_END, - 0, 0, 0 // Pad. + 0, 0, 0 // Padding. + }; + mbox_write(PROPERTY_CHANNEL, ConfigureScreen); + const Mail* response = mbox_read(PROPERTY_CHANNEL); + if (response->code != MAILBOX_SUCCESS) { + goto end; + } + + volatile __attribute__((aligned(MAIL_ALIGN))) uint32_t InitFramebuffer[8] = { + 32, // Size in bytes, aligned to MAIL_ALIGN. + MAILBOX_REQUEST, + TAG_FRAMEBUFFER_ALLOCATE, 8, MAILBOX_REQUEST, ALIGNMENT, 0, + TAG_END }; - mbox_write(PROPERTY_CHANNEL, InitFramebuffer); - while ((mail = mbox_read(PROPERTY_CHANNEL)) != (volatile Mail*)(InitFramebuffer)); + response = mbox_read(PROPERTY_CHANNEL); - *error = mail->code; - return mail->code == MAILBOX_SUCCESS; +end: + *error = response->code; + return response->code == MAILBOX_SUCCESS; } -- cgit v1.2.3