double buffer ?
This commit is contained in:
parent
7645cffff8
commit
cb05f80860
@ -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);
|
||||
131
kernel/bga.c
131
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;
|
||||
}
|
||||
@ -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();
|
||||
|
||||
Loading…
Reference in New Issue
Block a user