static int sysconfig_i2c_bitstream_burst_complete(struct sysconfig_priv *priv)
{
struct i2c_client *client = to_i2c_client(priv->dev);
struct i2c_msg msg;
/* Команда 1: ISC_PROGRAM_DONE (0x5E) + 3 байта пустых операндов */
const u8 isc_program_done[] = {0x5E, 0x00, 0x00, 0x00};
/* Команда 2: ISC_DISABLE (0x26) + 3 байта пустых операндов */
const u8 isc_disable[] = {0x26, 0x00, 0x00, 0x00};
int ret;
/* ШАГ A: Принудительно взводим бит DONE внутри ПЛИС */
printk("%s(%d) Sending ISC_PROGRAM_DONE (0x5E)...\n", __FUNCTION__, __LINE__);
msg.addr = client->addr;
msg.flags = client->flags & I2C_M_TEN;
msg.len = sizeof(isc_program_done);
msg.buf = (u8 *)isc_program_done;
ret = i2c_transfer(client->adapter, &msg, 1);
if (ret != 1) return (ret < 0) ? ret : -EIO;
/* Короткая пауза 5 миллисекунд для завершения внутренних автоматов */
usleep_range(5000, 6000);
/* ШАГ Б: Выводим ПЛИС из режима программирования sysCONFIG */
/* Эта команда заставит Nexus активировать пользовательскую матрицу (Wake-Up) */
printk("%s(%d) Sending ISC_DISABLE (0x26) to awake FPGA...\n", __FUNCTION__, __LINE__);
msg.len = sizeof(isc_disable);
msg.buf = (u8 *)isc_disable;
ret = i2c_transfer(client->adapter, &msg, 1);
if (ret != 1) return (ret < 0) ? ret : -EIO;
/* Даем ПЛИС 20 миллисекунд на активацию всех блоков ввода-вывода (GSR/GWE) */
msleep(20);
printk("%s(%d) FPGA Wake-Up sequence initiated successfully!\n", __FUNCTION__, __LINE__);
return 0;
}