Charles.Forsyth20060303644188019 years agoHistory
82 lines · 1.9 KB · C
RawDownload
typedef struct Flash Flash;typedef struct Flashpart Flashpart;typedef struct Flashregion Flashregion; /* * logical partitions */enum {	Maxflashpart = 8}; struct Flashpart {	char*	name;	ulong	start;	ulong	end;}; enum {	Maxflashregion = 8}; /* * physical erase block regions */struct Flashregion {	int	n;	/* number of blocks in region */	ulong	start;	/* physical base address (allowing for banks) */	ulong	end;	ulong	erasesize;}; /* * structure defining a flash memory card */struct Flash {	QLock;	/* interlock on flash operations */	Flash*	next; 	/* the following are filled in by devflash before Flash.reset called */	char*	name;	void*	addr;	ulong	size;	int	(*reset)(Flash*); 	/* the following are filled in by the reset routine */	int	(*eraseall)(Flash*);	int	(*erasezone)(Flash*, int);	int	(*write)(Flash*, ulong, void*, long);	/* writes of correct width and alignment */	int	(*suspend)(Flash*);	int	(*resume)(Flash*); 	/* the following might be filled in by either archflashreset or the reset routine */	int	nr;	Flashregion	regions[Maxflashregion]; 	uchar	id;	/* flash manufacturer ID */	uchar	devid;	/* flash device ID */	int	width;	/* bytes per flash line */	int	erasesize;	/* size of erasable unit (accounting for width) */	void*	data;		/* flash type routines' private storage, or nil */	ulong	unusable;	/* bit mask of unusable sections */	Flashpart	part[Maxflashpart];	/* logical partitions */	int	protect;	/* software protection */}; /* * called by link routine of driver for specific flash type: arguments are * conventional name for card type/model, and card driver's reset routine. */void	addflashcard(char*, int (*)(Flash*)); /* * called by devflash.c:/^flashreset; if flash exists, * sets type, address, and size in bytes of flash * and returns 0; returns -1 if flash doesn't exist */int	archflashreset(char*, void**, long*); /* * enable/disable write protect */void	archflashwp(int);