Загрузка данных


static int sysconfig_i2c_bitstream_burst_write(struct sysconfig_priv *priv,
					       const char *buf, size_t len)
{
	struct i2c_client *client = to_i2c_client(priv->dev);
	struct i2c_msg msg;
	size_t chunk_size = 4096; /* Оптимальный размер для eDMA i.MX95 и буфера Lattice */
	size_t bytes_written = 0;
	int ret;

	while (bytes_written < len) {
		size_t to_write = min(chunk_size, len - bytes_written);

		msg.addr = client->addr;
		/* 
		 * Возвращаем I2C_M_NOSTART, чтобы не спамить eDMA прерываниями START/STOP,
		 * но режем буфер строго по 4кб.
		 */
		msg.flags = (client->flags & I2C_M_TEN) | I2C_M_NOSTART;
		msg.len = to_write;
		msg.buf = (u8 *)(buf + bytes_written);

		ret = i2c_transfer(client->adapter, &msg, 1);
		if (ret < 0) {
			dev_err(priv->dev, "I2C chunk transfer failed: %d\n", ret);
			return ret;
		}
		if (ret != 1)
			return -EIO;

		bytes_written += to_write;

		/* Небольшая пауза 1 мс, чтобы ПЛИС успела переписать 4 Кб из FIFO в NVCM/SRAM */
		usleep_range(1000, 1500);
	}

	return 0;
}