ref: babf901b4a508c3ec5d1f89655f10377bbdf9637
dir: /os/pc/flashif.h/
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);