Mercurial > repos > blastem
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) |