camera: enough stub to pass firmware init

This commit is contained in:
Arisotura
2019-08-06 13:06:14 +02:00
parent 62a605cd92
commit 28a9c7d9d1
3 changed files with 34 additions and 8 deletions

View File

@ -61,6 +61,9 @@ void DSi_Camera::ResetCam()
DataPos = 0; DataPos = 0;
RegAddr = 0; RegAddr = 0;
RegData = 0; RegData = 0;
PLLCnt = 0;
StandbyCnt = 0x4029; // checkme
} }
@ -130,7 +133,11 @@ u16 DSi_Camera::ReadReg(u16 addr)
{ {
switch (addr) switch (addr)
{ {
case 0x301A: return 0x0002; // HAX case 0x0000: return 0x2280; // chip ID
case 0x0014: return PLLCnt;
case 0x0018: return StandbyCnt;
case 0x301A: return ((~StandbyCnt) & 0x4000) >> 12;
} }
printf("DSi_Camera%d: unknown read %04X\n", Num, addr); printf("DSi_Camera%d: unknown read %04X\n", Num, addr);
@ -139,5 +146,21 @@ u16 DSi_Camera::ReadReg(u16 addr)
void DSi_Camera::WriteReg(u16 addr, u16 val) void DSi_Camera::WriteReg(u16 addr, u16 val)
{ {
switch (addr)
{
case 0x0014:
// shouldn't be instant either?
val &= 0x7FFF;
val |= ((val & 0x0002) << 14);
PLLCnt = val;
return;
case 0x0018:
// TODO: this shouldn't be instant, but uh
val &= 0x003F;
val |= ((val & 0x0001) << 14);
StandbyCnt = val;
return;
}
printf("DSi_Camera%d: unknown write %04X %04X\n", Num, addr, val); printf("DSi_Camera%d: unknown write %04X %04X\n", Num, addr, val);
} }

View File

@ -46,6 +46,9 @@ private:
u16 ReadReg(u16 addr); u16 ReadReg(u16 addr);
void WriteReg(u16 addr, u16 val); void WriteReg(u16 addr, u16 val);
u16 PLLCnt;
u16 StandbyCnt;
}; };

View File

@ -156,7 +156,7 @@ void Reset()
void WriteCnt(u8 val) void WriteCnt(u8 val)
{ {
//printf("I2C: write CNT %02X\n", val); //printf("I2C: write CNT %02X, %08X\n", val, NDS::GetPC(1));
// TODO: check ACK flag // TODO: check ACK flag
// TODO: transfer delay // TODO: transfer delay
@ -179,11 +179,11 @@ void WriteCnt(u8 val)
case 0x7A: Data = DSi_Camera1->Read(islast); break; case 0x7A: Data = DSi_Camera1->Read(islast); break;
default: default:
printf("I2C: read on unknown device %02X, cnt=%02X, data=%02X, last=%d\n", Device, val, 0, islast); printf("I2C: read on unknown device %02X, cnt=%02X, data=%02X, last=%d\n", Device, val, 0, islast);
Data = 0; Data = 0xFF;
break; break;
} }
printf("I2C read, device=%02X, cnt=%02X, data=%02X, last=%d\n", Device, val, Data, islast); //printf("I2C read, device=%02X, cnt=%02X, data=%02X, last=%d\n", Device, val, Data, islast);
} }
else else
{ {
@ -194,7 +194,7 @@ void WriteCnt(u8 val)
if (val & (1<<1)) if (val & (1<<1))
{ {
Device = Data & 0xFE; Device = Data & 0xFE;
printf("I2C: %s start, device=%02X\n", (Data&0x01)?"read":"write", Device); //printf("I2C: %s start, device=%02X\n", (Data&0x01)?"read":"write", Device);
switch (Device) switch (Device)
{ {
@ -203,13 +203,13 @@ void WriteCnt(u8 val)
case 0x7A: DSi_Camera1->Start(); break; case 0x7A: DSi_Camera1->Start(); break;
default: default:
printf("I2C: %s start on unknown device %02X\n", (Data&0x01)?"read":"write", Device); printf("I2C: %s start on unknown device %02X\n", (Data&0x01)?"read":"write", Device);
ack = false; //ack = false;
break; break;
} }
} }
else else
{ {
printf("I2C write, device=%02X, cnt=%02X, data=%02X, last=%d\n", Device, val, Data, islast); //printf("I2C write, device=%02X, cnt=%02X, data=%02X, last=%d\n", Device, val, Data, islast);
switch (Device) switch (Device)
{ {
@ -218,7 +218,7 @@ void WriteCnt(u8 val)
case 0x7A: DSi_Camera1->Write(Data, islast); break; case 0x7A: DSi_Camera1->Write(Data, islast); break;
default: default:
printf("I2C: write on unknown device %02X, cnt=%02X, data=%02X, last=%d\n", Device, val, Data, islast); printf("I2C: write on unknown device %02X, cnt=%02X, data=%02X, last=%d\n", Device, val, Data, islast);
ack = false; //ack = false;
break; break;
} }
} }