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


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