diff --git a/include/bga.h b/include/bga.h index 5e42e41..06ea44d 100644 --- a/include/bga.h +++ b/include/bga.h @@ -2,11 +2,15 @@ #include "pci.h" #include "type.h" -#define BGA_SWAP_BUFFERS 0x0101 -#define BGA_GET_HEIGHT 0x0102 -#define BGA_GET_WIDTH 0x0103 -#define BGA_GET_SCALE 0x0104 -#define BGA_DISABLE 0x0105 +#define BGA_SWAP_BUFFERS 0x0101 +#define BGA_GET_HEIGHT 0x0102 +#define BGA_GET_WIDTH 0x0103 +#define BGA_GET_SCALE 0x0104 +#define BGA_DISABLE 0x0105 +#define BGA_SET_WIDTH 0x0106 +#define BGA_SET_HEIGHT 0x0107 +#define BGA_SET_UPDATE 0x0108 +#define BGA_GET_BUFFER 0x0109 -int bga_init_with_dev(pci_dev_t* dev); +int init_bga(pci_dev_t* dev); int bga_ioctl(uintptr_t cmd, uintptr_t arg); \ No newline at end of file diff --git a/kernel/bga.c b/kernel/bga.c index 9028eb6..dda6038 100644 --- a/kernel/bga.c +++ b/kernel/bga.c @@ -1,19 +1,20 @@ -#include "type.h" +#include "bga.h" + #include "assert.h" #include "console.h" #include "const.h" +#include "global.h" #include "keyboard.h" #include "memman.h" +#include "pci.h" #include "proc.h" #include "protect.h" #include "proto.h" #include "stdio.h" #include "string.h" -#include "x86.h" -#include "global.h" #include "tty.h" -#include "pci.h" -#include "bga.h" +#include "type.h" +#include "x86.h" #define VBE_DISPI_IOPORT_INDEX 0x01CE #define VBE_DISPI_IOPORT_DATA 0x01CF @@ -37,20 +38,17 @@ static uint16_t bga_screen_width, bga_screen_height; static uint32_t bga_screen_line_size, bga_screen_buffer_size; static uint32_t bga_buf_paddr; -static inline void _bga_write_reg(uint16_t cmd, uint16_t data) -{ +static inline void _bga_write_reg(uint16_t cmd, uint16_t data) { outw(VBE_DISPI_IOPORT_INDEX, cmd); outw(VBE_DISPI_IOPORT_DATA, data); } -static inline uint16_t _bga_read_reg(uint16_t cmd) -{ +static inline uint16_t _bga_read_reg(uint16_t cmd) { outw(VBE_DISPI_IOPORT_INDEX, cmd); return inw(VBE_DISPI_IOPORT_DATA); } -static void _bga_set_resolution(uint16_t width, uint16_t height) -{ +static void _bga_set_resolution(uint16_t width, uint16_t height) { _bga_write_reg(VBE_DISPI_INDEX_ENABLE, VBE_DISPI_DISABLED); _bga_write_reg(VBE_DISPI_INDEX_XRES, width); _bga_write_reg(VBE_DISPI_INDEX_YRES, height); @@ -59,82 +57,79 @@ static void _bga_set_resolution(uint16_t width, uint16_t height) _bga_write_reg(VBE_DISPI_INDEX_BPP, 32); _bga_write_reg(VBE_DISPI_INDEX_X_OFFSET, 0); _bga_write_reg(VBE_DISPI_INDEX_Y_OFFSET, 0); - _bga_write_reg(VBE_DISPI_INDEX_ENABLE, VBE_DISPI_ENABLED | VBE_DISPI_LFB_ENABLED); + _bga_write_reg(VBE_DISPI_INDEX_ENABLE, + VBE_DISPI_ENABLED | VBE_DISPI_LFB_ENABLED); _bga_write_reg(VBE_DISPI_INDEX_BANK, 0); bga_screen_line_size = (uint32_t)width * 4; } -int bga_ioctl(uintptr_t cmd, uintptr_t arg) -{ - uint32_t y_offset = 0; - switch (cmd) { - case BGA_GET_HEIGHT: - return bga_screen_height; - case BGA_GET_WIDTH: - return bga_screen_width; - case BGA_GET_SCALE: - return 1; - case BGA_SWAP_BUFFERS: - y_offset = bga_screen_height * (arg & 1); - _bga_write_reg(VBE_DISPI_INDEX_Y_OFFSET, (uint16_t)y_offset); - return 0; - case BGA_DISABLE: - _bga_write_reg(VBE_DISPI_INDEX_ENABLE, VBE_DISPI_DISABLED); - return 0; - default: - return -1; - } -} - -// static memzone_t* _bga_mmap(file_t* file, mmap_params_t* params) -// { -// bool map_shared = ((params->flags & MAP_SHARED) > 0); - -// if (!map_shared) { -// return 0; -// } - -// memzone_t* zone = memzone_new_random(RUNNING_THREAD->process->address_space, bga_screen_buffer_size); -// if (!zone) { -// return 0; -// } - -// zone->mmu_flags |= MMU_FLAG_PERM_WRITE | MMU_FLAG_PERM_READ | MMU_FLAG_UNCACHED; -// zone->type |= ZONE_TYPE_DEVICE; -// zone->file = file_duplicate(file); -// zone->ops = &mmap_file_vm_ops; - -// for (int offset = 0; offset < bga_screen_buffer_size; offset += VMM_PAGE_SIZE) { -// vmm_map_page(zone->vaddr + offset, bga_buf_paddr + offset, zone->mmu_flags); -// } - -// return zone; -// } - - -static void bga_set_resolution(uint32_t width, uint32_t height) -{ +static void bga_set_resolution(uint32_t width, uint32_t height) { _bga_set_resolution(width, height); bga_screen_width = width; bga_screen_height = height; bga_screen_buffer_size = bga_screen_line_size * height * 2; } +int bga_ioctl(uintptr_t cmd, uintptr_t arg) { + uint32_t y_offset = 0; + switch (cmd) { + case BGA_GET_HEIGHT: + return bga_screen_height; + case BGA_GET_WIDTH: + return bga_screen_width; + case BGA_GET_SCALE: + return 1; + case BGA_GET_BUFFER: + if (arg == 0) + return bga_buf_paddr; + else + return bga_buf_paddr + bga_screen_buffer_size / 2; + case BGA_SWAP_BUFFERS: + y_offset = bga_screen_height * (arg & 1); + _bga_write_reg(VBE_DISPI_INDEX_Y_OFFSET, (uint16_t)y_offset); + return 0; + case BGA_DISABLE: + _bga_write_reg(VBE_DISPI_INDEX_ENABLE, VBE_DISPI_DISABLED); + return 0; + case BGA_SET_WIDTH: + bga_screen_width = arg; + return 0; + case BGA_SET_HEIGHT: + bga_screen_height = arg; + return 0; + case BGA_SET_UPDATE: + bga_set_resolution(bga_screen_width, bga_screen_height); + return 0; + default: + return -1; + } +} -int bga_init_with_dev(pci_dev_t* dev) -{ +int init_bga(pci_dev_t *dev) { if (dev->type != DEVICE_DISPLAY) { return -1; } bga_buf_paddr = pci_read_bar(dev, 0) & 0xfffffff0; bga_set_resolution(1024, 768); - kprintf("bga buf paddr=%p; buf size= %d KB\n", bga_buf_paddr, bga_screen_buffer_size / 1024); + kprintf("bga buf paddr=%p; buf size= %d KB\n", bga_buf_paddr, + bga_screen_buffer_size / 1024); for (int k = 0; k < bga_screen_buffer_size; k += 4096) { - klin_mapping_phy(bga_buf_paddr + k, bga_buf_paddr + k, PG_P | PG_USU | PG_RWW, PG_P | PG_USU | PG_RWW); + klin_mapping_phy(bga_buf_paddr + k, bga_buf_paddr + k, + PG_P | PG_USU | PG_RWW, PG_P | PG_USU | PG_RWW); } - uint32_t *test = (uint32_t *)bga_buf_paddr; - for (int i = 0; i <= 1024*20; ++ i) test[i] = 0xff3312; + // uint32_t *test = (uint32_t *)bga_buf_paddr; + // uint32_t *test2 = (uint32_t *)(bga_buf_paddr + bga_screen_buffer_size / 2); + // for (int i = 0; i <= 1024 * 20; ++i) test[i] = 0x00ff12; + // for (int i = 1024 * 20; i <= 1024 * 40; ++i) test2[i] = 0x0000ff; + // while (1) { + // bga_ioctl(BGA_SWAP_BUFFERS, 1); + // for (volatile int i = 0; i < 0x03ffffff; ++i) + // ; + // bga_ioctl(BGA_SWAP_BUFFERS, 0); + // for (volatile int i = 0; i < 0x03ffffff; ++i) + // ; + // } return 0; } \ No newline at end of file diff --git a/kernel/main.c b/kernel/main.c index 93d8cd9..bd1ebd4 100644 --- a/kernel/main.c +++ b/kernel/main.c @@ -47,7 +47,7 @@ int kernel_main() init_tty_main(); init_pci(); pci_dev_t* dev_bga = get_pci_bga(); - bga_init_with_dev(dev_bga); + init_bga(dev_bga); kprintf("cr3 ready= %p\n", cr3_ready); // initialize PCBs, added by xw, 18/5/26 error = initialize_processes();