iPod Nano 2G NAND: Use the correct bit names for FMCSTAT

Looks like they were always off-by-one, so the wrong functions have been used to rectify this bug. This is now properly fixed.

No changes to the ipodnano2g binaries (bootloader, rockbox)

Change-Id: I19fe1b89f9e5d722f7e877d60f68fc3275c3642a
This commit is contained in:
Vencislav Atanasov 2025-04-18 16:35:57 +03:00 committed by Solomon Peachy
parent a0bfcd77c8
commit 7e2019fde9
2 changed files with 21 additions and 12 deletions

View file

@ -931,10 +931,10 @@
#define FMCTRL1_DOWRITEDATA (1 << 2) #define FMCTRL1_DOWRITEDATA (1 << 2)
#define FMCTRL1_CLEARWFIFO (1 << 6) #define FMCTRL1_CLEARWFIFO (1 << 6)
#define FMCTRL1_CLEARRFIFO (1 << 7) #define FMCTRL1_CLEARRFIFO (1 << 7)
#define FMCSTAT_RBB (1 << 0) #define FMCSTAT_RBBDONE (1 << 0)
#define FMCSTAT_RBBDONE (1 << 1) #define FMCSTAT_CMDDONE (1 << 1)
#define FMCSTAT_CMDDONE (1 << 2) #define FMCSTAT_ADDRDONE (1 << 2)
#define FMCSTAT_ADDRDONE (1 << 3) #define FMCSTAT_TRANSDONE (1 << 3)
#define FMCSTAT_BANK0READY (1 << 4) #define FMCSTAT_BANK0READY (1 << 4)
#define FMCSTAT_BANK1READY (1 << 5) #define FMCSTAT_BANK1READY (1 << 5)
#define FMCSTAT_BANK2READY (1 << 6) #define FMCSTAT_BANK2READY (1 << 6)

View file

