cm3588-hw-watchdog-reset-8.ino

Module SOM FriendlyElec CM3588 (Rockchip RK3588) · Fichier : cm3588-hw-watchdog-reset-8.ino · Langage : C · Usage : Configurer le watchdog matériel interne du RK3588 pour réinitialiser le système en cas de gelage logiciel.

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

← Retour à la fiche