diff options
Diffstat (limited to 'src/arch/amd64/fb.c')
-rw-r--r-- | src/arch/amd64/fb.c | 109 |
1 files changed, 43 insertions, 66 deletions
diff --git a/src/arch/amd64/fb.c b/src/arch/amd64/fb.c index 9dd2ddf..5e9ea5e 100644 --- a/src/arch/amd64/fb.c +++ b/src/arch/amd64/fb.c @@ -2,82 +2,59 @@ #include <memory.h> #include <serial.h> #include <stdint.h> -#include <stddef.h> #include "bindings.h" #define INDEX 0x1CE #define DATA 0x1CF -#define FB_ADDR 0xE0000000 -#define FB_MAX 0xFF000000 -#define FB_LEN (FB_MAX - FB_ADDR) -#define PREFERRED_VY 4096 -#define PREFERRED_B 32 +#define INDEX_ID 0 +#define INDEX_XRES 1 +#define INDEX_YRES 2 +#define INDEX_BPP 3 +#define INDEX_ENABLE 4 +#define INDEX_BANK 5 +#define INDEX_VIRT_WIDTH 6 +#define INDEX_VIRT_HEIGHT 7 +#define INDEX_X_OFFSET 8 +#define INDEX_Y_OFFSET 9 -uint16_t fb_res_x = 0; -uint16_t fb_res_y = 0; -uint16_t fb_res_b = 0; +#define DATA_DISP_DISABLE 0x00 +#define DATA_DISP_ENABLE 0x01 +#define DATA_LFB_ENABLE 0x40 +#define DATA_NO_CLEAR_MEM 0x80 -uint8_t *fb_buffer = NULL; +static void write(uint16_t index, uint16_t data) { + outw(INDEX, index); + outw(DATA, data); +} + +static uint16_t read(uint16_t value) { + outw(INDEX, value); + return inw(DATA); +} + +int is_available(void) { + return (read(INDEX_ID) >= 0xB0C4); +} + +void set_mode(uint16_t width, uint16_t height, uint16_t bit_depth, int lfb, int clear) { + write(INDEX_ENABLE, DATA_DISP_DISABLE); + write(INDEX_XRES, width); + write(INDEX_YRES, height); + write(INDEX_BPP, bit_depth); + write(INDEX_ENABLE, DATA_DISP_ENABLE | + (lfb ? DATA_LFB_ENABLE : 0) | + (clear ? 0 : DATA_NO_CLEAR_MEM)); +} + +void set_bank(uint16_t bank) { + write(INDEX_BANK, bank); +} -int fb_init(uint16_t res_x, uint16_t res_y) { +int fb_init(uint16_t width, uint16_t height) { - outw(INDEX, 0x00); - uint16_t i = inw(DATA); - if (i < 0xB0C0 || i > 0xB0C6) { - return -1; - } - outw(DATA, 0xB0C4); - i = inw(DATA); - /* Disable VBE */ - outw(INDEX, 0x04); - outw(DATA, 0x00); - /* Set X resolution to 1024 */ - outw(INDEX, 0x01); - outw(DATA, res_x); - /* Set Y resolution to 768 */ - outw(INDEX, 0x02); - outw(DATA, res_y); - /* Set bpp to 32 */ - outw(INDEX, 0x03); - outw(DATA, PREFERRED_B); - /* Set Virtual Height to stuff */ - outw(INDEX, 0x07); - outw(DATA, PREFERRED_VY); - /* Re-enable VBE */ - outw(INDEX, 0x04); - outw(DATA, 0x41); + set_mode(width, height, 32, true, true); -// uint32_t * text_vid_mem = (uint32_t *)0xA0000; -// text_vid_mem[0] = 0xA5ADFACE; -// -// void *temp = mmap((void *) FB_ADDR, 0xFF1000); -// -// for (uintptr_t fb_offset = FB_ADDR; fb_offset < FB_MAX; fb_offset += 0x01000000) { -// /* Enable the higher memory */ -// remap(temp, (void *)fb_offset, 0xFF1000); -// -// /* Go find it */ -// for (uintptr_t offset = 0; offset < 0xFF0000; offset += 0x1000) { -// uintptr_t x = (uintptr_t)temp + offset; -// if (((uintptr_t *)x)[0] == 0xA5ADFACE) { -// fb_buffer = (uint8_t *) (fb_offset + offset); -// goto mem_found; -// } -// } -// } -// -// unmap(temp); -// -//mem_found: -// -// fb_res_x = res_x; -// fb_res_y = res_y; -// fb_res_b = PREFERRED_B; -// -// fb_buffer = mmap(fb_buffer, 0xFF0000); -// memset(fb_buffer, 7, 0xFF0000); -// return 0; } |