www.pudn.com > ejip.zip > Amd.java


package util;

import com.jopdesign.sys.Native;
/**
*	Flash programmer (for AMD Am29LV040).
*		read and write data to address 0x80000.
*
*	timing:
*		byte program: typ 9 us max. 300 us
*		sector erase: typ 0.7 s + 0.6 s max 15 s + 20 s
*
*	asumes Timer.java is initialized
*/


public class Amd {

	public static int read(int addr) {

		return Native.rdMem(addr+0x80000);
	}

	/** program and handle timeout (without wd handling!) */

	public static void program(int addr, int data) {

		int i;

		addr += 0x80000;

		Native.wrMem(0xaa, 0x80555);
		Native.wrMem(0x55, 0x802aa);
		Native.wrMem(0xa0, 0x80555);
		Native.wrMem(data, addr);

		int j = Native.rd(Native.IO_CNT);
		j += 350*Timer.us;						// maximum 350 us timeout
		data &= 0xff;

		for (;;) {
			if (Native.rdMem(addr) == data) break;
			if (j-Native.rd(Native.IO_CNT) < 0) break;
		}
	}

	/**
	*	erase one sector and handle wd.
	*/
	public static boolean erase(int addr) {

		int i;

		addr += 0x80000;

		Native.wrMem(0xaa, 0x80555);
		Native.wrMem(0x55, 0x802aa);
		Native.wrMem(0x80, 0x80555);
		Native.wrMem(0xaa, 0x80555);
		Native.wrMem(0x55, 0x802aa);
		Native.wrMem(0x30, addr);

		for (i=0; i<400; ++i) {					// maximum 40 s timeout
			try {
				Thread.sleep(100);
			} catch (Exception e) {}
			Timer.wd();
			if (Native.rdMem(addr) == 0xff) return true;
		}
		return false;
	}
}