2017-01-13 14:20:42 +01:00
|
|
|
// Copyright 2014 Normmatt
|
|
|
|
// Licensed under GPLv2 or any later version
|
|
|
|
// Refer to the license.txt file included.
|
|
|
|
//
|
|
|
|
// modifyed by osilloscopion (2 Jul 2016)
|
|
|
|
//
|
|
|
|
|
2020-07-24 14:20:51 -03:00
|
|
|
#include <arm.h>
|
|
|
|
|
2017-01-13 14:20:42 +01:00
|
|
|
#include "command_ntr.h"
|
|
|
|
#include "protocol_ntr.h"
|
|
|
|
#include "card_ntr.h"
|
|
|
|
|
|
|
|
u32 ReadDataFlags = 0;
|
|
|
|
|
|
|
|
void NTR_CmdReset(void)
|
|
|
|
{
|
|
|
|
cardReset ();
|
2020-07-24 14:20:51 -03:00
|
|
|
ARM_WaitCycles(0xF000 * 4);
|
2017-01-13 14:20:42 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
u32 NTR_CmdGetCartId(void)
|
|
|
|
{
|
|
|
|
return cardReadID (0);
|
|
|
|
}
|
|
|
|
|
|
|
|
void NTR_CmdEnter16ByteMode(void)
|
|
|
|
{
|
|
|
|
static const u32 enter16bytemode_cmd[2] = { 0x3E000000, 0x00000000 };
|
|
|
|
NTR_SendCommand(enter16bytemode_cmd, 0x0, 0, NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
void NTR_CmdReadHeader (u8* buffer)
|
|
|
|
{
|
2020-01-23 00:59:32 +00:00
|
|
|
REG_NTRCARDROMCNT=0;
|
|
|
|
REG_NTRCARDMCNT=0;
|
2020-07-24 14:20:51 -03:00
|
|
|
ARM_WaitCycles(167550 * 4);
|
2020-01-23 00:59:32 +00:00
|
|
|
REG_NTRCARDMCNT=NTRCARD_CR1_ENABLE|NTRCARD_CR1_IRQ;
|
|
|
|
REG_NTRCARDROMCNT=NTRCARD_nRESET|NTRCARD_SEC_SEED;
|
|
|
|
while(REG_NTRCARDROMCNT&NTRCARD_BUSY) ;
|
|
|
|
cardReset();
|
|
|
|
while(REG_NTRCARDROMCNT&NTRCARD_BUSY) ;
|
|
|
|
u32 iCardId=cardReadID(NTRCARD_CLK_SLOW);
|
|
|
|
while(REG_NTRCARDROMCNT&NTRCARD_BUSY) ;
|
2020-08-24 21:27:19 -07:00
|
|
|
|
2020-01-23 00:59:32 +00:00
|
|
|
u32 iCheapCard=iCardId&0x80000000;
|
2020-08-24 21:27:19 -07:00
|
|
|
|
2017-01-13 14:20:42 +01:00
|
|
|
if(iCheapCard)
|
|
|
|
{
|
2020-01-23 00:59:32 +00:00
|
|
|
//this is magic of wood goblins
|
|
|
|
for(size_t ii=0;ii<8;++ii)
|
|
|
|
cardParamCommand(NTRCARD_CMD_HEADER_READ,ii*0x200,NTRCARD_ACTIVATE|NTRCARD_nRESET|NTRCARD_CLK_SLOW|NTRCARD_BLK_SIZE(1)|NTRCARD_DELAY1(0x1FFF)|NTRCARD_DELAY2(0x3F),(u32*)(void*)(buffer+ii*0x200),0x200/sizeof(u32));
|
2017-01-13 14:20:42 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
//0xac3f1fff
|
|
|
|
cardParamCommand(NTRCARD_CMD_HEADER_READ,0,NTRCARD_ACTIVATE|NTRCARD_nRESET|NTRCARD_CLK_SLOW|NTRCARD_BLK_SIZE(4)|NTRCARD_DELAY1(0x1FFF)|NTRCARD_DELAY2(0x3F),(u32*)(void*)buffer,0x1000/sizeof(u32));
|
|
|
|
}
|
|
|
|
//cardReadHeader (buffer);
|
|
|
|
}
|
|
|
|
|
|
|
|
void NTR_CmdReadData (u32 offset, void* buffer)
|
|
|
|
{
|
|
|
|
cardParamCommand (NTRCARD_CMD_DATA_READ, offset, ReadDataFlags | NTRCARD_ACTIVATE | NTRCARD_nRESET | NTRCARD_BLK_SIZE(1), (u32*)buffer, 0x200 / 4);
|
|
|
|
}
|
|
|
|
|
|
|
|
|