cm3588-hw-watchdog-reset-8.ino
Programme C minimaliste pour activer le watchdog matériel (dw_wdt) du RK3588 et provoquer un reset si le service n'est pas périodiquement relancé.
Le RK3588 possède un watchdog interne accessible via /dev/watchdog. Sous Linux, le module 'dw_wdt' doit être chargé. Ce code démontre l'API v4l2/watchdog. En production, utilisez systemd ou un script de service pour nourrir le watchdog (WDIOC_KEEPALIVE) toutes les N/2 secondes.
cm3588-hw-watchdog-reset-8.ino
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/watchdog.h>
#define DEV_NAME "/dev/watchdog"
int main() {
int fd;
struct watchdog_info ident;
struct watchdog_status status;
int timeout = 15; // Timeout en secondes
// Ouvrir le fichier de périphérique watchdog
fd = open(DEV_NAME, O_WRONLY);
if (fd < 0) {
perror("Erreur: Impossible d'ouvrir /dev/watchdog");
return 1;
}
// Définir le délai avant réinitialisation
if (ioctl(fd, WDIOC_SETTIMEOUT, &timeout) < 0) {
perror("Erreur: Impossible de définir le timeout");
close(fd);
return 1;
}
printf("Watchdog activé avec un timeout de %d secondes.\n", timeout);
printf("Le programme va maintenant 'geler' volontairement pour tester le reset...\n");
// Boucle qui arrête de nourrir le watchdog (pet-ting)
// Normalement, on utiliserait un while(1) { ioctl(fd, WDIOC_KEEPALIVE, 0); sleep(5); }
int i = 0;
while (1) {
// On ne nourrit PAS le watchdog ici pour provoquer un crash/reset
sleep(1);
if (i++ % 5 == 0) {
printf("... {countdown}\n");
}
if (i > 20) return 0; // Ne devrait pas être atteint si le watchdog fonctionne
}
close(fd);
return 0;
}