yanghn2002

View My GitHub Profile

想着图省事想直接用 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;
}