comparison romdb.c @ 772:1b82b282b829

Less broken EEPROM support
author Michael Pavone <pavone@retrodev.com>
date Fri, 17 Jul 2015 22:16:33 -0700
parents a3b90f746dcf
children 41dc895e85ff
comparison
equal deleted inserted replaced
771:0565b2c1a034 772:1b82b282b829
78 { 78 {
79 case I2C_START: 79 case I2C_START:
80 case I2C_ADDRESS_HI: 80 case I2C_ADDRESS_HI:
81 case I2C_ADDRESS: 81 case I2C_ADDRESS:
82 case I2C_WRITE: 82 case I2C_WRITE:
83 state->latch = state->host_sda << 7 | state->latch >> 1; 83 state->latch = state->host_sda | state->latch << 1;
84 state->counter--; 84 state->counter--;
85 if (!state->counter) { 85 if (!state->counter) {
86 switch (state->state & 0x7F) 86 switch (state->state & 0x7F)
87 { 87 {
88 case I2C_START: 88 case I2C_START:
127 state->counter = 8; 127 state->counter = 8;
128 } 128 }
129 break; 129 break;
130 case I2C_ADDRESS_HI_ACK: 130 case I2C_ADDRESS_HI_ACK:
131 state->state = I2C_ADDRESS; 131 state->state = I2C_ADDRESS;
132 state->counter = 8;
132 break; 133 break;
133 case I2C_ADDRESS_ACK: 134 case I2C_ADDRESS_ACK:
134 state->state = I2C_WRITE; 135 state->state = I2C_WRITE;
136 state->counter = 8;
135 break; 137 break;
136 case I2C_READ: 138 case I2C_READ:
137 state->counter--; 139 state->counter--;
138 if (!state->counter) { 140 if (!state->counter) {
139 state->state = I2C_READ_ACK; 141 state->state = I2C_READ_ACK;
140 } 142 }
141 break; 143 break;
142 case I2C_READ_ACK: 144 case I2C_READ_ACK:
143 state->state = I2C_READ; 145 state->state = I2C_READ;
146 state->counter = 8;
144 break; 147 break;
145 case I2C_WRITE_ACK: 148 case I2C_WRITE_ACK:
146 state->state = I2C_WRITE; 149 state->state = I2C_WRITE;
150 state->counter = 8;
147 break; 151 break;
148 } 152 }
149 } else if (~val & state->scl) { 153 } else if (~val & state->scl) {
150 //high to low transition 154 //high to low transition
151 switch (state->state & 0x7F) 155 switch (state->state & 0x7F)
312 if (!map) { 316 if (!map) {
313 fprintf(stderr, "Could not find EEPROM map for address %X\n", address); 317 fprintf(stderr, "Could not find EEPROM map for address %X\n", address);
314 exit(1); 318 exit(1);
315 } 319 }
316 printf("EEPROM word write: %X - %X\n", address, value); 320 printf("EEPROM word write: %X - %X\n", address, value);
321 if (map->scl_mask) {
322 set_scl(&gen->eeprom, (value & map->scl_mask) != 0);
323 printf("scl: %d, state: %s, counter: %d, latch: %X\n", (value & map->scl_mask) != 0, i2c_states[gen->eeprom.state], gen->eeprom.counter, gen->eeprom.latch);
324 }
317 if (map->sda_write_mask) { 325 if (map->sda_write_mask) {
318 printf("sda: %d\n", (value & map->sda_write_mask) != 0); 326 printf("sda: %d\n", (value & map->sda_write_mask) != 0);
319 set_host_sda(&gen->eeprom, (value & map->sda_write_mask) != 0); 327 set_host_sda(&gen->eeprom, (value & map->sda_write_mask) != 0);
320 }
321 if (map->scl_mask) {
322 set_scl(&gen->eeprom, (value & map->scl_mask) != 0);
323 printf("scl: %d, state: %s, counter: %d\n", (value & map->scl_mask) != 0, i2c_states[gen->eeprom.state], gen->eeprom.counter);
324 } 328 }
325 return context; 329 return context;
326 } 330 }
327 331
328 void * write_eeprom_i2c_b(uint32_t address, void * context, uint8_t value) 332 void * write_eeprom_i2c_b(uint32_t address, void * context, uint8_t value)
341 } else { 345 } else {
342 expanded = value << 8; 346 expanded = value << 8;
343 mask = 0xFF00; 347 mask = 0xFF00;
344 } 348 }
345 printf("EEPROM byte write: %X - %X (using mask %X and expanded val %X)\n", address, value, mask, expanded); 349 printf("EEPROM byte write: %X - %X (using mask %X and expanded val %X)\n", address, value, mask, expanded);
350 if (map->scl_mask & mask) {
351 printf("scl: %d, state: %s\n", (expanded & map->scl_mask) != 0, i2c_states[gen->eeprom.state]);
352 set_scl(&gen->eeprom, (expanded & map->scl_mask) != 0);
353 }
346 if (map->sda_write_mask & mask) { 354 if (map->sda_write_mask & mask) {
347 printf("sda: %d\n", (expanded & map->sda_write_mask) != 0); 355 printf("sda: %d\n", (expanded & map->sda_write_mask) != 0);
348 set_host_sda(&gen->eeprom, (expanded & map->sda_write_mask) != 0); 356 set_host_sda(&gen->eeprom, (expanded & map->sda_write_mask) != 0);
349 }
350 if (map->scl_mask & mask) {
351 printf("scl: %d, state: %s\n", (expanded & map->scl_mask) != 0, i2c_states[gen->eeprom.state]);
352 set_scl(&gen->eeprom, (expanded & map->scl_mask) != 0);
353 } 357 }
354 return context; 358 return context;
355 } 359 }
356 360
357 uint16_t read_eeprom_i2c_w(uint32_t address, void * context) 361 uint16_t read_eeprom_i2c_w(uint32_t address, void * context)