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


static int sysconfig_i2c_bitstream_burst_complete(struct sysconfig_priv *priv)
{
    struct i2c_client *client = to_i2c_client(priv->dev);
    /*
     * Реализуем принудительный вызов isc_disable прямо в complete:
     * 1. 0x26, 0x00, 0x00, 0x00 -> SYSCONFIG_ISC_DISABLE (из вашего дефайна)
     * 2. 0xFF, 0xFF, 0xFF, 0xFF -> Холостые такты для запуска Wake-up автомата ПЛИС
     */
    u8 force_finish_seq[] = {
        0x26, 0x00, 0x00, 0x00, // Явный вызов ISC_DISABLE
        0xFF, 0xFF, 0xFF, 0xFF, // Паддинг и такты холостого хода (32 такта SCL)
        0xFF, 0xFF, 0xFF, 0xFF  // Еще немного тактов для надежности
    };
    struct i2c_msg msg;
    int ret;

    /*
     * Отправляем финализацию.
     * Строго БЕЗ флага I2C_M_NOSTART, чтобы контроллер i.MX95 сгенерировал 
     * легитимный STOP-бит на шине в самом конце транзакции.
     */
    msg.addr = client->addr;
    msg.flags = client->flags & I2C_M_TEN;
    msg.len = sizeof(force_finish_seq);
    msg.buf = force_finish_seq;

    ret = i2c_transfer(client->adapter, &msg, 1);
    if (ret < 0) {
        dev_err(priv->dev, "Forced ISC_DISABLE transmission failed: %d\n", ret);
        return ret;
    }

    /* 
     * Даем ПЛИС время (30 мс) на стабилизацию внутренних цепей,
     * чтобы к моменту опроса ядром статус DONE уже успел подняться.
     */
    msleep(30);

    dev_info(priv->dev, "Injected ISC_DISABLE (0x26) and wake-up clocks in complete phase.\n");
    return 0;
}