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


static int sysconfig_i2c_bitstream_burst_complete(struct sysconfig_priv *priv)
{
    struct i2c_client *client = to_i2c_client(priv->dev);
    struct i2c_msg msg;
    /* Команда ISC_PROGRAM_DONE (0x5E) + 3 байта пустых операндов */
    const u8 isc_program_done[] = {0x5E, 0x00, 0x00, 0x00}; 
    int ret;

    printk("%s(%d) Sending explicit ISC_PROGRAM_DONE (0x5E) command to finalize configuration...\n", 
            __FUNCTION__, __LINE__);

    /* Конфигурируем стандартное сообщение записи на 4 байта */
    msg.addr = client->addr;
    msg.flags = client->flags & I2C_M_TEN; // Обычная запись (со START и STOP)
    msg.len = sizeof(isc_program_done);
    msg.buf = (u8 *)isc_program_done;

    /* Выстреливаем команду финализации в ПЛИС */
    ret = i2c_transfer(client->adapter, &msg, 1);
    if (ret != 1) {
        dev_err(priv->dev, "Failed to send ISC_PROGRAM_DONE command: %d\n", ret);
        return (ret < 0) ? ret : -EIO;
    }

    /* 
     * ВАЖНО: После команды 0x5E внутреннему автомату ПЛИС нужно немного времени, 
     * чтобы физически взвести триггер DONE и переключить матрицы. Даем паузу 10-20 мс.
     */
    msleep(20);

    printk("%s(%d) ISC_PROGRAM_DONE successfully sent. Proceeding to status check.\n", __FUNCTION__, __LINE__);
    return 0;
}