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


static int sysconfig_i2c_bitstream_burst_complete(struct sysconfig_priv *priv)
{
    struct i2c_client *client = to_i2c_client(priv->dev);
    struct i2c_msg msg;
    u8 dummy_buf[4];
    int i, ret;

    printk("%s(%d) Generating standard Wake-Up clocks via dummy I2C reads...\n", __FUNCTION__, __LINE__);

    /* 
     * Конфигурируем фиктивное чтение 4-х байт по адресу ПЛИС.
     * Каждая такая транзакция сгенерирует на шине:
     * START + Адрес (8 бит) + ACK + 32 такта данных + NACK + STOP.
     * Суммарно одна транзакция даст ПЛИС ~43 такта SCL.
     */
    msg.addr = client->addr;
    msg.flags = I2C_M_RD; 
    msg.len = sizeof(dummy_buf);
    msg.buf = dummy_buf;

    /* Делаем 15-20 фиктивных чтений подряд с микропаузами */
    /* Это даст ПЛИС около 800 тактов SCL, необходимых для работы Wake-Up автомата */
    for (i = 0; i < 20; i++) {
        ret = i2c_transfer(client->adapter, &msg, 1);
        /* Пауза 500 микросекунд, чтобы внутренний криптопроцессор Nexus успевал думать */
        usleep_range(500, 800);
    }

    /* Финальная пауза 10 миллисекунд перед тем, как управление перейдет к чтению статуса */
    msleep(10);

    printk("%s(%d) Wake-Up clocks successfully generated.\n", __FUNCTION__, __LINE__);
    return 0;
}