summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author3gg <3gg@shellblade.net>2025-10-14 17:54:17 -0700
committer3gg <3gg@shellblade.net>2025-10-14 17:54:17 -0700
commitc099bcb7402421985e6e8c025e8cde591eaa073a (patch)
treeb78e46d44406909bb8f93fc655f1417fc9666c3c
parent338bd46fb6dbcb8271102ddb6b896a335eb909dc (diff)
Add MAIL_T macro; read framebuffer allocation response
-rw-r--r--src/framebuffer.c21
-rw-r--r--src/mailbox.h12
-rw-r--r--src/uart.c2
3 files changed, 29 insertions, 6 deletions
diff --git a/src/framebuffer.c b/src/framebuffer.c
index e3303b6..c3845b1 100644
--- a/src/framebuffer.c
+++ b/src/framebuffer.c
@@ -2,6 +2,7 @@
2 2
3#include <mailbox.h> 3#include <mailbox.h>
4 4
5#include <stddef.h>
5#include <stdint.h> 6#include <stdint.h>
6 7
7#define WIDTH 640 8#define WIDTH 640
@@ -9,8 +10,15 @@
9#define DEPTH 32 10#define DEPTH 32
10#define ALIGNMENT 16 // Framebuffer byte alignment. 11#define ALIGNMENT 16 // Framebuffer byte alignment.
11 12
13typedef struct Framebuffer {
14 volatile void* pixels;
15 size_t size;
16} Framebuffer;
17
18static Framebuffer framebuffer = {};
19
12bool framebuffer_init(uint32_t* error) { 20bool framebuffer_init(uint32_t* error) {
13 volatile __attribute__((aligned(MAIL_ALIGN))) uint32_t ConfigureScreen[20] = { 21 MAIL_T uint32_t ConfigureScreen[20] = {
14 80, // Size in bytes, aligned to MAIL_ALIGN. 22 80, // Size in bytes, aligned to MAIL_ALIGN.
15 MAILBOX_REQUEST, 23 MAILBOX_REQUEST,
16 TAG_FRAMEBUFFER_SET_PHYSICAL_SCREEN_SIZE, 8, MAILBOX_REQUEST, WIDTH, HEIGHT, 24 TAG_FRAMEBUFFER_SET_PHYSICAL_SCREEN_SIZE, 8, MAILBOX_REQUEST, WIDTH, HEIGHT,
@@ -25,7 +33,7 @@ bool framebuffer_init(uint32_t* error) {
25 goto end; 33 goto end;
26 } 34 }
27 35
28 volatile __attribute__((aligned(MAIL_ALIGN))) uint32_t InitFramebuffer[8] = { 36 MAIL_T uint32_t InitFramebuffer[8] = {
29 32, // Size in bytes, aligned to MAIL_ALIGN. 37 32, // Size in bytes, aligned to MAIL_ALIGN.
30 MAILBOX_REQUEST, 38 MAILBOX_REQUEST,
31 TAG_FRAMEBUFFER_ALLOCATE, 8, MAILBOX_REQUEST, ALIGNMENT, 0, 39 TAG_FRAMEBUFFER_ALLOCATE, 8, MAILBOX_REQUEST, ALIGNMENT, 0,
@@ -33,6 +41,15 @@ bool framebuffer_init(uint32_t* error) {
33 }; 41 };
34 mbox_write(PROPERTY_CHANNEL, InitFramebuffer); 42 mbox_write(PROPERTY_CHANNEL, InitFramebuffer);
35 response = mbox_read(PROPERTY_CHANNEL); 43 response = mbox_read(PROPERTY_CHANNEL);
44 if (response->code != MAILBOX_SUCCESS) {
45 goto end;
46 }
47
48 // The input mail is overwritten with the response.
49 // u32 fb base address
50 // u32 fb size
51 framebuffer.pixels = (void*)(uintptr_t)InitFramebuffer[5];
52 framebuffer.size = InitFramebuffer[6];
36 53
37end: 54end:
38 *error = response->code; 55 *error = response->code;
diff --git a/src/mailbox.h b/src/mailbox.h
index b35c7a6..2104265 100644
--- a/src/mailbox.h
+++ b/src/mailbox.h
@@ -1,3 +1,9 @@
1/*
2References:
3 https://github-wiki-see.page/m/raspberrypi/firmware/wiki/Mailbox-property-interface
4 https://jsandler18.github.io/extra/prop-channel.html
5 https://jsandler18.github.io/extra/mailbox.html
6*/
1#pragma once 7#pragma once
2 8
3#include <stdint.h> 9#include <stdint.h>
@@ -6,6 +12,9 @@
6// must be aligned to a 16-byte boundary. 12// must be aligned to a 16-byte boundary.
7#define MAIL_ALIGN 16 13#define MAIL_ALIGN 16
8 14
15// Type prefix for data arrays used as mail.
16#define MAIL_T volatile __attribute__((aligned(MAIL_ALIGN)))
17
9enum 18enum
10{ 19{
11 PROPERTY_CHANNEL = 8, 20 PROPERTY_CHANNEL = 8,
@@ -55,9 +64,6 @@ typedef struct __attribute__((aligned(MAIL_ALIGN))) Mail {
55 Tag tags[]; // Variable quantity. 64 Tag tags[]; // Variable quantity.
56} Mail; 65} Mail;
57 66
58// TODO: Remove? Unused.
59#define MAIL_SIZE(TYPE) (sizeof(TYPE) + (2 * sizeof(uint32_t)))
60
61void mbox_init(); 67void mbox_init();
62const Mail* mbox_read(uint8_t channel); 68const Mail* mbox_read(uint8_t channel);
63void mbox_write(uint8_t channel, volatile const void* mail); 69void mbox_write(uint8_t channel, volatile const void* mail);
diff --git a/src/uart.c b/src/uart.c
index 3b107f4..f8be797 100644
--- a/src/uart.c
+++ b/src/uart.c
@@ -35,7 +35,7 @@ enum
35}; 35};
36 36
37// A mailbox message with set clock rate of PL011 to 3MHz tag. 37// A mailbox message with set clock rate of PL011 to 3MHz tag.
38static const uint32_t __attribute__((aligned(MAIL_ALIGN))) UART_SET_CLK[9] = { 38static const MAIL_T uint32_t UART_SET_CLK[9] = {
39 9*4, 0, 0x38002, 12, 8, 2, 3000000, 0, 0 39 9*4, 0, 0x38002, 12, 8, 2, 3000000, 0, 0
40}; 40};
41 41