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


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[2];
    u8 burst_cmd = 0x7A; // Команда инициализации burst для Lattice
    size_t offset = 0;
    int ret;

    if (len == 0)
        return 0;

    printk("%s(%d) len=%ld\n", __FUNCTION__, __LINE__, len);

    while (offset < len) {
        size_t chunk_size = min((size_t)4096, len - offset);

        // 1. Сначала шлем команду 0x7A (Burst Write)
        msg[0].addr = client->addr;
        msg[0].flags = client->flags & I2C_M_TEN;
        msg[0].len = 1;
        msg[0].buf = &burst_cmd;

        // 2. Следом (через Repeated START) выдаем порцию данных без STOP между ними
        msg[1].addr = client->addr;
        msg[1].flags = (client->flags & I2C_M_TEN) | I2C_M_NOSTART; 
        msg[1].len = chunk_size;
        msg[1].buf = (u8 *)(buf + offset);

        // Передаем пачку из двух сообщений как ОДНУ транзакцию
        ret = i2c_transfer(client->adapter, msg, 2);
        if (ret < 0) {
            dev_err(priv->dev, "I2C segment write failed at offset %zu: %d\n", offset, ret);
            return ret;
        }
        if (ret != 2) {
            dev_err(priv->dev, "I2C segment write incomplete at offset %zu\n", offset);
            return -EIO;
        }

        offset += chunk_size;
    }

    printk("%s(%d) OK\n", __FUNCTION__, __LINE__);
    return 0;
}