From 8d42b1c7d7466abf80a61ea51ee3006110c15b65 Mon Sep 17 00:00:00 2001 From: Arisotura Date: Tue, 8 Sep 2020 20:19:37 +0200 Subject: messin' around --- src/DSi_Camera.h | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) (limited to 'src/DSi_Camera.h') diff --git a/src/DSi_Camera.h b/src/DSi_Camera.h index 844a4d2..8e44db1 100644 --- a/src/DSi_Camera.h +++ b/src/DSi_Camera.h @@ -28,27 +28,47 @@ public: static void DeInit(); static void Reset(); + static void Process(u32 param); + static void RequestFrame(u32 cam); + DSi_Camera(u32 num); ~DSi_Camera(); void ResetCam(); + bool IsActivated(); - void Start(); - u8 Read(bool last); - void Write(u8 val, bool last); + void I2C_Start(); + u8 I2C_Read(bool last); + void I2C_Write(u8 val, bool last); + + static u8 Read8(u32 addr); + static u16 Read16(u32 addr); + static u32 Read32(u32 addr); + static void Write8(u32 addr, u8 val); + static void Write16(u32 addr, u16 val); + static void Write32(u32 addr, u32 val); -private: u32 Num; +private: u32 DataPos; u32 RegAddr; u16 RegData; - u16 ReadReg(u16 addr); - void WriteReg(u16 addr, u16 val); + u16 I2C_ReadReg(u16 addr); + void I2C_WriteReg(u16 addr, u16 val); u16 PLLCnt; + u16 ClocksCnt; u16 StandbyCnt; + u16 MiscCnt; + + static u16 ModuleCnt; + static u16 Cnt; + + static u8 FrameBuffer[640*480*4]; + static u32 TransferPos; + static u32 FrameLength; }; -- cgit v1.2.3 From c0c1c2e1c262be9c7a5c5a4bdc7a5099896369d8 Mon Sep 17 00:00:00 2001 From: Arisotura Date: Mon, 26 Oct 2020 21:16:20 +0100 Subject: camera: remember PLL config --- src/DSi_Camera.cpp | 12 +++++++++++- src/DSi_Camera.h | 2 ++ 2 files changed, 13 insertions(+), 1 deletion(-) (limited to 'src/DSi_Camera.h') diff --git a/src/DSi_Camera.cpp b/src/DSi_Camera.cpp index dd8dea7..5ac4dfd 100644 --- a/src/DSi_Camera.cpp +++ b/src/DSi_Camera.cpp @@ -129,7 +129,9 @@ void DSi_Camera::ResetCam() RegAddr = 0; RegData = 0; - PLLCnt = 0; + PLLDiv = 0x0366; + PLLPDiv = 0x00F5; + PLLCnt = 0x21F9; ClocksCnt = 0; StandbyCnt = 0x4029; // checkme MiscCnt = 0; @@ -211,6 +213,8 @@ u16 DSi_Camera::I2C_ReadReg(u16 addr) switch (addr) { case 0x0000: return 0x2280; // chip ID + case 0x0010: return PLLDiv; + case 0x0012: return PLLPDiv; case 0x0014: return PLLCnt; case 0x0016: return ClocksCnt; case 0x0018: return StandbyCnt; @@ -227,6 +231,12 @@ void DSi_Camera::I2C_WriteReg(u16 addr, u16 val) { switch (addr) { + case 0x0010: + PLLDiv = val & 0x3FFF; + return; + case 0x0012: + PLLPDiv = val & 0xBFFF; + return; case 0x0014: // shouldn't be instant either? val &= 0x7FFF; diff --git a/src/DSi_Camera.h b/src/DSi_Camera.h index 8e44db1..6022420 100644 --- a/src/DSi_Camera.h +++ b/src/DSi_Camera.h @@ -58,6 +58,8 @@ private: u16 I2C_ReadReg(u16 addr); void I2C_WriteReg(u16 addr, u16 val); + u16 PLLDiv; + u16 PLLPDiv; u16 PLLCnt; u16 ClocksCnt; u16 StandbyCnt; -- cgit v1.2.3 From 81964a0f89eb479bc1a4e60111f5120cd2b1b8f0 Mon Sep 17 00:00:00 2001 From: Arisotura Date: Mon, 26 Oct 2020 21:54:08 +0100 Subject: make things function atleast somewhat no pciture is being actually sent yet --- src/ARM.cpp | 12 ---------- src/DSi_Camera.cpp | 67 +++++++++++++++++++++++++++++++++++++++--------------- src/DSi_Camera.h | 4 +++- src/NDS.h | 3 ++- 4 files changed, 54 insertions(+), 32 deletions(-) (limited to 'src/DSi_Camera.h') diff --git a/src/ARM.cpp b/src/ARM.cpp index 7fe3497..c6c51ed 100644 --- a/src/ARM.cpp +++ b/src/ARM.cpp @@ -256,18 +256,6 @@ void ARMv5::JumpTo(u32 addr, bool restorecpsr) // aging cart debug crap //if (addr == 0x0201764C) printf("capture test %d: R1=%08X\n", R[6], R[1]); //if (addr == 0x020175D8) printf("capture test %d: res=%08X\n", R[6], R[0]); - if(addr==0x0219BA2D) printf("CAM RESET FROM %08X\n", R[15]); - if(addr==0x0219BB69) printf("CAM SHITO FROM %08X\n", R[15]); - if(addr==0x0200BA45) printf("CAM SHITO2 FROM %08X\n", R[15]); - if(addr==0x0200B9ED) printf("CAM SHITO3 FROM %08X\n", R[15]); - if(addr==0x0200B9BD) printf("CAM SETUP START FROM %08X\n", R[15]); - if(R[15]==0x0200B9E6) printf("CAM SETUP END FROM %08X\n", addr); - if(addr==0x0219AA5B) printf("CAM LOOP BACK FROM %08X\n", R[15]); - if(addr==0x0200BD0D) printf("GUILLOTINE FIVE MILLION %08X\n", R[15]); - if(addr==0x0200512D) printf("GUILLOTINE SIX MILLION %08X\n", R[15]); - if(addr==0x0219A585) printf("GUILLOTINE SEVEN MILLION %08X\n", R[15]); - if(addr==0x0219BAF1) printf("CAM GET DRQ BIT %08X\n", R[15]); - if(addr==0x0219BA91) printf("CAM STOP TRANSFER %08X\n", R[15]); u32 oldregion = R[15] >> 24; u32 newregion = addr >> 24; diff --git a/src/DSi_Camera.cpp b/src/DSi_Camera.cpp index 5ac4dfd..746dc64 100644 --- a/src/DSi_Camera.cpp +++ b/src/DSi_Camera.cpp @@ -32,7 +32,13 @@ u8 DSi_Camera::FrameBuffer[640*480*4]; u32 DSi_Camera::FrameLength; u32 DSi_Camera::TransferPos; -const u32 kCameraInterval = 1024*16; // interval between camera data blocks +// note on camera data/etc intervals +// on hardware those are likely affected by several factors +// namely, how long cameras take to process frames +// camera IRQ is fired at roughly 15FPS with default config + +const u32 kIRQInterval = 1120000; // ~30 FPS +const u32 kTransferStart = 60000; bool DSi_Camera::Init() @@ -61,34 +67,32 @@ void DSi_Camera::Reset() TransferPos = 0; FrameLength = 256*192*2; // TODO: make it check frame size, data type, etc - NDS::ScheduleEvent(NDS::Event_DSi_Camera, true, kCameraInterval, Process, 0); + NDS::ScheduleEvent(NDS::Event_DSi_CamIRQ, true, kIRQInterval, IRQ, 0); } -void DSi_Camera::Process(u32 param) +void DSi_Camera::IRQ(u32 param) { DSi_Camera* activecam = nullptr; // TODO: check which camera has priority if both are activated + // (or does it just jumble both data sources together, like it + // does for, say, overlapping VRAM?) if (DSi_Camera0->IsActivated()) activecam = DSi_Camera0; else if (DSi_Camera1->IsActivated()) activecam = DSi_Camera1; if (activecam) { - if (TransferPos == 0) - RequestFrame(activecam->Num); + RequestFrame(activecam->Num); - Cnt |= (1<<4); - if (Cnt & (1<<11)) NDS::SetIRQ(0, NDS::IRQ_DSi_Camera); - } - else - { - TransferPos = 0; + if (Cnt & (1<<11)) + NDS::SetIRQ(0, NDS::IRQ_DSi_Camera); + + if (Cnt & (1<<15)) + NDS::ScheduleEvent(NDS::Event_DSi_CamTransfer, false, kTransferStart, Transfer, 0); } - // TODO: check the interval for this? - // on hardware the delay is likely determined by how long the camera takes to process raw data - NDS::ScheduleEvent(NDS::Event_DSi_Camera, true, kCameraInterval, Process, 0); + NDS::ScheduleEvent(NDS::Event_DSi_CamIRQ, true, kIRQInterval, IRQ, 0); } void DSi_Camera::RequestFrame(u32 cam) @@ -112,6 +116,32 @@ void DSi_Camera::RequestFrame(u32 cam) } } +void DSi_Camera::Transfer(u32 pos) +{ + u32 numscan = (Cnt & 0x000F) + 1; + u32 numpix = numscan * 256; // CHECKME + + // TODO: present data + //printf("CAM TRANSFER POS=%d/%d\n", pos, 0x6000*2); + + DSi::CheckNDMAs(0, 0x0B); + + pos += numpix; + if (pos >= 0x6000*2) // HACK + { + // transfer done + } + else + { + // keep going + + // TODO: must be tweaked such that each block has enough time to transfer + u32 delay = numpix*2 + 16; + + NDS::ScheduleEvent(NDS::Event_DSi_CamTransfer, false, delay, Transfer, pos); + } +} + DSi_Camera::DSi_Camera(u32 num) { @@ -290,6 +320,7 @@ u32 DSi_Camera::Read32(u32 addr) { case 0x04004204: { + return 0; if (!(Cnt & (1<<15))) return 0; // CHECKME u32 ret = *(u32*)&FrameBuffer[TransferPos]; TransferPos += 4; @@ -346,22 +377,22 @@ void DSi_Camera::Write16(u32 addr, u16 val) u16 oldmask; if (Cnt & 0x8000) { - val &= 0x8F00; + val &= 0x8F20; oldmask = 0x601F; } else { - val &= 0xEF0F; + val &= 0xEF2F; oldmask = 0x0010; } - Cnt = (Cnt & oldmask) | val; + Cnt = (Cnt & oldmask) | (val & ~0x0020); if (val & (1<<5)) Cnt &= ~(1<<4); if ((val & (1<<15)) && !(Cnt & (1<<15))) { // start transfer - DSi::CheckNDMAs(0, 0x0B); + //DSi::CheckNDMAs(0, 0x0B); } } return; diff --git a/src/DSi_Camera.h b/src/DSi_Camera.h index 6022420..a8c0632 100644 --- a/src/DSi_Camera.h +++ b/src/DSi_Camera.h @@ -28,9 +28,11 @@ public: static void DeInit(); static void Reset(); - static void Process(u32 param); + static void IRQ(u32 param); static void RequestFrame(u32 cam); + static void Transfer(u32 pos); + DSi_Camera(u32 num); ~DSi_Camera(); diff --git a/src/NDS.h b/src/NDS.h index 89ef12f..98a0f7d 100644 --- a/src/NDS.h +++ b/src/NDS.h @@ -46,7 +46,8 @@ enum Event_DSi_SDMMCTransfer, Event_DSi_SDIOTransfer, Event_DSi_NWifi, - Event_DSi_Camera, + Event_DSi_CamIRQ, + Event_DSi_CamTransfer, Event_DSi_RAMSizeChange, -- cgit v1.2.3 From 6aad429383015a0ac135b081931ae9c5876a7ad0 Mon Sep 17 00:00:00 2001 From: Arisotura Date: Fri, 4 Dec 2020 18:26:48 +0100 Subject: misc. shito --- src/DSi_Camera.h | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'src/DSi_Camera.h') diff --git a/src/DSi_Camera.h b/src/DSi_Camera.h index a8c0632..108d76a 100644 --- a/src/DSi_Camera.h +++ b/src/DSi_Camera.h @@ -67,6 +67,11 @@ private: u16 StandbyCnt; u16 MiscCnt; + u16 MCUAddr; + u16* MCUData; + + u8 MCURegs[0x8000]; + static u16 ModuleCnt; static u16 Cnt; -- cgit v1.2.3