1 /* 2 * Cisco router simulation platform. 3 * Copyright (c) 2005,2006 Christophe Fillot. 4 * 5 * NMC93C46/NMC93C56 Serial EEPROM. 6 */ 7 8 #ifndef __NMC93CX6_H__ 9 #define __NMC93CX6_H__ 10 11 #include <sys/types.h> 12 #include "utils.h" 13 #include "cisco_eeprom.h" 14 15 /* EEPROM types */ 16 enum { 17 EEPROM_TYPE_NMC93C46, 18 EEPROM_TYPE_NMC93C56, 19 }; 20 21 /* EEPROM data bit order */ 22 enum { 23 EEPROM_DORD_NORMAL = 0, 24 EEPROM_DORD_REVERSED, 25 }; 26 27 /* EEPROM debugging */ 28 enum { 29 EEPROM_DEBUG_DISABLED = 0, 30 EEPROM_DEBUG_ENABLED, 31 }; 32 33 /* EEPROM DOUT default status */ 34 enum { 35 EEPROM_DOUT_HIGH = 0, 36 EEPROM_DOUT_KEEP, 37 }; 38 39 /* 8 groups with 4 differents bits (clock,select,data_in,data_out) */ 40 #define NMC93CX6_MAX_EEPROM_PER_GROUP 16 41 42 /* NMC93C46 EEPROM command bit length */ 43 #define NMC93C46_CMD_BITLEN 9 44 45 /* NMC93C56 EEPROM command bit length */ 46 #define NMC93C56_CMD_BITLEN 11 47 48 /* NMC93C46 EEPROM data bit length */ 49 #define NMC93CX6_CMD_DATALEN 16 50 51 /* NMC93C46 EEPROM commands: SB (1) OP(2) Address(6/9) */ 52 #define NMC93CX6_CMD_CONTROL (0x1 | 0x0) 53 #define NMC93CX6_CMD_WRDS (0x1 | 0x0 | 0x00) 54 #define NMC93CX6_CMD_ERASE_ALL (0x1 | 0x0 | 0x08) 55 #define NMC93CX6_CMD_WRITE_ALL (0x1 | 0x0 | 0x10) 56 #define NMC93CX6_CMD_WREN (0x1 | 0x0 | 0x18) 57 #define NMC93CX6_CMD_READ (0x1 | 0x2) 58 #define NMC93CX6_CMD_WRITE (0x1 | 0x4) 59 #define NMC93CX6_CMD_ERASE (0x1 | 0x6) 60 61 struct nmc93cX6_eeprom_def { 62 u_int clock_bit; 63 u_int select_bit; 64 u_int din_bit; 65 u_int dout_bit; 66 }; 67 68 struct nmc93cX6_eeprom_state { 69 u_int cmd_len; 70 u_int cmd_val; 71 u_int state; 72 u_int dataout_pos; 73 u_int dataout_val; 74 }; 75 76 struct nmc93cX6_group { 77 u_int eeprom_type; 78 u_int nr_eeprom; 79 u_int eeprom_reg; 80 u_int reverse_data; 81 u_int dout_status; 82 int debug; 83 char *description; 84 const struct nmc93cX6_eeprom_def *def[NMC93CX6_MAX_EEPROM_PER_GROUP]; 85 struct nmc93cX6_eeprom_state state[NMC93CX6_MAX_EEPROM_PER_GROUP]; 86 struct cisco_eeprom *eeprom[NMC93CX6_MAX_EEPROM_PER_GROUP]; 87 }; 88 89 /* Handle write */ 90 void nmc93cX6_write(struct nmc93cX6_group *g,u_int data); 91 92 /* Returns the TRUE if the EEPROM is active */ 93 u_int nmc93cX6_is_active(struct nmc93cX6_group *g,u_int group_id); 94 95 /* Returns the DOUT bit value */ 96 u_int nmc93cX6_get_dout(struct nmc93cX6_group *g,u_int group_id); 97 98 /* Handle read */ 99 u_int nmc93cX6_read(struct nmc93cX6_group *p); 100 101 #endif /* __NMC93CX6_H__ */ 102