From ee7fd8e6762b0dbbf6da3756a78da49a61c73b98 Mon Sep 17 00:00:00 2001 From: meepingsnesroms Date: Sun, 21 Apr 2019 21:05:01 -0700 Subject: [PATCH] Clean up and attach LCD stuff --- src/pxa255/pxa255.c | 31 ++++++++++++++++++++++--------- src/pxa255/pxa255_LCD.c | 25 ++++--------------------- src/pxa255/pxa255_LCD.h | 5 ++--- src/tungstenCBus.h | 2 ++ 4 files changed, 30 insertions(+), 33 deletions(-) diff --git a/src/pxa255/pxa255.c b/src/pxa255/pxa255.c index b1ddabc..138adb8 100644 --- a/src/pxa255/pxa255.c +++ b/src/pxa255/pxa255.c @@ -23,30 +23,34 @@ uint16_t* pxa255Framebuffer; static Pxa255lcd tungstenCLcd; +//LCD accesses +static uint32_t pxa255LcdRead32(uint32_t addr){uint32_t out; pxa255lcdPrvMemAccessF(&tungstenCLcd, addr, 4, false, &out); return out;} +static void pxa255LcdWrite32(uint32_t addr, uint32_t value){pxa255lcdPrvMemAccessF(&tungstenCLcd, addr, 4, true, &value);} + bool pxa255Init(uint8_t** returnRom, uint8_t** returnRam){ - uint32_t total_mem = 0; - int i; + uint32_t mem_offset = 0; + uint8_t i; mem_and_flags = os_reserve(MEM_MAXSIZE * 2); + if(!mem_and_flags) + return false; //ROM mem_areas[0].base = PXA255_ROM_START_ADDRESS; mem_areas[0].size = TUNGSTEN_C_ROM_SIZE; + mem_areas[0].ptr = mem_and_flags + mem_offset; + mem_offset += TUNGSTEN_C_ROM_SIZE; //RAM mem_areas[1].base = PXA255_RAM_START_ADDRESS; mem_areas[1].size = TUNGSTEN_C_RAM_SIZE; + mem_areas[1].ptr = mem_and_flags + mem_offset; + mem_offset += TUNGSTEN_C_RAM_SIZE; //LCD mem_areas[2].base = PXA255_LCD_START_ADDRESS; mem_areas[2].size = PXA255_LCD_SIZE; - - for (i = 0; i < sizeof(mem_areas)/sizeof(*mem_areas); i++) { - if (mem_areas[i].size) { - mem_areas[i].ptr = mem_and_flags + total_mem; - total_mem += mem_areas[i].size; - } - } + mem_areas[2].ptr = NULL; for (i = 0; i < 64; i++) { // will fallback to bad_* on non-memory addresses @@ -57,6 +61,15 @@ bool pxa255Init(uint8_t** returnRom, uint8_t** returnRam){ write_half_map[i] = memory_write_half; write_word_map[i] = memory_write_word; } + + read_byte_map[PXA255_START_BANK(PXA255_LCD_START_ADDRESS)] = bad_read_byte; + read_half_map[PXA255_START_BANK(PXA255_LCD_START_ADDRESS)] = bad_read_half; + read_word_map[PXA255_START_BANK(PXA255_LCD_START_ADDRESS)] = pxa255LcdRead32; + write_byte_map[PXA255_START_BANK(PXA255_LCD_START_ADDRESS)] = bad_write_byte; + write_half_map[PXA255_START_BANK(PXA255_LCD_START_ADDRESS)] = bad_write_half; + write_word_map[PXA255_START_BANK(PXA255_LCD_START_ADDRESS)] = pxa255LcdWrite32; + + return true; } void pxa255Deinit(void){ diff --git a/src/pxa255/pxa255_LCD.c b/src/pxa255/pxa255_LCD.c index de90f98..0e85a4f 100644 --- a/src/pxa255/pxa255_LCD.c +++ b/src/pxa255/pxa255_LCD.c @@ -1,6 +1,7 @@ #include "pxa255_LCD.h" #include "pxa255_mem.h" #include "pxa255.h" +#include "../armv5te/mem.h" #define UNMASKABLE_INTS 0x7C8E @@ -15,7 +16,7 @@ static void pxa255lcdPrvUpdateInts(Pxa255lcd* lcd){ } } -static Boolean pxa255lcdPrvMemAccessF(void* userData, UInt32 pa, UInt8 size, Boolean write, void* buf){ +Boolean pxa255lcdPrvMemAccessF(void* userData, UInt32 pa, UInt8 size, Boolean write, void* buf){ Pxa255lcd* lcd = userData; UInt32 val = 0; @@ -194,14 +195,7 @@ static Boolean pxa255lcdPrvMemAccessF(void* userData, UInt32 pa, UInt8 size, Boo return true; } -static UInt32 pxa255PrvGetWord(Pxa255lcd* lcd, UInt32 addr){ - - UInt32 v; - - if(!memAccess(lcd->mem, addr, 4, false, &v)) return 0; - - return v; -} +#define pxa255PrvGetWord(x, addr) mmio_read_word(addr) static void pxa255LcdPrvDma(Pxa255lcd* lcd, void* dest, UInt32 addr, UInt32 len){ @@ -359,20 +353,9 @@ void pxa255lcdFrame(Pxa255lcd* lcd){ pxa255lcdPrvUpdateInts(lcd); } - -Boolean pxa255lcdInit(Pxa255lcd* lcd, ArmMem* physMem, Pxa255ic* ic){ - - +void pxa255lcdInit(Pxa255lcd* lcd, Pxa255ic* ic){ __mem_zero(lcd, sizeof(Pxa255lcd)); lcd->ic = ic; - lcd->mem = physMem; lcd->intMask = UNMASKABLE_INTS; - - return memRegionAdd(physMem, PXA255_LCD_BASE, PXA255_LCD_SIZE, pxa255lcdPrvMemAccessF, lcd); } - - - - - diff --git a/src/pxa255/pxa255_LCD.h b/src/pxa255/pxa255_LCD.h index ac45752..c9da1a1 100644 --- a/src/pxa255/pxa255_LCD.h +++ b/src/pxa255/pxa255_LCD.h @@ -27,7 +27,6 @@ uint16_t* pxa255Framebuffer; typedef struct{ Pxa255ic* ic; - ArmMem* mem; //registers UInt32 lccr0, lccr1, lccr2, lccr3, fbr0, fbr1, liicr, trgbr, tcr; @@ -48,9 +47,9 @@ typedef struct{ }Pxa255lcd; -Boolean pxa255lcdInit(Pxa255lcd* lcd, ArmMem* physMem, Pxa255ic* ic); +Boolean pxa255lcdPrvMemAccessF(void* userData, UInt32 pa, UInt8 size, Boolean write, void* buf); +void pxa255lcdInit(Pxa255lcd* lcd, Pxa255ic* ic); void pxa255lcdFrame(Pxa255lcd* lcd); - #endif diff --git a/src/tungstenCBus.h b/src/tungstenCBus.h index fe7f581..52842eb 100644 --- a/src/tungstenCBus.h +++ b/src/tungstenCBus.h @@ -8,4 +8,6 @@ #define TUNGSTEN_C_RAM_SIZE (64 * 0x100000)//64mb RAM #define PXA255_LCD_SIZE 0x00001000 +#define PXA255_START_BANK(address) ((address) >> 26) + #endif