summaryrefslogtreecommitdiff
path: root/src/framebuffer.c
blob: e3303b6be98c19c8b8fcf04f257ff05625d86b50 (plain)
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;
}