hw/at24c : modify at24c to support 1 byte address mode
Signed-off-by: Sittisak Sinprem <ssinprem@celestica.com> Reviewed-by: Peter Delevoryas <peter@pjd.dev> [ clg: checkpatch issues ] Message-Id: <167660539263.10409.9736070122710923479-1@git.sr.ht> Signed-off-by: Cédric Le Goater <clg@kaod.org>
This commit is contained in:
parent
6c323aba40
commit
1e001a5a71
@ -41,6 +41,13 @@ struct EEPROMState {
|
|||||||
uint16_t cur;
|
uint16_t cur;
|
||||||
/* total size in bytes */
|
/* total size in bytes */
|
||||||
uint32_t rsize;
|
uint32_t rsize;
|
||||||
|
/*
|
||||||
|
* address byte number
|
||||||
|
* for 24c01, 24c02 size <= 256 byte, use only 1 byte
|
||||||
|
* otherwise size > 256, use 2 byte
|
||||||
|
*/
|
||||||
|
uint8_t asize;
|
||||||
|
|
||||||
bool writable;
|
bool writable;
|
||||||
/* cells changed since last START? */
|
/* cells changed since last START? */
|
||||||
bool changed;
|
bool changed;
|
||||||
@ -91,7 +98,11 @@ uint8_t at24c_eeprom_recv(I2CSlave *s)
|
|||||||
EEPROMState *ee = AT24C_EE(s);
|
EEPROMState *ee = AT24C_EE(s);
|
||||||
uint8_t ret;
|
uint8_t ret;
|
||||||
|
|
||||||
if (ee->haveaddr == 1) {
|
/*
|
||||||
|
* If got the byte address but not completely with address size
|
||||||
|
* will return the invalid value
|
||||||
|
*/
|
||||||
|
if (ee->haveaddr > 0 && ee->haveaddr < ee->asize) {
|
||||||
return 0xff;
|
return 0xff;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -108,11 +119,11 @@ int at24c_eeprom_send(I2CSlave *s, uint8_t data)
|
|||||||
{
|
{
|
||||||
EEPROMState *ee = AT24C_EE(s);
|
EEPROMState *ee = AT24C_EE(s);
|
||||||
|
|
||||||
if (ee->haveaddr < 2) {
|
if (ee->haveaddr < ee->asize) {
|
||||||
ee->cur <<= 8;
|
ee->cur <<= 8;
|
||||||
ee->cur |= data;
|
ee->cur |= data;
|
||||||
ee->haveaddr++;
|
ee->haveaddr++;
|
||||||
if (ee->haveaddr == 2) {
|
if (ee->haveaddr == ee->asize) {
|
||||||
ee->cur %= ee->rsize;
|
ee->cur %= ee->rsize;
|
||||||
DPRINTK("Set pointer %04x\n", ee->cur);
|
DPRINTK("Set pointer %04x\n", ee->cur);
|
||||||
}
|
}
|
||||||
@ -199,6 +210,18 @@ static void at24c_eeprom_realize(DeviceState *dev, Error **errp)
|
|||||||
}
|
}
|
||||||
DPRINTK("Reset read backing file\n");
|
DPRINTK("Reset read backing file\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If address size didn't define with property set
|
||||||
|
* value is 0 as default, setting it by Rom size detecting.
|
||||||
|
*/
|
||||||
|
if (ee->asize == 0) {
|
||||||
|
if (ee->rsize <= 256) {
|
||||||
|
ee->asize = 1;
|
||||||
|
} else {
|
||||||
|
ee->asize = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static
|
static
|
||||||
@ -213,6 +236,7 @@ void at24c_eeprom_reset(DeviceState *state)
|
|||||||
|
|
||||||
static Property at24c_eeprom_props[] = {
|
static Property at24c_eeprom_props[] = {
|
||||||
DEFINE_PROP_UINT32("rom-size", EEPROMState, rsize, 0),
|
DEFINE_PROP_UINT32("rom-size", EEPROMState, rsize, 0),
|
||||||
|
DEFINE_PROP_UINT8("address-size", EEPROMState, asize, 0),
|
||||||
DEFINE_PROP_BOOL("writable", EEPROMState, writable, true),
|
DEFINE_PROP_BOOL("writable", EEPROMState, writable, true),
|
||||||
DEFINE_PROP_DRIVE("drive", EEPROMState, blk),
|
DEFINE_PROP_DRIVE("drive", EEPROMState, blk),
|
||||||
DEFINE_PROP_END_OF_LIST()
|
DEFINE_PROP_END_OF_LIST()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user