@ -153,6 +153,15 @@ static uint32_t nand_wait_addrdone(void)
return 0; return 0;
} }
static uint32_t nand_wait_transdone(void)
{
long timeout = current_tick + HZ / 50;
while (!(FMCSTAT & FMCSTAT_TRANSDONE))
if (nand_timeout(timeout)) return 1;
FMCSTAT = FMCSTAT_TRANSDONE;
return 0;
}
static uint32_t nand_wait_chip_ready(uint32_t bank) static uint32_t nand_wait_chip_ready(uint32_t bank)
{ {
long timeout = current_tick + HZ / 50; long timeout = current_tick + HZ / 50;
@ -171,7 +180,7 @@ static void nand_set_fmctrl0(uint32_t bank, uint32_t flags)
static uint32_t nand_send_cmd(uint32_t cmd) static uint32_t nand_send_cmd(uint32_t cmd)
{ {
FMCMD = cmd; FMCMD = cmd;
return nand_wait_rbbdone(); return nand_wait_cmddone();
} }
static uint32_t nand_send_address(uint32_t page, uint32_t offset) static uint32_t nand_send_address(uint32_t page, uint32_t offset)
@ -180,7 +189,7 @@ static uint32_t nand_send_address(uint32_t page, uint32_t offset)
FMADDR0 = (page << 16) | offset; FMADDR0 = (page << 16) | offset;
FMADDR1 = (page >> 16) & 0xFF; FMADDR1 = (page >> 16) & 0xFF;
FMCTRL1 = FMCTRL1_DOTRANSADDR; FMCTRL1 = FMCTRL1_DOTRANSADDR;
return nand_wait_cmddone(); return nand_wait_addrdone();
} }
uint32_t nand_reset(uint32_t bank) uint32_t nand_reset(uint32_t bank)
@ -206,7 +215,7 @@ static uint32_t nand_wait_status_ready(uint32_t bank)
if (nand_timeout(timeout)) return 1; if (nand_timeout(timeout)) return 1;
FMDNUM = 0; FMDNUM = 0;
FMCTRL1 = FMCTRL1_DOREADDATA; FMCTRL1 = FMCTRL1_DOREADDATA;
if (nand_wait_addrdone()) return 1; if (nand_wait_transdone()) return 1;
if ((FMFIFO & NAND_STATUS_READY)) break; if ((FMFIFO & NAND_STATUS_READY)) break;
FMCTRL1 = FMCTRL1_CLEARRFIFO; FMCTRL1 = FMCTRL1_CLEARRFIFO;
} }
@ -238,7 +247,7 @@ static uint32_t nand_transfer_data_collect(uint32_t direction)
while ((DMAALLST & DMAALLST_DMABUSY3)) while ((DMAALLST & DMAALLST_DMABUSY3))
if (nand_timeout(timeout)) return 1; if (nand_timeout(timeout)) return 1;
if (!direction) commit_discard_dcache(); if (!direction) commit_discard_dcache();
if (nand_wait_addrdone()) return 1; if (nand_wait_transdone()) return 1;
if (!direction) FMCTRL1 = FMCTRL1_CLEARRFIFO | FMCTRL1_CLEARWFIFO; if (!direction) FMCTRL1 = FMCTRL1_CLEARRFIFO | FMCTRL1_CLEARWFIFO;
else FMCTRL1 = FMCTRL1_CLEARRFIFO; else FMCTRL1 = FMCTRL1_CLEARRFIFO;
return 0; return 0;
@ -308,10 +317,10 @@ static uint32_t nand_get_chip_type(uint32_t bank)
FMANUM = 0; FMANUM = 0;
FMADDR0 = 0; FMADDR0 = 0;
FMCTRL1 = FMCTRL1_DOTRANSADDR; FMCTRL1 = FMCTRL1_DOTRANSADDR;
if (nand_wait_cmddone()) return nand_unlock(0xFFFFFFFC); if (nand_wait_addrdone()) return nand_unlock(0xFFFFFFFC);
FMDNUM = 4; FMDNUM = 4;
FMCTRL1 = FMCTRL1_DOREADDATA; FMCTRL1 = FMCTRL1_DOREADDATA;
if (nand_wait_addrdone()) return nand_unlock(0xFFFFFFFB); if (nand_wait_transdone()) return nand_unlock(0xFFFFFFFB);
result = FMFIFO; result = FMFIFO;
FMCTRL1 = FMCTRL1_CLEARRFIFO; FMCTRL1 = FMCTRL1_CLEARRFIFO;
return nand_unlock(result); return nand_unlock(result);
@ -494,7 +503,7 @@ uint32_t nand_block_erase(uint32_t bank, uint32_t page)
FMANUM = 2; FMANUM = 2;
FMADDR0 = page; FMADDR0 = page;
FMCTRL1 = FMCTRL1_DOTRANSADDR; FMCTRL1 = FMCTRL1_DOTRANSADDR;
if (nand_wait_cmddone()) return nand_unlock(1); if (nand_wait_addrdone()) return nand_unlock(1);
if (nand_send_cmd(NAND_CMD_ERASECNFRM)) return nand_unlock(1); if (nand_send_cmd(NAND_CMD_ERASECNFRM)) return nand_unlock(1);
if (nand_wait_status_ready(bank)) return nand_unlock(1); if (nand_wait_status_ready(bank)) return nand_unlock(1);
return nand_unlock(0); return nand_unlock(0);
@ -690,7 +699,7 @@ static uint32_t nand_block_erase_fast(uint32_t page)
FMANUM = 2; FMANUM = 2;
FMADDR0 = page; FMADDR0 = page;
FMCTRL1 = FMCTRL1_DOTRANSADDR; FMCTRL1 = FMCTRL1_DOTRANSADDR;
if (nand_wait_cmddone()) if (nand_wait_addrdone())
{ {
rc |= 1 << i; rc |= 1 << i;
continue; continue;