/* * Cisco router simulation platform. * Copyright (c) 2005,2006 Christophe Fillot. * * NMC93C46/NMC93C56 Serial EEPROM. */ #ifndef __NMC93CX6_H__ #define __NMC93CX6_H__ #include #include "utils.h" #include "cisco_eeprom.h" /* EEPROM types */ enum { EEPROM_TYPE_NMC93C46, EEPROM_TYPE_NMC93C56, }; /* 8 groups with 4 differents bits (clock,select,data_in,data_out) */ #define NMC93CX6_MAX_EEPROM_PER_GROUP 8 /* NMC93C46 EEPROM command bit length */ #define NMC93C46_CMD_BITLEN 9 /* NMC93C56 EEPROM command bit length */ #define NMC93C56_CMD_BITLEN 11 /* NMC93C46 EEPROM data bit length */ #define NMC93CX6_CMD_DATALEN 16 /* NMC93C46 EEPROM commands: SB (1) OP(2) Address(6/9) */ #define NMC93CX6_CMD_CONTROL (0x1 | 0x0) #define NMC93CX6_CMD_WRDS (0x1 | 0x0 | 0x00) #define NMC93CX6_CMD_ERASE_ALL (0x1 | 0x0 | 0x08) #define NMC93CX6_CMD_WRITE_ALL (0x1 | 0x0 | 0x10) #define NMC93CX6_CMD_WREN (0x1 | 0x0 | 0x18) #define NMC93CX6_CMD_READ (0x1 | 0x2) #define NMC93CX6_CMD_WRITE (0x1 | 0x4) #define NMC93CX6_CMD_ERASE (0x1 | 0x6) struct nmc93cX6_eeprom_def { u_int clock_bit; u_int select_bit; u_int din_bit; u_int dout_bit; }; struct nmc93cX6_eeprom_state { u_int cmd_len; u_int cmd_val; u_int state; u_int dataout_pos; u_int dataout_val; }; struct nmc93cX6_group { u_int eeprom_type; u_int nr_eeprom; u_int eeprom_reg; char *description; int debug; const struct nmc93cX6_eeprom_def *def[NMC93CX6_MAX_EEPROM_PER_GROUP]; struct nmc93cX6_eeprom_state state[NMC93CX6_MAX_EEPROM_PER_GROUP]; struct cisco_eeprom *eeprom[NMC93CX6_MAX_EEPROM_PER_GROUP]; }; /* Handle write */ void nmc93cX6_write(struct nmc93cX6_group *g,u_int data); /* Handle read */ u_int nmc93cX6_read(struct nmc93cX6_group *p); #endif /* __NMC93CX6_H__ */