; Orange programmer module v1.10 for O3,O4,O5 ; (c) 2004 CnCLab ; Samsung NAND Flash Memory ; CHIP=KM29W040,512Kx8(32),KM29W040.HPL ; CHIP=K9F4008,512Kx8(32),KM29W040.HPL ; tested with Orange4/5 SOCKET=0 ALLPINS=44 ;Input pins: PINI=P0,0,18 PINI=P1,1,19 PINI=P2,2,20 PINI=P3,3,21 PINI=P4,4,24 PINI=P5,5,25 PINI=P6,6,26 PINI=P7,7,27 ;Output pins: PINO=CLE,8,2 ; Command Latch Enable PINO=ALE,9,3 ; Address Latch Enable PINO=CE,10,43 ; Chip Enable PINO=RDE,11,42 ; Read Enable PINO=WE,12,4 ; 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 CDELAY=2 [INIT] DATAO=Z R0=DATAI CE=1,RDE=1,WE=1 ALE=0 CLE=0 P=10 [_RDB] R0[0]=P0,R0[1]=P1,R0[2]=P2,R0[3]=P3, R0[4]=P4,R0[5]=P5,R0[6]=P6,R0[7]=P7 [_RDSTAT] RDE=1,CE=0,CLE=1,ALE=0 DATAO=70h ;cmd WE=0,WE=1 CLE=0,ALE=1 DATAO=Z ; HiZ state R0=DATAI P=12 ALE=0,RDE=0 P=15 R0=DATAI RDE=1 CE=1 [READ] RDE=1,CE=0 CLE=1,ALE=0 DATAO=0 ;cmd WE=0,WE=1 CLE=0,ALE=1 R0=ADR,DATAO=R0 ;ADR A0-A7 WE=0,WE=1 R0=/256,DATAO=R0 ;ADR A8-A15 WE=0,WE=1 R0=/256,DATAO=R0 ;ADR A16-A18... WE=0,WE=1 DATAO=Z ; HiZ state R0=DATAI P=14 ;Data Transfer from Cell to Register tR max 15 us ALE=0,RDE=0 R0=DATAI DATA=R0 RDE=1,CE=1 [READBLOCK] RDE=1,CE=0,CLE=1,ALE=0 DATAO=0 ;cmd WE=0,WE=1 CLE=0,ALE=1 R0=ADR,DATAO=R0 ;ADR A0-A7 WE=0,WE=1 R0=/256,DATAO=R0 ;ADR A8-A15 WE=0,WE=1 R0=/256,DATAO=R0 ;ADR A16-A18... WE=0,WE=1 DATAO=Z ; HiZ state R0=DATAI P=14 ;Data Transfer from Cell to Register tR max 15 us ALE=0 LOOP($BLOCKSIZE){ RDE=0 R0=DATAI DATA=R0 RDE=1 ADR=+1 } CE=1 [WRITEBLOCK] RDE=1,CE=0,CLE=1,ALE=0 ;IDISABLE DATAO=0x80 ;cmd WE=0,WE=1 CLE=0 ALE=1 R0=ADR,DATAO=R0 ;ADR A0-A7 WE=0,WE=1 R0=/256,DATAO=R0 ;ADR A8-A15 WE=0,WE=1 R0=/256,DATAO=R0 ;ADR A16-A18... WE=0,WE=1 ALE=0 LOOP($BLOCKSIZE){ ;send data block R0=DATA DATAO=R0 WE=0,WE=1 ADR=+1 } CLE=1,ALE=0 DATAO=0x10 ;cmd program WE=0,WE=1 ;IENABLE ;P=500 ;CE=1 P=10 ;_RDSTAT ;PRINT=S("Status0=%02lX",R0) CLE=0 LOOP=(0,10000){ _RDSTAT R1=R0 R0=&0x40 ;busy bit R0?!0{BREAK} P=10 } PRINT=S("Write Status=%02lX",R1) 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=0,WE=1 ALE=1,CLE=0 DATAO=0 ;ADR A0-A7 WE=0,WE=1 DATAO=Z ; HiZ state R0=DATAI ; 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=("ID=%02lX %02lX",R0,R1) R0=*256,R0=|R1 [ReadStatus] _RDSTAT PRINT=("Status=%02lXH",R0) [Erase] PRINT=P(0,$SIZE) LOOP=(0,127){ RDE=1,CE=0,CLE=1,ALE=0 DATAO=0x60 ;cmd WE=0,WE=1 CLE=0 ALE=1 R0=ADR R0=/256,DATAO=R0 ;ADR A8-A15 WE=0,WE=1 R0=/256,DATAO=R0 ;ADR A16-A18... WE=0,WE=1 CLE=1,ALE=0 DATAO=0xD0 ;cmd program WE=0,WE=1 CLE=0 CE=1 P=10000 ADR=+4096 ;block size R0=ADR PRINT=P(R0) }