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