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;
}