; Orange programmer module v1.15 for Orange4/5 ; (c) 2004-2015 CnCLab ; Hynix NAND Flash Memory. 4 bytes address, 2K page ;CHIP=HY27UF081G,131072K(2048),HY27UF08.HP4 ;VCC=3250 ;HY27UF081G2A 128MB - page=2K, Erase=128K ;HY27US08121 512Mbit ; 512KB=80000 Hex ; Primary tested HY27UF081G2A INFO="NAND FLASH Adapter" CDELAY=0 SOCKET=0 OPTIONS=f ALLPINS=48 ;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=Vcc,254,23 ; +5V PINO=Vcc,254,44 ; +5V PINO=GND,255,40 ; GND PINO=Vss,255,1 ; GND PINO=Vss,255,22 ; GND BUSO=PULLUP,255 R10=PAGE,H [!#SETUP] R10=0 [_CMD] ALE=0 CLE=1 DATAO=R0 ;cmd WE=N CLE=0 [INIT] CE=1,RDE=1,WE=1 ALE=0 CLE=0 ;PULLUP=1 P=100 RDE=1,CE=0 _CMD(0xFF) ;cmd RESET! RDE=1,CE=1 DATAO=Z P=10000 [_SENDADR] CLE=0,ALE=1 R0=ADR,DATAO=R0 ;ADR A0-A7 WE=N ;R0=/256,R0=&0xF,DATAO=R0 ;ADR A8-A15 R0=>>8,R0=&0x7,DATAO=R0 ;ADR A8-A15 WE=N R0=ADR ;R0=/4096,DATAO=R0 ;ADR A12-A19... R0=/2048,DATAO=R0 ;ADR A12-A19... WE=N R0=>>8 DATAO=R0 ;ADR A20... page! WE=N ALE=0 [_RDSTAT] RDE=1,CE=0 _CMD(70h) ;cmd ALE=1 DATAO=0xFF ; HiZ state P=15 ALE=0,RDE=0 P=15 R0=DATAI RDE=1 CE=1 [READ] RDE=1,CE=0 _CMD(0x00) ;cmd rd _SENDADR _CMD(0x30) ;cmd rd2 DATAO=0xFF ; HiZ state R0=DATAI P=25 ;Data Transfer from Cell to register ALE=0,RDE=0 R0=DATAI DATA=R0 RDE=1,CE=1 [READBLOCK] RDE=1,CE=0 _CMD(0x00) ;cmd rd _SENDADR _CMD(0x30) ;cmd rd2 DATAO=Z,R0=DATAI ; HiZ state P=25 ;Data Transfer from Cell to register 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 _SENDADR 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{PRINT=("Page write error!")} ;_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=0xFF ; HiZ state ALE=0 P=15 RDE=0 P=15 R0=DATAI RDE=1 P=15 RDE=0 P=15 R1=DATAI RDE=1 CE=1 PRINT=S("ID=%02lX %02lX",R0,R1) R0=*256,R0=+R1 ;PRINT=("ID=%02lX ",R0) R5=R0 _RDSTAT PRINT=L("Status=%02lX",R0) R0=R5 ;??? ["Erase"] R9=0 ;address cnt PRINT=P(0,$SIZE) LOOP=(0,16384){ RDE=1,CE=0 _CMD(0x60) ;cmd ALE=1 R0=R9 ; address ;Only address A18 to A27 valid while A12 to A17 is ignored. R0=/2048,DATAO=R0 ;ADR A8-A15 WE=N R0=>>8 DATAO=R0 ;ADR A16-A18... WE=N ALE=0 _CMD(0xD0) ;cmd program CE=1 P=5000 PRINT=P(R9) R9=+10000h ;64k можно 128K R9?>$SIZE{BREAK} } ;["!#Set Page"] ;GET=("Set Page",R10) ;R10=&0xFF