static inline int WriteNandSectors(u32 sector_no, u32 numsectors, u8 *in) { if (emunand_header) { if (sector_no == 0) { int errorcode = sdmmc_sdcard_writesectors(emunand_header, 1, in); if (errorcode) return errorcode; sector_no = 1; numsectors--; in += 0x200; } return sdmmc_sdcard_writesectors(sector_no + emunand_offset, numsectors, in); } else return sdmmc_nand_writesectors(sector_no, numsectors, in); }
void emunand_writesectors(uint32_t sector_no, uint32_t numsectors, uint8_t *out, unsigned int partition) { PartitionInfo info; u8 myCtr[16]; for (int i = 0; i < 16; i++) { myCtr[i] = NANDCTR[i]; } info.ctr = myCtr; info.buffer = out; info.size = numsectors * 0x200; info.keyY = NULL; add_ctr(info.ctr, partition / 16); switch (partition) { case TWLN : info.keyslot = 0x3; break; case TWLP : info.keyslot = 0x3; break; case AGB_SAVE : info.keyslot = 0x7; break; case FIRM0 : info.keyslot = 0x6; break; case FIRM1 : info.keyslot = 0x6; break; case CTRNAND : info.keyslot = 0x4; break; } add_ctr(info.ctr, sector_no * 0x20); DecryptPartition(&info); sdmmc_sdcard_writesectors(sector_no + partition / 0x200, numsectors, out); //Stubbed, i don't wanna risk }
DRESULT disk_write ( BYTE pdrv, /* Physical drive nmuber (0..) */ const BYTE *buff, /* Data to be written */ DWORD sector, /* Sector address (LBA) */ UINT count /* Number of sectors to write (1..128) */ ) { if (sdmmc_sdcard_writesectors(sector,count,buff)) return RES_PARERR; return RES_OK; }
//--------------------------------------------------------------------------------- void sdmmcMsgHandler(int bytes, void *user_data) { //--------------------------------------------------------------------------------- FifoMessage msg; int retval; fifoGetDatamsg(FIFO_SDMMC, bytes, (u8*)&msg); switch (msg.type) { case SDMMC_SD_READ_SECTORS: sdmmc_sdcard_readsectors(msg.sdParams.startsector, msg.sdParams.numsectors, msg.sdParams.buffer); break; case SDMMC_SD_WRITE_SECTORS: sdmmc_sdcard_writesectors(msg.sdParams.startsector, msg.sdParams.numsectors, msg.sdParams.buffer); break; } }