text: #ifndef	FLASH_LIB_H
  #define	FLASH_LIB_H
  
  #include <common.h>
  
  /* PIO operations max */
  #define	FLASH_PROGRAM_POLLS		100000
  
  /* 10 Seconds default */
  #define	FLASH_ERASE_SECTOR_TIMEOUT	(10*1000 /*SEC*/ )
  
  /* Flash device info structure */
  typedef struct flash_dev_s {
      char        name[24];               /* Bank Name */
      int		bank;			/* Bank 0 or 1 */
      unsigned int base;			/* Base address */
      int		sectors;		/* Sector count */
      int		lgSectorSize;		/* Log2(usable bytes/sector) */
      int		vendorID;		/* Expected vendor ID */
      int		deviceID;		/* Expected device ID */
      int		found;			/* Set if found by flashLibInit */
      int		swap;			/* Set for bank 1 if byte swap req'd */
  } flash_dev_t;
  
  #define FLASH_MAX_POS(dev) \
  	((dev)->sectors << (dev)->lgSectorSize)
  
  #define FLASH_SECTOR_POS(dev, sector) \
  	((sector) << (dev)->lgSectorSize)
  
  /* AMD 29F040 */
  #define FLASH0_BANK			0
  #define FLASH0_VENDOR_ID		0x01
  #define FLASH0_DEVICE_ID		0x49
  
  /* AMD29LV160DB */
  #define FLASH1_BANK			1
  #define FLASH1_VENDOR_ID		0x0001
  #define FLASH1_DEVICE_ID		0x2249
  
  extern	flash_dev_t			flashDev[];
  extern	int				flashDevCount;
  
  /*
   * Device pointers
   *
   * These must be kept in sync with the table in flashLib.c.
   */
  #define FLASH_DEV_BANK0_SA0		(&flashDev[0])
  #define FLASH_DEV_BANK0_SA1		(&flashDev[1])
  #define FLASH_DEV_BANK0_SA2		(&flashDev[2])
  #define FLASH_DEV_BANK0_LOW		(&flashDev[3]) /* 960K */
  #define FLASH_DEV_BANK0_BOOT		(&flashDev[4]) /* PLCC */
  #define FLASH_DEV_BANK0_HIGH		(&flashDev[5]) /* 512K PLCC shadow */
  
  unsigned long flash_init(void);
  int flashEraseSector(flash_dev_t *dev, int sector);
  int flashErase(flash_dev_t *dev);
  int flashRead(flash_dev_t *dev, int pos, char *buf, int len);
  int flashWrite(flash_dev_t *dev, int pos, char *buf, int len);
  int flashWritable(flash_dev_t *dev, int pos, int len);
  int flashDiag(flash_dev_t *dev);
  int flashDiagAll(void);
  
  ulong flash_get_size (vu_long *addr, flash_info_t *info);
  void flash_print_info  (flash_info_t *info);
  int  flash_erase (flash_info_t *info, int s_first, int s_last);
  int  write_buff  (flash_info_t *info, uchar *src, ulong addr, ulong cnt);
  
  /*
   * Flash info indices.
   */
  #define FLASH_BANK_KERNEL 0
  #define FLASH_BANK_BOOT   1
  #define FLASH_BANK_AUX    2
  #define FIRST_SECTOR      0
  
  #endif	/* !FLASH_LIB_H */
  