summaryrefslogtreecommitdiff
path: root/src/framebuffer.c
blob: a90bcaa48e9352e6c1b1c9ad7a38faa3922562ac (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
#include <framebuffer.h>

#include <mailbox.h>

#include <stdint.h>

#define WIDTH  640
#define HEIGHT 480
#define DEPTH   32

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).
    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.
  };

  mbox_write(PROPERTY_CHANNEL, InitFramebuffer);
  while ((mail = mbox_read(PROPERTY_CHANNEL)) != (volatile Mail*)(InitFramebuffer));
  
  *error = mail->code;
  return mail->code == MAILBOX_SUCCESS;
}