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 offset = 0;
int ret;
if (len == 0)
return 0;
printk("%s(%d) len=%ld\n",__FUNCTION__,__LINE__,len);
/*
* Цикл гарантирует, что если придет блок больше 4096 байт,
* он будет аккуратно разбит на максимальные страницы DMA (4КБ).
* Флаг I2C_M_NOSTART на каждом шаге удерживает шину i.MX95 от
* выдачи STOP/START-битов, сохраняя монолитность потока.
*/
while (offset < len) {
size_t chunk_size = min((size_t)4096, len - offset);
msg.addr = client->addr;
msg.flags = (client->flags & I2C_M_TEN) | I2C_M_NOSTART;
msg.len = chunk_size;
msg.buf = (u8 *)(buf + offset);
ret = i2c_transfer(client->adapter, &msg, 1);
if (ret < 0) {
dev_err(priv->dev, "I2C continuous burst write failed at offset %zu: %d\n", offset, ret);
return ret;
}
if (ret != 1) {
dev_err(priv->dev, "I2C continuous burst write incomplete at offset %zu\n", offset);
return -EIO;
}
offset += chunk_size;
}
printk("%s(%d) OK\n",__FUNCTION__,__LINE__);
return 0;
}