1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
#include <framebuffer.h>
#include <mailbox.h>
#include <stdint.h>
#define WIDTH 640
#define HEIGHT 480
#define DEPTH 32
#define ALIGNMENT 16 // Framebuffer byte alignment.
bool framebuffer_init(uint32_t* error) {
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 // 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);
response = mbox_read(PROPERTY_CHANNEL);
end:
*error = response->code;
return response->code == MAILBOX_SUCCESS;
}
|