; Orange programmer module v1.13 for Orange4/5 ; (c) 2009-2011 CnCLab ; Samsung & Hynix NAND Flash Memory 4 bytes addr ECC ; Erase block - 16K ;CHIP=K9F1208U ECC,67584K(528),k9k1g08e.HP4 ;VCC=3250 ;CHIP=K9K1G08U ECC,135168K(528),k9k1g08e.HP4 ;VCC=3250 ;Hynix ;CHIP=HY27US08121 ECC,67584K(528),k9k1g08e.HP4 ;VCC=3250 ; tested: HY27US08121B INFO="NAND FLASH Adapter" SOCKET=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 ; PINO=Vcc2,254,44 ; PINO=GND, 255,40 ; PINO=Vss1,255,1 ; PINO=Vss2,255,22 ; CDELAY=1 BUSO=PULLUP,255 R11=BLOCK,H R12=Erase,L,Cancel,Erase [!#SETUP] R11=0 [INIT] DATAO=Z CE=1,RDE=1,WE=1 ALE=0 CLE=0 PULLUP=1 R0=DATAI P=10 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} } [_SENDADRB] CLE=0,ALE=1 DATAO=0 ;ADR A0-A7 WE=N R0=ADR R0=/$BLOCKSIZE,DATAO=R0 ;ADR A9-A16 WE=N R0=>>8 DATAO=R0 ;ADR A17-A24... page0-1 WE=N R0=>>8 DATAO=R0 ;ADR A25...A26 page2-3 WE=N ALE=0 [_CMD] ALE=0 CLE=1 DATAO=R0 ;cmd WE=0 WE=1 CLE=0 [_RDSTAT] RDE=1,CE=0 _CMD(70h) ;cmd ALE=1 DATAO=Z ; HiZ state R0=DATAI P=15 ALE=0,RDE=0 P=15 R0=DATAI RDE=1 CE=1 [_READ] RDE=1,CE=0 R0=ADR R0=/256 R0=&1 _CMD ;cmd rd 00/01 _SENDADRB ;_CMD(0x30) ;cmd rd2 DATAO=Z ; HiZ state R0=DATAI P=25 ALE=0,RDE=0 R0=DATAI DATA=R0 RDE=1,CE=1 [READBLOCK] RDE=1,CE=0 _CMD(0x00) ;cmd rd _SENDADRB ;_CMD(0x30) ;cmd rd2 DATAO=Z,R0=DATAI ; HiZ state P=25 LOOP($BLOCKSIZE){ RDE=0 DATA=DATAI RDE=1 ADR=+1 } CE=1 CE=0 _CMD(0xFF) ;rst CE=1 [WRITEINIT] ;WP=1 P=50 [WRITEBLOCK] RDE=1,CE=0 _CMD(0x80) ;cmd _SENDADRB ALE=0 LOOP($BLOCKSIZE){ R0=DATA DATAO=R0 WE=N ADR=+1 } _CMD(0x10) ;cmd program ;P=500 ;CE=1 P=10 ;_RDSTAT ;PRINT=S("Status0=%02lX",R0) CLE=0 LOOP=(0,1000){ _RDSTAT ;PRINT=S("Write Status=%02lX",R0) R0=&0x40 ;busy bit R0?!0{BREAK} } R0?0{_RDSTAT, PRINT=("Page write error [%02X]!",R0)} ;_RDSTAT ;PRINT=S("Status=%02lX",R0) [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=15 RDE=0,P=15 R0=DATAI ;1 RDE=1,P=15 RDE=0,P=15 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 CE=1 PRINT=S("ID=%02lX %02lX %02lX %02lX",R0,R1,R2,R3) R0=<<8,R0=|R1 R5=R0 _RDSTAT PRINT=L("Status=%02lX",R0) R0=R5 ; Enter HEX block address (16 Kb bloks) ["Erase Block"] ;??? GET=("Enter Block address",R11) RA?0{EXIT} ;LOOP=(0,127){ RDE=1,CE=0 _CMD(0x60) ;cmd ;Only address A14 to A26 is valid while A9 to A13 is ignored. ALE=1 R0=R11 R0=/$BLOCKSIZE DATAO=R0 ;ADR A9-A16 WE=N R0=>>8 DATAO=R0 ;ADR A17-A24... page0-1 WE=N R0=>>8 DATAO=R0 ;ADR A25...A26 page2-3 WE=N ALE=0 _CMD(0xD0) ;cmd program CE=1 P=50000 ;ADR=+4096 ;} [Erase] R13=$SIZE R13=/16896 ;16384+512 - erase block size! PRINT=S("Erase %u blocks...\n",R13) ;Only address A14 to A26 is valid while A9 to A13 is ignored. R11=0 R0=R13,R0=*32 PRINT=P(R11,R0) LOOP=(R13){ ;PRINT=S("Erase %u",R11) PRINT=P(R11) RDE=1,CE=0 _CMD(0x60) ;cmd ALE=1 ;only addresses A14 to A25 (highest address depends on device density) are valid, A9 to A13 are ignored. DATAO=R11 ;ADR A9-A16 WE=N R0=R11,R0=>>8 DATAO=R0 ;ADR A17-A24... page0-1 WE=N R0=>>8 DATAO=R0 ;ADR A25...A26 page2-3 WE=N ALE=0 _CMD(0xD0) ;cmd program CE=1 P=3000 R11=+32 ;A9-A14 }