Files
net/dev/bga/bga.c
2026-01-06 15:51:03 -08:00

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);
}