mirror of
https://github.com/libretro/Mu.git
synced 2026-09-22 22:56:12 +00:00
Update TPS65010, fix T3 overclocking method
This commit is contained in:
1
bugs/currentBug.txt
Normal file
1
bugs/currentBug.txt
Normal file
@@ -0,0 +1 @@
|
||||
T3 locks up endlessly checking TSC2101 interrupts
|
||||
@@ -1,3 +0,0 @@
|
||||
Fixed:
|
||||
Endian compatibility is broken(the CPU state needs to be standardized)
|
||||
RetroArch port crashes on exit(needed to check if environ_cb returned true, switched to libretro-common filestreams too)
|
||||
@@ -63,6 +63,8 @@ GPIO lines from misc chips to CPU are not implemented
|
||||
|
||||
|
||||
Fixed:
|
||||
Endian compatibility is broken(the CPU state needs to be standardized)
|
||||
RetroArch port crashes on exit(needed to check if environ_cb returned true, switched to libretro-common filestreams too)
|
||||
make the headers belong to the main file of the target chip being emulated for specs
|
||||
remove specs folder
|
||||
UART1 USTCNT1
|
||||
|
||||
@@ -23,6 +23,8 @@
|
||||
#include "../armv5te/os/os.h"
|
||||
#include "../armv5te/translate.h"
|
||||
#include "../tungstenT3Bus.h"
|
||||
#include "../tsc2101.h"
|
||||
#include "../tps65010.h"
|
||||
#include "../emulator.h"
|
||||
|
||||
|
||||
@@ -190,7 +192,7 @@ void pxa260Reset(void){
|
||||
pxa260TimingReset();
|
||||
|
||||
//set first timer event
|
||||
pxa260TimingTriggerEvent(PXA260_TIMING_CALLBACK_TICK_CPU_TIMER, TUNGSTEN_T3_CPU_PLL_FREQUENCY / TUNGSTEN_T3_CPU_CRYSTAL_FREQUENCY * palmClockMultiplier);
|
||||
pxa260TimingTriggerEvent(PXA260_TIMING_CALLBACK_TICK_CPU_TIMER, TUNGSTEN_T3_CPU_PLL_FREQUENCY / TUNGSTEN_T3_CPU_CRYSTAL_FREQUENCY);
|
||||
|
||||
memset(&arm, 0, sizeof arm);
|
||||
arm.control = 0x00050078;
|
||||
@@ -226,14 +228,11 @@ void pxa260LoadState(uint8_t* data){
|
||||
void pxa260Execute(bool wantVideo){
|
||||
uint32_t index;
|
||||
|
||||
tsc2101UpdateInterrupt();
|
||||
tps65010UpdateInterrupt();
|
||||
pxa260gpioUpdateKeyMatrix(&pxa260Gpio);
|
||||
|
||||
pxa260TimingRun(TUNGSTEN_T3_CPU_PLL_FREQUENCY / EMU_FPS * palmClockMultiplier);
|
||||
//pxa260TimingRun(20000);
|
||||
|
||||
//this needs to run at 3.6864 MHz
|
||||
//for(index = 0; index < TUNGSTEN_T3_CPU_CRYSTAL_FREQUENCY / EMU_FPS; index++)
|
||||
// pxa260timrTick(&pxa260Timer);
|
||||
pxa260TimingRun(TUNGSTEN_T3_CPU_PLL_FREQUENCY / EMU_FPS);
|
||||
|
||||
//render
|
||||
if(likely(wantVideo))
|
||||
|
||||
@@ -108,6 +108,7 @@ static void pxa260_io_write_word(uint32_t addr, uint32_t value){
|
||||
|
||||
static uint32_t pxa260_lcd_read_word(uint32_t addr){
|
||||
uint32_t out;
|
||||
|
||||
pxa260lcdPrvMemAccessF(&pxa260Lcd, addr, 4, false, &out);
|
||||
debugLog("32 bit PXA260 LCD register read:0x%08X\n", addr);
|
||||
return out;
|
||||
|
||||
@@ -80,7 +80,7 @@ void pxa260TimingRun(int32_t cycles){
|
||||
|
||||
keepRunning:
|
||||
addCycles = pxa260TimingGetDurationUntilNextEvent(cycles);
|
||||
cycle_count_delta = -addCycles;
|
||||
cycle_count_delta = -addCycles * palmClockMultiplier;
|
||||
|
||||
while (!exiting && cycle_count_delta < 0) {
|
||||
if (cpu_events & (EVENT_FIQ | EVENT_IRQ)) {
|
||||
@@ -105,7 +105,7 @@ void pxa260TimingRun(int32_t cycles){
|
||||
}
|
||||
|
||||
//if more then the requested cycles are executed count those too
|
||||
addCycles += cycle_count_delta;
|
||||
addCycles += cycle_count_delta / palmClockMultiplier;
|
||||
|
||||
//remove the unused cycles
|
||||
addCycles -= pxa260TimingLeftoverCycles;
|
||||
@@ -133,5 +133,5 @@ void pxa260TimingRun(int32_t cycles){
|
||||
|
||||
void pxa260TimingTickCpuTimer(void){
|
||||
pxa260timrTick(&pxa260Timer);
|
||||
pxa260TimingTriggerEvent(PXA260_TIMING_CALLBACK_TICK_CPU_TIMER, TUNGSTEN_T3_CPU_PLL_FREQUENCY / TUNGSTEN_T3_CPU_CRYSTAL_FREQUENCY * palmClockMultiplier);
|
||||
pxa260TimingTriggerEvent(PXA260_TIMING_CALLBACK_TICK_CPU_TIMER, TUNGSTEN_T3_CPU_PLL_FREQUENCY / TUNGSTEN_T3_CPU_CRYSTAL_FREQUENCY);
|
||||
}
|
||||
|
||||
@@ -37,9 +37,60 @@ static uint8_t tps65010State;
|
||||
static bool tps65010SelectedRegisterAlreadySet;
|
||||
|
||||
|
||||
static uint8_t tps65010ReadRegister(uint8_t address){
|
||||
switch(address){
|
||||
/*
|
||||
case ACKINT1:
|
||||
case ACKINT2:
|
||||
//TODO: dont know proper behavior, datasheet says the CPU shouldnt need to access this
|
||||
//should probably clear the ints
|
||||
return 0x00;
|
||||
|
||||
case DEFGPIO:
|
||||
//TODO: read GPIO state
|
||||
return tps65010Registers[DEFGPIO];
|
||||
*/
|
||||
|
||||
case CHGSTATUS:
|
||||
case REGSTATUS:
|
||||
case MASK1:
|
||||
case MASK2:
|
||||
case CHGCONFIG:
|
||||
case LED1_ON:
|
||||
case LED1_PER:
|
||||
case LED2_ON:
|
||||
case LED2_PER:
|
||||
case VDCDC1:
|
||||
case VDCDC2:
|
||||
case VREGS1:
|
||||
case MASK3:
|
||||
//simple read, no actions needed
|
||||
return tps65010Registers[address];
|
||||
|
||||
default:
|
||||
debugLog("Unimplemented TPS65010 register read, address:0x%02X\n", address);
|
||||
return 0x00;
|
||||
}
|
||||
}
|
||||
|
||||
static void tps65010WriteRegister(uint8_t address, uint8_t value){
|
||||
//TODO: add register writes
|
||||
debugLog("Unimplemented TPS65010 register write, address:0x%02X, value:0x%02X\n", address, value);
|
||||
switch(address){
|
||||
/*
|
||||
case MASK3:
|
||||
tps65010Registers[address] = value;
|
||||
debugLog("TPS65010 MASK3 write, value:0x%02X\n", value);
|
||||
return;
|
||||
|
||||
case DEFGPIO:
|
||||
tps65010Registers[address] = value;
|
||||
debugLog("TPS65010 DEFGPIO write, value:0x%02X\n", value);
|
||||
return;
|
||||
*/
|
||||
|
||||
default:
|
||||
debugLog("Unimplemented TPS65010 register write, address:0x%02X, value:0x%02X\n", address, value);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void tps65010Reset(void){
|
||||
@@ -88,13 +139,12 @@ uint8_t tps65010I2cExchange(uint8_t i2cBus){
|
||||
return I2C_FLOATING_BUS;
|
||||
}
|
||||
|
||||
tps65010CurrentI2cByte <<= 1;
|
||||
tps65010CurrentI2cByte |= (i2cBus == I2C_1);
|
||||
if(tps65010State == I2C_SENDING){
|
||||
if(tps65010SelectedRegister < 0x11)
|
||||
newI2cBus = (tps65010Registers[tps65010SelectedRegister] & 1 << (tps65010CurrentI2cByteBitsRemaining - 1)) ? I2C_1 : I2C_0;
|
||||
else
|
||||
newI2cBus = I2C_0;
|
||||
if(tps65010State != I2C_SENDING){
|
||||
tps65010CurrentI2cByte <<= 1;
|
||||
tps65010CurrentI2cByte |= (i2cBus == I2C_1);
|
||||
}
|
||||
else{
|
||||
newI2cBus = (tps65010CurrentI2cByte & 1 << (tps65010CurrentI2cByteBitsRemaining - 1)) ? I2C_1 : I2C_0;
|
||||
}
|
||||
tps65010CurrentI2cByteBitsRemaining--;
|
||||
|
||||
@@ -106,7 +156,7 @@ uint8_t tps65010I2cExchange(uint8_t i2cBus){
|
||||
//the address is of this device
|
||||
tps65010State = (tps65010CurrentI2cByte & 0x01) ? I2C_SENDING : I2C_RECEIVING;
|
||||
if(tps65010State == I2C_SENDING)
|
||||
debugLog("TPS65010 reading register:address:0x%02X\n", tps65010SelectedRegister);
|
||||
tps65010CurrentI2cByte = tps65010ReadRegister(tps65010SelectedRegister);
|
||||
}
|
||||
else{
|
||||
tps65010State = I2C_NOT_SELECTED;
|
||||
@@ -138,3 +188,7 @@ uint8_t tps65010I2cExchange(uint8_t i2cBus){
|
||||
|
||||
return newI2cBus;
|
||||
}
|
||||
|
||||
void tps65010UpdateInterrupt(void){
|
||||
//TODO: implement this
|
||||
}
|
||||
|
||||
@@ -9,5 +9,6 @@ void tps65010SaveState(uint8_t* data);
|
||||
void tps65010LoadState(uint8_t* data);
|
||||
|
||||
uint8_t tps65010I2cExchange(uint8_t i2cBus);
|
||||
void tps65010UpdateInterrupt(void);//called when buttons are refreshed or an SD card is inserted
|
||||
|
||||
#endif
|
||||
|
||||
@@ -192,7 +192,7 @@ static void tsc2101ResetRegisters(void){
|
||||
tsc2101Registers[TOUCH_CONTROL_REFERENCE] = 0x0002;
|
||||
//currenly at register 0x5 of touch control
|
||||
|
||||
tsc2101RefreshInterrupt();
|
||||
tsc2101UpdateInterrupt();
|
||||
}
|
||||
|
||||
static uint16_t tsc2101RegisterRead(uint8_t page, uint8_t address){
|
||||
@@ -241,7 +241,7 @@ static uint16_t tsc2101RegisterRead(uint8_t page, uint8_t address){
|
||||
case TOUCH_DATA_TEMP2:
|
||||
debugLog("TSC2101 read ADC data register:%d\n", combinedRegisterNumber);
|
||||
tsc2101HasNewData &= ~(1 << combinedRegisterNumber);
|
||||
tsc2101RefreshInterrupt();//clearing the new data bit could trigger an interrupt
|
||||
tsc2101UpdateInterrupt();//clearing the new data bit could trigger an interrupt
|
||||
return tsc2101Registers[combinedRegisterNumber];
|
||||
|
||||
default:
|
||||
@@ -264,7 +264,7 @@ static void tsc2101RegisterWrite(uint8_t page, uint8_t address, uint16_t value){
|
||||
|
||||
case TOUCH_CONTROL_STATUS:
|
||||
tsc2101Registers[TOUCH_CONTROL_STATUS] = value & 0xC000;
|
||||
tsc2101RefreshInterrupt();//interrupt type might have changed
|
||||
tsc2101UpdateInterrupt();//interrupt type might have changed
|
||||
return;
|
||||
|
||||
case TOUCH_CONTROL_BUFFER_MODE:
|
||||
@@ -272,7 +272,7 @@ static void tsc2101RegisterWrite(uint8_t page, uint8_t address, uint16_t value){
|
||||
tsc2101BufferFifoFlush();
|
||||
|
||||
tsc2101Registers[TOUCH_CONTROL_BUFFER_MODE] = value & 0xF800;
|
||||
tsc2101RefreshInterrupt();//need to refresh innterupt because the trigger level may have changed
|
||||
tsc2101UpdateInterrupt();//need to refresh innterupt because the trigger level may have changed
|
||||
return;
|
||||
|
||||
case TOUCH_CONTROL_REFERENCE:
|
||||
@@ -289,7 +289,7 @@ static void tsc2101RegisterWrite(uint8_t page, uint8_t address, uint16_t value){
|
||||
//TODO: TOUCH_CONTROL_CONFIGURATION SWPDTD bit
|
||||
debugLog("TSC2101 config register writes not fully implemented\n");
|
||||
tsc2101Registers[TOUCH_CONTROL_CONFIGURATION] = value & 0x007F;
|
||||
tsc2101RefreshInterrupt();
|
||||
tsc2101UpdateInterrupt();
|
||||
return;
|
||||
|
||||
case TOUCH_CONTROL_TEMPERATURE_MAX:
|
||||
@@ -299,12 +299,12 @@ static void tsc2101RegisterWrite(uint8_t page, uint8_t address, uint16_t value){
|
||||
case TOUCH_CONTROL_AUX2_MAX:
|
||||
case TOUCH_CONTROL_AUX2_MIN:
|
||||
tsc2101Registers[combinedRegisterNumber] = value & 0x1FFF;
|
||||
tsc2101RefreshInterrupt();
|
||||
tsc2101UpdateInterrupt();
|
||||
return;
|
||||
|
||||
case TOUCH_CONTROL_MEASUREMENT_CONFIGURATION:
|
||||
tsc2101Registers[TOUCH_CONTROL_MEASUREMENT_CONFIGURATION] = value & 0xFE04;
|
||||
tsc2101RefreshInterrupt();
|
||||
tsc2101UpdateInterrupt();
|
||||
return;
|
||||
|
||||
case TOUCH_DATA_X:
|
||||
@@ -439,7 +439,7 @@ bool tsc2101ExchangeBit(bool bit){
|
||||
return output;
|
||||
}
|
||||
|
||||
void tsc2101RefreshInterrupt(void){
|
||||
void tsc2101UpdateInterrupt(void){
|
||||
debugLog("TSC2101 PINTDAV not fully implemented\n");
|
||||
|
||||
//check if PINTDAV is data or pen and data interrupt
|
||||
@@ -635,6 +635,6 @@ void tsc2101Scan(void){
|
||||
else
|
||||
tsc2101Registers[TOUCH_CONTROL_TSC_ADC] &= 0xC3FF;
|
||||
|
||||
tsc2101RefreshInterrupt();
|
||||
tsc2101UpdateInterrupt();
|
||||
}
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ void tsc2101LoadState(uint8_t* data);
|
||||
void tsc2101SetPwrDn(bool value);
|
||||
void tsc2101SetChipSelect(bool value);
|
||||
bool tsc2101ExchangeBit(bool bit);
|
||||
void tsc2101RefreshInterrupt(void);//called after touchscreen update to flush the values
|
||||
void tsc2101UpdateInterrupt(void);//called after touchscreen update to flush the values
|
||||
//TODO: this chip seems to do audio output, need to add a 16bit optimized transfer function
|
||||
|
||||
void tsc2101Scan(void);
|
||||
|
||||
Reference in New Issue
Block a user