diff --git a/drivers/i2c/target/eeprom_target.c b/drivers/i2c/target/eeprom_target.c index e2820749b206b..82a3bb521b336 100644 --- a/drivers/i2c/target/eeprom_target.c +++ b/drivers/i2c/target/eeprom_target.c @@ -24,6 +24,7 @@ struct i2c_eeprom_target_data { uint32_t buffer_idx; uint32_t idx_write_cnt; uint8_t address_width; + bool read_only; }; struct i2c_eeprom_target_config { @@ -115,22 +116,26 @@ static int eeprom_target_write_received(struct i2c_target_config *config, struct i2c_eeprom_target_data, config); - LOG_DBG("eeprom: write done, val=0x%x", val); - - /* In case EEPROM wants to be R/O, return !0 here could trigger - * a NACK to the I2C controller, support depends on the - * I2C controller support - */ - if (data->idx_write_cnt < (data->address_width >> 3)) { + LOG_DBG("eeprom: write addr, val=0x%x", val); + if (data->idx_write_cnt == 0) { data->buffer_idx = 0; } data->buffer_idx = val | (data->buffer_idx << 8); data->idx_write_cnt++; - } else { + } else if (!data->read_only) { + LOG_DBG("eeprom: write data, val=0x%x", val); + data->buffer[data->buffer_idx++] = val; + } else { + LOG_DBG("eeprom: write attempt to read-only EEPROM"); + + /* In case the EEPROM is read-only, an error code is returned + * to trigger a NACK on I2C controllers that support it. + */ + return -EIO; } data->buffer_idx = data->buffer_idx % data->buffer_size; @@ -249,34 +254,25 @@ static int i2c_eeprom_target_init(const struct device *dev) return 0; } -#define I2C_EEPROM_INIT(inst) \ - static struct i2c_eeprom_target_data \ - i2c_eeprom_target_##inst##_dev_data = { \ - .address_width = DT_INST_PROP_OR(inst, \ - address_width, 8), \ - }; \ - \ - static uint8_t \ - i2c_eeprom_target_##inst##_buffer[(DT_INST_PROP(inst, size))]; \ - \ - BUILD_ASSERT(DT_INST_PROP(inst, size) <= \ - (1 << DT_INST_PROP_OR(inst, address_width, 8)), \ - "size must be <= than 2^address_width"); \ - \ - static const struct i2c_eeprom_target_config \ - i2c_eeprom_target_##inst##_cfg = { \ - .bus = I2C_DT_SPEC_INST_GET(inst), \ - .buffer_size = DT_INST_PROP(inst, size), \ - .buffer = i2c_eeprom_target_##inst##_buffer \ - }; \ - \ - DEVICE_DT_INST_DEFINE(inst, \ - &i2c_eeprom_target_init, \ - NULL, \ - &i2c_eeprom_target_##inst##_dev_data, \ - &i2c_eeprom_target_##inst##_cfg, \ - POST_KERNEL, \ - CONFIG_I2C_TARGET_INIT_PRIORITY, \ - &api_funcs); +#define I2C_EEPROM_INIT(inst) \ + static struct i2c_eeprom_target_data i2c_eeprom_target_##inst##_dev_data = { \ + .address_width = DT_INST_PROP_OR(inst, address_width, 8), \ + .read_only = DT_INST_PROP_OR(inst, read_only, 8), \ + }; \ + \ + static uint8_t i2c_eeprom_target_##inst##_buffer[(DT_INST_PROP(inst, size))]; \ + \ + BUILD_ASSERT(DT_INST_PROP(inst, size) <= (1 << DT_INST_PROP_OR(inst, address_width, 8)), \ + "size must be <= than 2^address_width"); \ + \ + static const struct i2c_eeprom_target_config i2c_eeprom_target_##inst##_cfg = { \ + .bus = I2C_DT_SPEC_INST_GET(inst), \ + .buffer_size = DT_INST_PROP(inst, size), \ + .buffer = i2c_eeprom_target_##inst##_buffer}; \ + \ + DEVICE_DT_INST_DEFINE(inst, &i2c_eeprom_target_init, NULL, \ + &i2c_eeprom_target_##inst##_dev_data, \ + &i2c_eeprom_target_##inst##_cfg, POST_KERNEL, \ + CONFIG_I2C_TARGET_INIT_PRIORITY, &api_funcs); DT_INST_FOREACH_STATUS_OKAY(I2C_EEPROM_INIT) diff --git a/dts/bindings/mtd/zephyr,i2c-target-eeprom.yaml b/dts/bindings/mtd/zephyr,i2c-target-eeprom.yaml index ff465b8cef4d6..4f097674e46bb 100644 --- a/dts/bindings/mtd/zephyr,i2c-target-eeprom.yaml +++ b/dts/bindings/mtd/zephyr,i2c-target-eeprom.yaml @@ -13,3 +13,6 @@ properties: description: | Number of address bits used to address the EEPROM. If not specified the EEPROM is assumed to have a 8-bit address. + read-only: + type: boolean + description: set this property if the EERPOM is read-only. diff --git a/tests/drivers/i2c/i2c_target_api/boards/frdm_ke17z512.overlay b/tests/drivers/i2c/i2c_target_api/boards/frdm_ke17z512.overlay index cd4ec6bb5de60..1532d04d7b994 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/frdm_ke17z512.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/frdm_ke17z512.overlay @@ -15,6 +15,13 @@ reg = <0x54>; size = <256>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; &lpi2c1 { diff --git a/tests/drivers/i2c/i2c_target_api/boards/frdm_mcxn236.overlay b/tests/drivers/i2c/i2c_target_api/boards/frdm_mcxn236.overlay index 3eede136743aa..9bfb01af085be 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/frdm_mcxn236.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/frdm_mcxn236.overlay @@ -41,6 +41,13 @@ size = <1024>; address-width = <16>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; &flexcomm5_lpi2c5 { diff --git a/tests/drivers/i2c/i2c_target_api/boards/frdm_mcxn947_mcxn947_cpu0.overlay b/tests/drivers/i2c/i2c_target_api/boards/frdm_mcxn947_mcxn947_cpu0.overlay index 71a99565aab4e..542043106bca5 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/frdm_mcxn947_mcxn947_cpu0.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/frdm_mcxn947_mcxn947_cpu0.overlay @@ -40,6 +40,13 @@ reg = <0x54>; size = <256>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; &flexcomm2_lpi2c2 { diff --git a/tests/drivers/i2c/i2c_target_api/boards/frdm_mcxn947_mcxn947_cpu0_qspi.overlay b/tests/drivers/i2c/i2c_target_api/boards/frdm_mcxn947_mcxn947_cpu0_qspi.overlay index d0dc5661db8c3..d7af60258a3ed 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/frdm_mcxn947_mcxn947_cpu0_qspi.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/frdm_mcxn947_mcxn947_cpu0_qspi.overlay @@ -40,6 +40,13 @@ reg = <0x54>; size = <1024>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; &flexcomm2_lpi2c2 { diff --git a/tests/drivers/i2c/i2c_target_api/boards/it8xxx2_evb.overlay b/tests/drivers/i2c/i2c_target_api/boards/it8xxx2_evb.overlay index bfcf2d392652e..e6972cf1a129d 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/it8xxx2_evb.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/it8xxx2_evb.overlay @@ -30,4 +30,11 @@ reg = <0x52>; size = <256>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; diff --git a/tests/drivers/i2c/i2c_target_api/boards/max32655evkit_max32655_m4.overlay b/tests/drivers/i2c/i2c_target_api/boards/max32655evkit_max32655_m4.overlay index d7807878bc221..b29d8ab2b7234 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/max32655evkit_max32655_m4.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/max32655evkit_max32655_m4.overlay @@ -11,6 +11,13 @@ address-width = <16>; size = <1024>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; &i2c1 { diff --git a/tests/drivers/i2c/i2c_target_api/boards/max32662evkit.overlay b/tests/drivers/i2c/i2c_target_api/boards/max32662evkit.overlay index 1f78e3a1be663..18f97b25acdb1 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/max32662evkit.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/max32662evkit.overlay @@ -14,6 +14,13 @@ reg = <0x54>; size = <256>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; &i2c1 { diff --git a/tests/drivers/i2c/i2c_target_api/boards/max32666evkit_max32666_cpu0.overlay b/tests/drivers/i2c/i2c_target_api/boards/max32666evkit_max32666_cpu0.overlay index c1f7c9afd5666..bf076afc0983e 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/max32666evkit_max32666_cpu0.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/max32666evkit_max32666_cpu0.overlay @@ -11,6 +11,13 @@ address-width = <16>; size = <1024>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; &i2c2 { diff --git a/tests/drivers/i2c/i2c_target_api/boards/max32670evkit.overlay b/tests/drivers/i2c/i2c_target_api/boards/max32670evkit.overlay index 1ac41768ee078..ac09a965c2ccb 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/max32670evkit.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/max32670evkit.overlay @@ -11,6 +11,13 @@ address-width = <16>; size = <1024>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; &i2c1 { diff --git a/tests/drivers/i2c/i2c_target_api/boards/max32672evkit.overlay b/tests/drivers/i2c/i2c_target_api/boards/max32672evkit.overlay index c1f095f600523..5e73964248562 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/max32672evkit.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/max32672evkit.overlay @@ -11,6 +11,13 @@ address-width = <16>; size = <1024>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; &i2c1 { diff --git a/tests/drivers/i2c/i2c_target_api/boards/max32675evkit.overlay b/tests/drivers/i2c/i2c_target_api/boards/max32675evkit.overlay index 59b1258c55708..0c2e6c12bb643 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/max32675evkit.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/max32675evkit.overlay @@ -15,6 +15,13 @@ address-width = <16>; size = <1024>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; &i2c2 { diff --git a/tests/drivers/i2c/i2c_target_api/boards/max32680evkit_max32680_m4.overlay b/tests/drivers/i2c/i2c_target_api/boards/max32680evkit_max32680_m4.overlay index c8f95fd0e5e53..a5263fda2c13d 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/max32680evkit_max32680_m4.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/max32680evkit_max32680_m4.overlay @@ -11,6 +11,13 @@ address-width = <16>; size = <1024>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; &i2c1 { diff --git a/tests/drivers/i2c/i2c_target_api/boards/max32690evkit_max32690_m4.overlay b/tests/drivers/i2c/i2c_target_api/boards/max32690evkit_max32690_m4.overlay index b62d4b1a3d85a..f20aa6e02ee52 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/max32690evkit_max32690_m4.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/max32690evkit_max32690_m4.overlay @@ -11,6 +11,13 @@ address-width = <16>; size = <1024>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; &i2c2 { diff --git a/tests/drivers/i2c/i2c_target_api/boards/mec1501modular_assy6885.overlay b/tests/drivers/i2c/i2c_target_api/boards/mec1501modular_assy6885.overlay index 17ae7f879a65f..834e69606df94 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/mec1501modular_assy6885.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/mec1501modular_assy6885.overlay @@ -11,6 +11,13 @@ address-width = <16>; size = <1024>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; diff --git a/tests/drivers/i2c/i2c_target_api/boards/mimxrt1040_evk.overlay b/tests/drivers/i2c/i2c_target_api/boards/mimxrt1040_evk.overlay index a1c329a6926e6..35eaf5ac8a982 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/mimxrt1040_evk.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/mimxrt1040_evk.overlay @@ -19,6 +19,13 @@ reg = <0x54>; size = <256>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; &lpi2c3 { diff --git a/tests/drivers/i2c/i2c_target_api/boards/mimxrt1060_evk.overlay b/tests/drivers/i2c/i2c_target_api/boards/mimxrt1060_evk.overlay index d47c67068ba92..1f519c4ed6b61 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/mimxrt1060_evk.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/mimxrt1060_evk.overlay @@ -27,6 +27,13 @@ reg = <0x54>; size = <256>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; &lpi2c3 { diff --git a/tests/drivers/i2c/i2c_target_api/boards/mimxrt1170_evk_mimxrt1176_cm7.overlay b/tests/drivers/i2c/i2c_target_api/boards/mimxrt1170_evk_mimxrt1176_cm7.overlay index 967f9a7de3858..da436fef55e83 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/mimxrt1170_evk_mimxrt1176_cm7.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/mimxrt1170_evk_mimxrt1176_cm7.overlay @@ -13,6 +13,13 @@ reg = <0x54>; size = <256>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; &lpi2c5 { diff --git a/tests/drivers/i2c/i2c_target_api/boards/mimxrt1170_evkb_mimxrt1176_cm4.overlay b/tests/drivers/i2c/i2c_target_api/boards/mimxrt1170_evkb_mimxrt1176_cm4.overlay index 967f9a7de3858..da436fef55e83 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/mimxrt1170_evkb_mimxrt1176_cm4.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/mimxrt1170_evkb_mimxrt1176_cm4.overlay @@ -13,6 +13,13 @@ reg = <0x54>; size = <256>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; &lpi2c5 { diff --git a/tests/drivers/i2c/i2c_target_api/boards/mimxrt1170_evkb_mimxrt1176_cm7.overlay b/tests/drivers/i2c/i2c_target_api/boards/mimxrt1170_evkb_mimxrt1176_cm7.overlay index 967f9a7de3858..da436fef55e83 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/mimxrt1170_evkb_mimxrt1176_cm7.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/mimxrt1170_evkb_mimxrt1176_cm7.overlay @@ -13,6 +13,13 @@ reg = <0x54>; size = <256>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; &lpi2c5 { diff --git a/tests/drivers/i2c/i2c_target_api/boards/mimxrt1180_evk_mimxrt1189_cm33.overlay b/tests/drivers/i2c/i2c_target_api/boards/mimxrt1180_evk_mimxrt1189_cm33.overlay index f521284519c21..e62b1912c1879 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/mimxrt1180_evk_mimxrt1189_cm33.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/mimxrt1180_evk_mimxrt1189_cm33.overlay @@ -13,6 +13,13 @@ reg = <0x54>; size = <256>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; &lpi2c3 { diff --git a/tests/drivers/i2c/i2c_target_api/boards/mimxrt1180_evk_mimxrt1189_cm7.overlay b/tests/drivers/i2c/i2c_target_api/boards/mimxrt1180_evk_mimxrt1189_cm7.overlay index f521284519c21..e62b1912c1879 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/mimxrt1180_evk_mimxrt1189_cm7.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/mimxrt1180_evk_mimxrt1189_cm7.overlay @@ -13,6 +13,13 @@ reg = <0x54>; size = <256>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; &lpi2c3 { diff --git a/tests/drivers/i2c/i2c_target_api/boards/mr_canhubk3.overlay b/tests/drivers/i2c/i2c_target_api/boards/mr_canhubk3.overlay index 7fbae6b49073d..07e38b263d0d7 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/mr_canhubk3.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/mr_canhubk3.overlay @@ -13,6 +13,13 @@ reg = <0x54>; size = <256>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; &lpi2c1 { diff --git a/tests/drivers/i2c/i2c_target_api/boards/npcx9m6f_evb.overlay b/tests/drivers/i2c/i2c_target_api/boards/npcx9m6f_evb.overlay index b870b6eae2ee6..93567521c5f64 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/npcx9m6f_evb.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/npcx9m6f_evb.overlay @@ -13,6 +13,13 @@ address-width = <16>; size = <1024>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; &i2c2_0 { diff --git a/tests/drivers/i2c/i2c_target_api/boards/nucleo_f091rc.overlay b/tests/drivers/i2c/i2c_target_api/boards/nucleo_f091rc.overlay index 9e6db75d1dfad..a3835c41c7777 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/nucleo_f091rc.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/nucleo_f091rc.overlay @@ -16,6 +16,13 @@ reg = <0x54>; size = <256>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; diff --git a/tests/drivers/i2c/i2c_target_api/boards/nucleo_f207zg.overlay b/tests/drivers/i2c/i2c_target_api/boards/nucleo_f207zg.overlay index 2738f68845b01..19e70f9542496 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/nucleo_f207zg.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/nucleo_f207zg.overlay @@ -16,6 +16,13 @@ reg = <0x54>; size = <256>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; &i2c2 { diff --git a/tests/drivers/i2c/i2c_target_api/boards/nucleo_f401re.overlay b/tests/drivers/i2c/i2c_target_api/boards/nucleo_f401re.overlay index 8fdd8b2233d16..1a067e9366d17 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/nucleo_f401re.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/nucleo_f401re.overlay @@ -16,6 +16,13 @@ reg = <0x54>; size = <256>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; &i2c3 { diff --git a/tests/drivers/i2c/i2c_target_api/boards/nucleo_f429zi.overlay b/tests/drivers/i2c/i2c_target_api/boards/nucleo_f429zi.overlay index 2738f68845b01..19e70f9542496 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/nucleo_f429zi.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/nucleo_f429zi.overlay @@ -16,6 +16,13 @@ reg = <0x54>; size = <256>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; &i2c2 { diff --git a/tests/drivers/i2c/i2c_target_api/boards/nucleo_f746zg.overlay b/tests/drivers/i2c/i2c_target_api/boards/nucleo_f746zg.overlay index 4da288f9df681..e357f59b034b9 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/nucleo_f746zg.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/nucleo_f746zg.overlay @@ -19,6 +19,13 @@ reg = <0x54>; size = <256>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; &i2c2 { diff --git a/tests/drivers/i2c/i2c_target_api/boards/nucleo_g071rb.overlay b/tests/drivers/i2c/i2c_target_api/boards/nucleo_g071rb.overlay index fb14393c879fd..e56f1265600e8 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/nucleo_g071rb.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/nucleo_g071rb.overlay @@ -19,6 +19,13 @@ reg = <0x54>; size = <256>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; &i2c2 { diff --git a/tests/drivers/i2c/i2c_target_api/boards/nucleo_g474re.overlay b/tests/drivers/i2c/i2c_target_api/boards/nucleo_g474re.overlay index 2caffcbaa4272..a433a5c05e684 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/nucleo_g474re.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/nucleo_g474re.overlay @@ -16,6 +16,13 @@ reg = <0x54>; size = <256>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; &i2c3 { diff --git a/tests/drivers/i2c/i2c_target_api/boards/nucleo_h563zi.overlay b/tests/drivers/i2c/i2c_target_api/boards/nucleo_h563zi.overlay index bbb37fc8935f6..e021a0780c2fc 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/nucleo_h563zi.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/nucleo_h563zi.overlay @@ -23,6 +23,13 @@ address-width = <16>; size = <1024>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; &i2c1 { diff --git a/tests/drivers/i2c/i2c_target_api/boards/nucleo_l073rz.overlay b/tests/drivers/i2c/i2c_target_api/boards/nucleo_l073rz.overlay index 9c067ae8b5c7c..b081bac2644c5 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/nucleo_l073rz.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/nucleo_l073rz.overlay @@ -16,6 +16,13 @@ reg = <0x54>; size = <256>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; diff --git a/tests/drivers/i2c/i2c_target_api/boards/nucleo_l152re.overlay b/tests/drivers/i2c/i2c_target_api/boards/nucleo_l152re.overlay index aeabefb7e27ea..14f65f798ef0d 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/nucleo_l152re.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/nucleo_l152re.overlay @@ -16,6 +16,13 @@ reg = <0x54>; size = <256>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; diff --git a/tests/drivers/i2c/i2c_target_api/boards/nucleo_l476rg.overlay b/tests/drivers/i2c/i2c_target_api/boards/nucleo_l476rg.overlay index e21e19aeeb462..003c0d2305d09 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/nucleo_l476rg.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/nucleo_l476rg.overlay @@ -20,6 +20,13 @@ address-width = <16>; size = <1024>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; &i2c3 { diff --git a/tests/drivers/i2c/i2c_target_api/boards/nucleo_u083rc.overlay b/tests/drivers/i2c/i2c_target_api/boards/nucleo_u083rc.overlay index 5cdafe3b76bd5..00847cb7f3083 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/nucleo_u083rc.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/nucleo_u083rc.overlay @@ -19,6 +19,13 @@ reg = <0x54>; size = <256>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; &i2c2 { diff --git a/tests/drivers/i2c/i2c_target_api/boards/nucleo_wb55rg.overlay b/tests/drivers/i2c/i2c_target_api/boards/nucleo_wb55rg.overlay index bb73929888a15..efa0e331c7870 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/nucleo_wb55rg.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/nucleo_wb55rg.overlay @@ -16,6 +16,13 @@ reg = <0x54>; size = <256>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; &i2c3 { diff --git a/tests/drivers/i2c/i2c_target_api/boards/nucleo_wl55jc.overlay b/tests/drivers/i2c/i2c_target_api/boards/nucleo_wl55jc.overlay index 12445bcfe6fba..42f61361a104d 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/nucleo_wl55jc.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/nucleo_wl55jc.overlay @@ -28,4 +28,11 @@ reg = <0x54>; size = <256>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; diff --git a/tests/drivers/i2c/i2c_target_api/boards/numaker_m2l31ki.overlay b/tests/drivers/i2c/i2c_target_api/boards/numaker_m2l31ki.overlay index f0d07272d3a1f..51acf1722d084 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/numaker_m2l31ki.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/numaker_m2l31ki.overlay @@ -27,6 +27,13 @@ address-width = <16>; size = <1024>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; &i2c0 { diff --git a/tests/drivers/i2c/i2c_target_api/boards/numaker_pfm_m467.overlay b/tests/drivers/i2c/i2c_target_api/boards/numaker_pfm_m467.overlay index bcf3c2ca0c3d4..a667bd7f1d4ee 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/numaker_pfm_m467.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/numaker_pfm_m467.overlay @@ -27,6 +27,13 @@ address-width = <16>; size = <1024>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; &i2c3 { diff --git a/tests/drivers/i2c/i2c_target_api/boards/rpi_pico.overlay b/tests/drivers/i2c/i2c_target_api/boards/rpi_pico.overlay index f5e5f253898af..5ed6b89a417a8 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/rpi_pico.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/rpi_pico.overlay @@ -4,6 +4,10 @@ * SPDX-License-Identifier: Apache-2.0 */ + /* + * Short Pin P4 to PA14, and P5 to P15, for the test to pass. + */ + &pinctrl { i2c1_default: i2c1_default { group1 { @@ -20,6 +24,13 @@ reg = <0x54>; size = <256>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; &i2c1 { diff --git a/tests/drivers/i2c/i2c_target_api/boards/sltb010a.overlay b/tests/drivers/i2c/i2c_target_api/boards/sltb010a.overlay index a68e23a44cb80..099a4b93b54a2 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/sltb010a.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/sltb010a.overlay @@ -11,4 +11,11 @@ reg = <0x56>; size = <256>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; diff --git a/tests/drivers/i2c/i2c_target_api/boards/stm32f072b_disco.overlay b/tests/drivers/i2c/i2c_target_api/boards/stm32f072b_disco.overlay index bf249a3bb7637..8278d1a1cd67b 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/stm32f072b_disco.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/stm32f072b_disco.overlay @@ -6,6 +6,13 @@ reg = <0x54>; size = <256>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; diff --git a/tests/drivers/i2c/i2c_target_api/boards/stm32f3_disco.overlay b/tests/drivers/i2c/i2c_target_api/boards/stm32f3_disco.overlay index 5c8f04c1022e1..55b50f7b17bc8 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/stm32f3_disco.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/stm32f3_disco.overlay @@ -18,6 +18,13 @@ reg = <0x54>; size = <256>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; &i2c2 { diff --git a/tests/drivers/i2c/i2c_target_api/boards/stm32h573i_dk.overlay b/tests/drivers/i2c/i2c_target_api/boards/stm32h573i_dk.overlay index 343edb771ad9a..81f45af73f629 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/stm32h573i_dk.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/stm32h573i_dk.overlay @@ -19,6 +19,13 @@ reg = <0x54>; size = <256>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; &i2c2 { diff --git a/tests/drivers/i2c/i2c_target_api/boards/stm32u083c_dk.overlay b/tests/drivers/i2c/i2c_target_api/boards/stm32u083c_dk.overlay index cf434be71de88..43cd8180b56fa 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/stm32u083c_dk.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/stm32u083c_dk.overlay @@ -19,6 +19,13 @@ reg = <0x54>; size = <256>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; diff --git a/tests/drivers/i2c/i2c_target_api/boards/xmc47_relax_kit.overlay b/tests/drivers/i2c/i2c_target_api/boards/xmc47_relax_kit.overlay index 7d34c7b297a64..0620598d83ccf 100644 --- a/tests/drivers/i2c/i2c_target_api/boards/xmc47_relax_kit.overlay +++ b/tests/drivers/i2c/i2c_target_api/boards/xmc47_relax_kit.overlay @@ -32,6 +32,13 @@ reg = <0x54>; size = <256>; }; + eeprom2: eeprom@58 { + compatible = "zephyr,i2c-target-eeprom"; + reg = <0x58>; + size = <4096>; + address-width = <16>; + read-only; + }; }; &arduino_i2c { diff --git a/tests/drivers/i2c/i2c_target_api/src/main.c b/tests/drivers/i2c/i2c_target_api/src/main.c index 5c1540e3e79ae..9f559fe65d1fc 100644 --- a/tests/drivers/i2c/i2c_target_api/src/main.c +++ b/tests/drivers/i2c/i2c_target_api/src/main.c @@ -21,10 +21,13 @@ #define NODE_EP0 DT_NODELABEL(eeprom0) #define NODE_EP1 DT_NODELABEL(eeprom1) +#define NODE_EP2 DT_NODELABEL(eeprom2) #define TEST_DATA_SIZE 20 static const uint8_t eeprom_0_data[TEST_DATA_SIZE] = "0123456789abcdefghij"; static const uint8_t eeprom_1_data[TEST_DATA_SIZE] = "jihgfedcba9876543210"; +static const uint8_t eeprom_2_data[TEST_DATA_SIZE] = "read_only_test_data_"; +static const uint8_t write_attempt_data[TEST_DATA_SIZE] = {0}; static uint8_t i2c_buffer[TEST_DATA_SIZE]; /* @@ -273,4 +276,47 @@ ZTEST(i2c_eeprom_target, test_eeprom_target) } } +ZTEST(i2c_eeprom_target, test_eeprom_2_read_only) +{ + const struct device *const eeprom_2 = DEVICE_DT_GET(NODE_EP2); + const struct device *const i2c_1 = DEVICE_DT_GET(DT_BUS(NODE_EP1)); + int addr_2 = DT_REG_ADDR(NODE_EP2); + uint8_t addr_2_width = DT_PROP_OR(NODE_EP2, address_width, 8); + int ret; + + /* Ensure the device and bus are ready */ + zassert_not_null(i2c_1, "EEPROM 2 - I2C bus (i2c_1) not found"); + zassert_not_null(eeprom_2, "EEPROM 2 device not found"); + zassert_true(device_is_ready(i2c_1), "EEPROM 2 - I2C bus (i2c_1) not ready"); + + TC_PRINT("Found EEPROM 2 on I2C bus device %s at addr %02x\n", i2c_1->name, addr_2); + + /* Step 1: Program EEPROM 2 with test data */ + ret = eeprom_target_program(eeprom_2, eeprom_2_data, TEST_DATA_SIZE); + zassert_equal(ret, 0, "Failed to program EEPROM 2 with test data"); + + /* Step 2: Attach EEPROM 2 to its bus as a target device */ + ret = i2c_target_driver_register(eeprom_2); + zassert_equal(ret, 0, "Failed to register EEPROM 2 as a target device"); + + /* Step 3: Verify EEPROM 2 data via I2C read */ + ret = run_full_read(i2c_1, addr_2, addr_2_width, eeprom_2_data); + zassert_equal(ret, 0, "EEPROM 2 data verification via I2C read failed"); + + /* Step 4: Attempt to write to EEPROM 2 and expect a NACK or failure */ + ret = i2c_write(i2c_1, write_attempt_data, TEST_DATA_SIZE, addr_2); + + /* I2C_DW (and maybe others?) don't generate the NACK as expected */ +#ifndef CONFIG_I2C_DW + zassert_not_equal(ret, 0, "Write attempt to read-only EEPROM 2 succeeded unexpectedly"); +#endif + /* Step 5: Re-verify EEPROM 2 data to ensure it has not changed */ + ret = run_full_read(i2c_1, addr_2, addr_2_width, eeprom_2_data); + zassert_equal(ret, 0, "EEPROM 2 data was unexpectedly modified after write attempt"); + + /* Step 6: Detach EEPROM 2 from its bus */ + ret = i2c_target_driver_unregister(eeprom_2); + zassert_equal(ret, 0, "Failed to unregister EEPROM 2 from the bus"); +} + ZTEST_SUITE(i2c_eeprom_target, NULL, NULL, NULL, NULL, NULL);