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