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


#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/i2c-dev.h>

int main(int argc, char *argv[]) {
    if (argc < 2) {
        printf("Использование: %s <i2c-dev-path> (например, /dev/i2c-0)\n", argv[0]);
        return 1;
    }

    int fd = open(argv[1], O_RDWR);
    if (fd < 0) { perror("Не удалось открыть I2C шину"); return 1; }

    // FORCE обязателен, чтобы обойти блокировки драйвера Linux
    if (ioctl(fd, I2C_SLAVE_FORCE, 0x40) < 0) { perror("Ошибка установки I2C адреса"); return 1; }

    printf("[RECOVERY] Старт форсированной реанимации LIFCL-40...\n");

    // 1. Отправляем ваш LSC_REFRESH (0x79) в чистом виде для перезапуска sysCONFIG автомата
    unsigned char lsc_refresh[] = { 0x79, 0x00, 0x00, 0x00 };
    printf("-> Шаг 1: Отправка LSC_REFRESH (0x79)\n");
    if (write(fd, lsc_refresh, 4) != 4) { perror("Сбой при отправке REFRESH"); }
    
    // КРИТИЧЕСКАЯ ПАУЗА: ПЛИС требуется время, чтобы аппаратно перезагрузить внутреннее ядро
    usleep(100000); // 100 мс

    // Переоткрываем дескриптор: при REFRESH ПЛИС на долю секунды исчезает с шины
    close(fd);
    fd = open(argv[1], O_RDWR);
    ioctl(fd, I2C_SLAVE_FORCE, 0x40);

    // 2. Отправляем ваш Activation Key для перевода slave-порта в активный режим
    unsigned char act_key[] = { 0xA4, 0xC6, 0xF4, 0x8A };
    printf("-> Шаг 2: Отправка ACTIVATION_KEY\n");
    if (write(fd, act_key, 4) != 4) { perror("Сбой при отправке Activation Key"); return 1; }
    usleep(10000); // 10 мс

    // 3. Принудительно зажигаем светодиод DONE (Опкод 0x5E - LSC_PROG_DONE)
    unsigned char lsc_programd[] = { 0x5E, 0x00, 0x00, 0x00 };
    printf("-> Шаг 3: Отправка PROGRAM DONE (0x5E)\n");
    if (write(fd, lsc_programd, 4) != 4) { perror("Сбой при отправке PROGRAM DONE"); return 1; }
    usleep(10000);

    // 4. Корректно завершаем сессию (0x26 - ISC_DISABLE)
    unsigned char isc_disable[] = { 0x26, 0x00, 0x00, 0x00 };
    printf("-> Шаг 4: Отправка ISC_DISABLE (0x26)\n");
    if (write(fd, isc_disable, 4) != 4) { perror("Сбой при отправке ISC_DISABLE"); }

    printf("[RECOVERY] Все команды отправлены. Проверьте светодиод DONE и JTAG.\n");

    close(fd);
    return 0;
}