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 }