Hello ShaneCCC,
Thanks for your support.
I found something wrong in my code.
My EEPROM has 16bit-address, 8bit-data but I set to 8bit-address, 16bit-data.
After fixing this, reading operation seems like working but writing operation is not.
Both read and write operations are the same slave address which is 0x50.
The test sequence is as follows.
- Read EEPROM from 0x00 to 0x0F.
- Write the values from 0x00 to 0x0F to the EEPROM from 0x00 to 0x0F.
- Read the EEPROM from 0x00 to 0x0F again.
Below is test code and trace log.
Source code below :
static int imx000_eeprom_device_release(struct imx000 *priv)
{
int i = 0;
PRINT_FUNC_NAME_2_KERN_LOG(__func__, "START");
for (i = 0; i < 1; i++) {
if (priv->eeprom[i].i2c_client != NULL) {
i2c_unregister_device(priv->eeprom[i].i2c_client);
priv->eeprom[i].i2c_client = NULL;
}
}
PRINT_FUNC_NAME_2_KERN_LOG(__func__, "END");
return 0;
}
static int imx000_eeprom_device_init(struct imx000 *priv)
{
struct camera_common_pdata *pdata = priv->s_data->pdata;
char *dev_name = "eeprom_imx000";
static struct regmap_config eeprom_regmap_config = {
.reg_bits = 16,
.val_bits = 8,
};
int err = 0, i = 0;
PRINT_FUNC_NAME_2_KERN_LOG(__func__, "START");
if (!pdata->has_eeprom)
return -EINVAL;
for (i = 0; i < 1; i++) {
priv->eeprom[i].adap = i2c_get_adapter(priv->i2c_client->adapter->nr);
memset(&priv->eeprom[i].brd, 0, sizeof(priv->eeprom[i].brd));
strncpy(priv->eeprom[i].brd.type, dev_name, sizeof(priv->eeprom[i].brd.type));
priv->eeprom[i].brd.addr = IMX000_EEPROM_ADDRESS + i;
priv->eeprom[i].i2c_client = i2c_new_device(priv->eeprom[i].adap, &priv->eeprom[i].brd);
priv->eeprom[i].regmap = devm_regmap_init_i2c(priv->eeprom[i].i2c_client, &eeprom_regmap_config);
if (IS_ERR(priv->eeprom[i].regmap)) {
err = PTR_ERR(priv->eeprom[i].regmap);
imx000_eeprom_device_release(priv);
return err;
}
}
PRINT_FUNC_NAME_2_KERN_LOG(__func__, "END");
return 0;
}
static int imx000_write_eeprom(struct imx000 *priv)
{
int err = 0, i = 0;
char str_msg[256] = {0, };
PRINT_FUNC_NAME_2_KERN_LOG(__func__, "START");
// for (i = 0; i < IMX000_EEPROM_NUM_BLOCKS; i++) {
// if(regmap_bulk_write(priv->eeprom[i].regmap, i, &val, IMX000_EEPROM_BLOCK_SIZE))
// return err;
// }
for (i = 0; i <= 0x0F; i++) {
if ((err = regmap_write(priv->eeprom[0].regmap, i, i))) {
dev_err(priv->s_data->dev, "%s: i2c write failed, 0x%04X = 0x%02X\n", __func__, i, i);
return err;
}
sprintf(str_msg, "addr: 0x%04X ==> val: 0x%02X", i, i);
PRINT_FUNC_NAME_2_KERN_LOG(__func__, str_msg);
}
PRINT_FUNC_NAME_2_KERN_LOG(__func__, "END");
return 0;
}
static int imx000_read_eeprom(struct imx000 *priv)
{
int err = 0, i = 0, val = 0;
char str_msg[256] = {0, };
PRINT_FUNC_NAME_2_KERN_LOG(__func__, "START");
/*for (i = 0; i < IMX000_EEPROM_NUM_BLOCKS; i++) {
if(regmap_bulk_read(priv->eeprom[i].regmap, 0, &priv->eeprom_buf[i * IMX000_EEPROM_BLOCK_SIZE], IMX000_EEPROM_BLOCK_SIZE))
return err;
}*/
for (i = 0; i <= 0x0F; i++) {
if ((regmap_read(priv->eeprom[0].regmap, i, &val))) {
dev_err(priv->s_data->dev, "%s: i2c write failed, 0x%04X = 0x%02X\n", __func__, i, val);
return err;
}
sprintf(str_msg, "addr: 0x%04X ==> val: 0x%02X", i, val);
PRINT_FUNC_NAME_2_KERN_LOG(__func__, str_msg);
}
PRINT_FUNC_NAME_2_KERN_LOG(__func__, "END");
return 0;
}
Trace log below :
[ 5.290338] IMX000 : imx000_read_eeprom() => START
[ 5.291279] IMX000 : imx000_read_eeprom() => addr: 0x0000 ==> val: 0x00
[ 5.291450] IMX000 : imx000_read_eeprom() => addr: 0x0001 ==> val: 0x01
[ 5.291618] IMX000 : imx000_read_eeprom() => addr: 0x0002 ==> val: 0x00
[ 5.292047] IMX000 : imx000_read_eeprom() => addr: 0x0003 ==> val: 0x00
[ 5.293202] IMX000 : imx000_read_eeprom() => addr: 0x0004 ==> val: 0x00
[ 5.297055] IMX000 : imx000_read_eeprom() => addr: 0x0005 ==> val: 0x00
[ 5.297498] IMX000 : imx000_read_eeprom() => addr: 0x0006 ==> val: 0x00
[ 5.300278] IMX000 : imx000_read_eeprom() => addr: 0x0007 ==> val: 0x00
[ 5.301762] IMX000 : imx000_read_eeprom() => addr: 0x0008 ==> val: 0x00
[ 5.302106] IMX000 : imx000_read_eeprom() => addr: 0x0009 ==> val: 0x00
[ 5.302292] IMX000 : imx000_read_eeprom() => addr: 0x000A ==> val: 0x00
[ 5.303087] IMX000 : imx000_read_eeprom() => addr: 0x000B ==> val: 0x00
[ 5.320290] IMX000 : imx000_read_eeprom() => addr: 0x000C ==> val: 0x00
[ 5.321655] IMX000 : imx000_read_eeprom() => addr: 0x000D ==> val: 0x00
[ 5.328368] IMX000 : imx000_read_eeprom() => addr: 0x000E ==> val: 0x00
[ 5.331380] IMX000 : imx000_read_eeprom() => addr: 0x000F ==> val: 0x00
[ 5.331384] IMX000 : imx000_read_eeprom() => END
[ 5.332182] IMX000 : imx000_write_eeprom() => START
[ 5.334343] IMX000 : imx000_write_eeprom() => addr: 0x0000 ==> val: 0x00
[ 5.337725] tegra-i2c 3180000.i2c: no acknowledge from address 0x50
[ 5.344543] imx000 2-0057: imx000_write_eeprom: i2c write failed, 0x0001 = 0x01
[ 5.352221] imx000 2-0057: Error -121 writing eeprom
[ 5.357937] IMX000 : imx000_read_eeprom() => START
[ 5.359101] IMX000 : imx000_read_eeprom() => addr: 0x0000 ==> val: 0x00
[ 5.360817] IMX000 : imx000_read_eeprom() => addr: 0x0001 ==> val: 0x01
[ 5.363772] IMX000 : imx000_read_eeprom() => addr: 0x0002 ==> val: 0x00
[ 5.364078] IMX000 : imx000_read_eeprom() => addr: 0x0003 ==> val: 0x00
[ 5.364260] IMX000 : imx000_read_eeprom() => addr: 0x0004 ==> val: 0x00
[ 5.364827] IMX000 : imx000_read_eeprom() => addr: 0x0005 ==> val: 0x00
[ 5.365015] IMX000 : imx000_read_eeprom() => addr: 0x0006 ==> val: 0x00
[ 5.365235] IMX000 : imx000_read_eeprom() => addr: 0x0007 ==> val: 0x00
[ 5.365422] IMX000 : imx000_read_eeprom() => addr: 0x0008 ==> val: 0x00
[ 5.365612] IMX000 : imx000_read_eeprom() => addr: 0x0009 ==> val: 0x00
[ 5.365791] IMX000 : imx000_read_eeprom() => addr: 0x000A ==> val: 0x00
[ 5.365968] IMX000 : imx000_read_eeprom() => addr: 0x000B ==> val: 0x00
[ 5.366259] IMX000 : imx000_read_eeprom() => addr: 0x000C ==> val: 0x00
[ 5.366431] IMX000 : imx000_read_eeprom() => addr: 0x000D ==> val: 0x00
[ 5.366602] IMX000 : imx000_read_eeprom() => addr: 0x000E ==> val: 0x00
[ 5.366770] IMX000 : imx000_read_eeprom() => addr: 0x000F ==> val: 0x00
[ 5.366771] IMX000 : imx000_read_eeprom() => END
Any ideas are welcome.
Thanks.