; Orange programmer module v1.2 for Orange4/5 ; (c) 2009-2015 CnCLab ; Read NAND Flash ONFI ;CHIP=NAND-ONFI,256(256),nandonfi.HP4 ;VCC=3250 ; tested: MACRONIX MX30LF4G18AC INFO="NAND FLASH Adapter" SOCKET=0 CDELAY=0 ALLPINS=48 OPTIONS=f ;Input pins: PINI=P0,0,29 PINI=P1,1,30 PINI=P2,2,31 PINI=P3,3,32 PINI=P4,4,41 PINI=P5,5,42 PINI=P6,6,43 PINI=P7,7,44 ;Output pins: PINO=CLE,8,16 ; Command Latch Enable PINO=ALE,9,17 ; Address Latch Enable PINO=CE,10,9 ; Chip Enable PINO=RDE,11,8 ; Read Enable PINO=WE,12,18 ; Write Enable BUSO=DATAO,0 BUSI=DATAI,0 ;Power pins: PINO=Vcc1,254,23 ; +5V PINO=Vcc2,254,44 ; +5V PING=GND,255,40 ; GND PING=Vss1,255,1 ; GND PING=Vss2,255,22 ; GND BUSO=PULLUP,255 R10=PAGE,H R12=Erase,L,Cancel,Erase [!#SETUP] R10=0 [_CMD] ALE=0 CLE=1 DATAO=R0 ;cmd WE=0 WE=1 CLE=0 [INIT] DATAO=Z CE=1,RDE=1,WE=1 ALE=1 CLE=1 ;PULLUP=1 P=20000 CLE=1,RDE=1,CE=0 _CMD(0xFF) ;cmd rst ALE=1,CLE=1,CE=1 P=20000 RDE=1,CE=0,CLE=1,ALE=0 DATAO=90h ;cmd readid WE=N ALE=1,CLE=0 DATAO=0 ;ADR A0-A7 WE=N DATAO=Z ; HiZ state ALE=0,P=15 RDE=0,P=15 R0=DATAI ; RDE=1 CE=1 R0?0xFF{PRINT=A("Chip answer error [%02XH]\nContinue?",R0) ;check id RA?0{EXIT} } [_SENDADR] CLE=0,ALE=1 R0=ADR,DATAO=R0 ;ADR A0-A7 WE=N R0=/256,R0=&0x7,DATAO=R0 ;ADR A8-A15 WE=N R0=ADR R0=/$BLOCKSIZE,DATAO=R0 ;ADR A12-A19... WE=N R0=>>8 DATAO=R0 ;ADR A20...A27 WE=N DATAO=R10 ;ADR A28...A29 from page! WE=N ALE=0 [_RDSTAT] RDE=1,CE=0 _CMD(70h) ;cmd DATAO=00h ;adr 0 WE=N ALE=1 DATAO=Z ; HiZ state P=15 ALE=0,RDE=0 P=15 R0=DATAI RDE=1 CE=1 [READ] RDE=1,CE=0 _CMD(0xEC) ;cmd rd ALE=1 DATAO=00h ;adr 0 WE=N DATAO=Z ; HiZ state R0=DATAI P=28 $MODE?!0{P=$MODE} ALE=0,RDE=0 R0=DATAI DATA=R0 RDE=1,CE=1 [READBLOCK] RDE=1,CE=0 _CMD(0xEC) ;cmd rd ALE=1 DATAO=00h ;adr 0 WE=N P=100 DATAO=Z,R0=DATAI ; HiZ state LOOP($BLOCKSIZE){ RDE=0,P=1 DATA=DATAI RDE=1 ADR=+1 } CE=1 CE=0 _CMD(0xFF) ;rst CE=1 [READID] RDE=1,CE=0,CLE=1,ALE=0 DATAO=90h ;cmd WE=N ALE=1,CLE=0 DATAO=0 ;ADR A0-A7 WE=N DATAO=Z ; HiZ state ALE=0 P=10 RDE=0,P=10 R0=DATAI ;1 RDE=1,P=10,RDE=0,P=10 R1=DATAI ;2 RDE=1,P=10,RDE=0,P=10 R2=DATAI ;3 RDE=1,P=10,RDE=0,P=10 R3=DATAI ;4 RDE=1,P=10,RDE=0,P=10 R4=DATAI ;5 RDE=1 CE=1 PRINT=S("ID=%02lX %02lX %02lX %02lX %02lX",R0,R1,R2,R3,R4) R0=<<8,R0=|R1 ;Return R1 [_GETWORD] R1=DATA,ADR=+1 R0=DATA,ADR=+1,R0=<<8,R1=|R0 ;Return R1 [_GETDWORD] R1=DATA,ADR=+1 ;PRINT=L("dat %02X %02X\n",R0,R1) R0=DATA,ADR=+1,R0=<<8,R1=|R0 ;PRINT=L("dat %02X %02X\n",R0,R1) R0=DATA,ADR=+1,R0=<<16,R1=|R0 ;PRINT=L("dat %02X %02X\n",R0,R1) R0=DATA,ADR=+1,R0=<<24,R1=|R0 ;PRINT=L("dat %02X %02X\n",R0,R1) [~!#Info] ADR=0 R0=DATA R0?!0x4F{ PRINT=E("ONFI data not read!") EXIT } ADR=0x20 PRINT=T("Manufacturer: ") LOOP(12){ R0=DATA R0?<0x80{ PRINT=T("%c",R0) } ADR=+1 } PRINT=T("\nDevice: ") LOOP(20){ R0=DATA R0?<0x80{ PRINT=T("%c",R0) } ADR=+1 } R0=DATA,ADR=+1 R1=DATA,ADR=+1 R2=DATA,ADR=+1 PRINT=T("\nJEDEC ID: %02X %02X %02X",R0,R1,R2) ADR=0x50 _GETDWORD PRINT=T("\nPage size: %u",R1) _GETWORD PRINT=T("\nSpare size: %u",R1) ;86 _GETDWORD PRINT=T("\nPartial page: %u",R1) ADR=92 ;0x5C _GETDWORD PRINT=T("\nPages per block: %u",R1) ;96-99 _GETDWORD PRINT=T("\nBlocks per LUN: %u",R1) ;100 R1=DATA,ADR=+1 PRINT=T("\nLUNs per chip: %u",R1) ADR=133 _GETWORD PRINT=T("\nPROGRAM PAGE time: %u us",R1) ADR=137 _GETWORD PRINT=T("\nPAGE READ time: %u us",R1) PRINT=T("") ;end