想着图省事想直接用 I2C 访问 eeprom ,但硬件设计把 WP 默认拉高了,结果还得单独控制 GPIO 来操作 WP 引脚,反而更麻烦,所以,老老实实用驱动:
eeprom@50 {
compatible = "atmel,24c256";
wp-gpios = <&pio PD 0 GPIO_ACTIVE_HIGH>;
reg = <0x50>;
status = "okay";
};
驱动里面在写的时候实现了 WP 控制逻辑:
static int at24_write(void *priv, unsigned int off, void *val, size_t count)
{
...
/*
* Write data to chip, protecting against concurrent updates
* from this host, but not from other I2C masters.
*/
mutex_lock(&at24->lock);
gpiod_set_value_cansleep(at24->wp_gpio, 0);
while (count) {
ret = at24_regmap_write(at24, buf, off, count);
if (ret < 0) {
gpiod_set_value_cansleep(at24->wp_gpio, 1);
mutex_unlock(&at24->lock);
pm_runtime_put(dev);
return ret;
}
buf += ret;
off += ret;
count -= ret;
}
gpiod_set_value_cansleep(at24->wp_gpio, 1);
mutex_unlock(&at24->lock);
...
return 0;
}