Newer
Older
#include <am.h>
#include <x86.h>
#include <amdev.h>
#include <klib.h>
static uint32_t* const fb __attribute__((used)) = (uint32_t *)0x40000;
size_t video_read(uintptr_t reg, void *buf, size_t size) {
const uint32_t SCREEN_PORT = 0x100;
switch (reg) {
case _DEVREG_VIDEO_INFO: {
_VideoInfoReg *info = (_VideoInfoReg *)buf;
uint32_t screen = inl(SCREEN_PORT);
info->width = screen >> 16;
info->height = screen << 16 >> 16;
return sizeof(_VideoInfoReg);
}
}
return 0;
}
size_t video_write(uintptr_t reg, void *buf, size_t size) {
switch (reg) {
case _DEVREG_VIDEO_FBCTL: {
_FBCtlReg *ctl = (_FBCtlReg *)buf;
for(int i = 0; i < ctl->h; ++i) {
memcpy(fb+(ctl->y+i)*screen_width()+ctl->x,ctl->pixels+i*ctl->w,ctl->w*4);
}