80 lines
2.2 KiB
C
80 lines
2.2 KiB
C
#include <stddef.h>
|
|
#include <stdint.h>
|
|
#include <exec/list.h>
|
|
#include <exec/sync.h>
|
|
#include <exec/task.h>
|
|
#include <exec/port.h>
|
|
#include <exec/hal.h>
|
|
#include <exec/device.h>
|
|
#include <exec/debcon.h>
|
|
|
|
#define VBE_DISPI_BASE 0xFEBF8500
|
|
#define VBE_DISPI_INDEX_ID 0
|
|
#define VBE_DISPI_INDEX_XRES 2
|
|
#define VBE_DISPI_INDEX_YRES 4
|
|
#define VBE_DISPI_INDEX_BPP 6
|
|
#define VBE_DISPI_INDEX_ENABLE 8
|
|
#define VBE_DISPI_INDEX_BANK 10
|
|
#define VBE_DISPI_INDEX_VIRT_WIDTH 12
|
|
#define VBE_DISPI_INDEX_VIRT_HEIGHT 14
|
|
#define VBE_DISPI_INDEX_X_OFFSET 16
|
|
#define VBE_DISPI_INDEX_Y_OFFSET 18
|
|
|
|
uint32_t nop(void) { return 0; }
|
|
|
|
uint32_t BGA_OpenDevice(void *_IExec, struct Device *dev, uint32_t unitNumber, struct IORequest *ior, uint32_t flags) {
|
|
ior->unit = NULL;
|
|
return 0;
|
|
}
|
|
|
|
void BGA_SetMode(uint16_t width, uint16_t height, uint16_t bpp) {
|
|
HalWriteIO16(AS_MEM, VBE_DISPI_BASE+VBE_DISPI_INDEX_ENABLE, 0); // Disable
|
|
HalWriteIO16(AS_MEM, VBE_DISPI_BASE+VBE_DISPI_INDEX_XRES, width);
|
|
HalWriteIO16(AS_MEM, VBE_DISPI_BASE+VBE_DISPI_INDEX_YRES, height);
|
|
HalWriteIO16(AS_MEM, VBE_DISPI_BASE+VBE_DISPI_INDEX_BPP, bpp);
|
|
HalWriteIO16(AS_MEM, VBE_DISPI_BASE+VBE_DISPI_INDEX_ENABLE, 0x41); // Enable with linear framebuffer
|
|
}
|
|
|
|
uint32_t BGA_BeginIO(struct IORequest *ior) {
|
|
struct IOStdReq *sir = (struct IOStdReq *)ior;
|
|
switch (ior->command) {
|
|
case VID_SET_MODE:
|
|
struct VideoMode *mode = (struct VideoMode *)sir->data;
|
|
BGA_SetMode(mode->width, mode->height, mode->bpp);
|
|
ior->error = DS_OK;
|
|
break;
|
|
case VID_GET_FRAMEBUFFER:
|
|
{
|
|
uintptr_t framebuffer_addr = 0xE0000000;
|
|
*((uintptr_t *)sir->data) = framebuffer_addr;
|
|
ior->error = DS_OK;
|
|
}
|
|
break;
|
|
default:
|
|
ior->error = DS_BADFUN;
|
|
}
|
|
CompleteIO(ior);
|
|
return 0;
|
|
}
|
|
|
|
struct DevFuncTable bga_functable = {
|
|
.open = BGA_OpenDevice,
|
|
.close = nop,
|
|
.expunge = nop,
|
|
.null = nop,
|
|
.beginio = BGA_BeginIO,
|
|
.abortio = nop
|
|
};
|
|
|
|
struct Device bga_device = {
|
|
.library = {
|
|
.node = {
|
|
.name = "bga.device"
|
|
},
|
|
.vectors = (uintptr_t *)&bga_functable
|
|
}
|
|
};
|
|
|
|
void BGA_Init(void) {
|
|
AddDevice(&bga_device);
|
|
} |