/ src / main.c
main.c
 1  #include <stdint.h>
 2  #include <stddef.h>
 3  #include <stdbool.h>
 4  #include <ultra.h>
 5  #include <machine.h>
 6  #include <flanterm.h>
 7  #include <flanterm_backends/fb.h>
 8  
 9  void kmain(struct ultra_boot_context *bootctx, uint32_t magic)
10  {
11    if(magic != ULTRA_MAGIC) { hcf(); }
12  
13    struct ultra_attribute_header *hdrinfo = bootctx->attributes;
14    struct ultra_kernel_info_attribute *krnlinfo = NULL;
15    struct ultra_framebuffer_attribute *fbinfo = NULL;
16  
17    int32_t i = bootctx->attribute_count;
18  
19    while(--i >= 0)
20      {
21        if(hdrinfo->type == ULTRA_ATTRIBUTE_KERNEL_INFO)
22          krnlinfo = (struct ultra_kernel_info_attribute *)hdrinfo;
23        if(hdrinfo->type == ULTRA_ATTRIBUTE_FRAMEBUFFER_INFO)
24          fbinfo = (struct ultra_framebuffer_attribute *)hdrinfo;
25  
26        hdrinfo = ULTRA_NEXT_ATTRIBUTE(hdrinfo);
27      }
28  
29    if(krnlinfo == NULL || fbinfo == NULL) { hcf(); }
30  
31    struct ultra_framebuffer *fb = &fbinfo->fb;
32  
33    void *framebuffer_ptr = (void *)(uintptr_t)fb->physical_address;
34    uint32_t width = fb->width;
35    uint32_t height = fb->height;
36    uint32_t pitch = fb->pitch;
37  
38    uint8_t red_mask_size = 0, red_mask_shift = 0;
39    uint8_t green_mask_size = 0, green_mask_shift = 0;
40    uint8_t blue_mask_size = 0, blue_mask_shift = 0;
41  
42    switch(fb->format)
43      {
44      case ULTRA_FB_FORMAT_RGB888:
45        red_mask_size = 8;
46        red_mask_shift = 16;
47        green_mask_size = 8;
48        green_mask_shift = 8;
49        blue_mask_size = 8;
50        blue_mask_shift = 0;
51        break;
52      case ULTRA_FB_FORMAT_BGR888:
53        red_mask_size = 8;
54        red_mask_shift = 0;
55        green_mask_size = 8;
56        green_mask_shift = 8;
57        blue_mask_size = 8;
58        blue_mask_shift = 16;
59        break;
60      case ULTRA_FB_FORMAT_RGBX8888:
61      case ULTRA_FB_FORMAT_XRGB8888:
62        red_mask_size = 8;
63        red_mask_shift = 16;
64        green_mask_size = 8;
65        green_mask_shift = 8;
66        blue_mask_size = 8;
67        blue_mask_shift = 0;
68        break;
69      default: hcf();
70      }
71  
72    struct flanterm_context *ft_ctx = flanterm_fb_init(
73      NULL, NULL, framebuffer_ptr, width, height, pitch, red_mask_size,
74      red_mask_shift, green_mask_size, green_mask_shift, blue_mask_size,
75      blue_mask_shift, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 1,
76      0, 0, 0);
77  
78    const char msg[] = "Hello world\n";
79  
80    flanterm_write(ft_ctx, msg, sizeof(msg));
81  
82    hcf();
83  }