/* $NetBSD: cfi.h,v 1.6 2011/12/17 19:42:41 phx Exp $ */ #ifndef _CFI_H_ #define _CFI_H_ #include #include /* * minimum size to bus_space_map for probe/identify QRY: * larget offset needed is CFI_QUERY_MODE_ALT_ADDRESS * scaled by maximum attempted port width, so * min >= (0x555 * sizeof(uint32_t)) */ #define CFI_QRY_MIN_MAP_SIZE 0x2000 typedef enum { CFI_STATE_DATA_ARRAY = 0, CFI_STATE_QUERY, /* TBD */ } cfi_state_t; struct cfi_erase_blk_info { uint16_t z; /* Erase Blocks are z * 256 bytes */ uint16_t y; /* y+1 = #Erase Blocks in region */ }; /* * CFI Query structure */ struct cfi_query_data { /* Query info */ uint8_t qry[3]; /* { 'Q', 'R', 'Y' } */ uint16_t id_pri; /* primary comand set ID */ uint16_t addr_pri; /* primary table addr */ uint16_t id_alt; /* alternate command set ID */ uint16_t addr_alt; /* alternate table addr */ /* System Interface info */ uint8_t vcc_min; /* min Vcc */ uint8_t vcc_max; /* max Vcc */ uint8_t vpp_min; /* min Vpp */ uint8_t vpp_max; /* max Vpp */ uint8_t write_word_time_typ; /* typ 1-word timeout, 1<cfi_0002_stats.field++ #else #define CFI_0002_STATS_INIT(dev, cfi) #define CFI_0002_STATS_INC(cfi, field) #endif /* CFI_0002_STATS */ struct cfi { bus_space_tag_t cfi_bst; bus_space_handle_t cfi_bsh; cfi_state_t cfi_state; uint8_t cfi_portwidth; /* port width, 1<cfi_ops.cfi_reset != NULL); cfi->cfi_ops.cfi_reset(cfi); } static inline int cfi_erase_sector(struct cfi * const cfi, flash_off_t offset) { KASSERT(cfi->cfi_ops.cfi_erase_sector != NULL); return cfi->cfi_ops.cfi_erase_sector(cfi, offset); } static inline int cfi_program_word(struct cfi * const cfi, flash_off_t offset) { KASSERT(cfi->cfi_ops.cfi_program_word != NULL); return cfi->cfi_ops.cfi_program_word(cfi, offset); } extern const struct nor_interface nor_interface_cfi; extern bool cfi_probe(struct cfi * const); extern bool cfi_identify(struct cfi * const); extern void cfi_print(device_t, struct cfi * const); extern void cfi_reset_default(struct cfi * const); extern void cfi_reset_std(struct cfi * const); extern void cfi_reset_alt(struct cfi * const); extern void cfi_cmd(struct cfi * const, bus_size_t, uint32_t); #endif /* _CFI_H_ */