Rockchip · AI & Linux Hub

Linux и загрузка

Rockchip Linux WDT: драйвер, обслуживание, тайм-аут и приостановка счёта

Rockchip Linux WDT: драйвер, обслуживание, тайм-аут и приостановка счёта — V1.3.0 / V1.2.1

· ArmSoM Editorial · Rockchip source documentation · 5 мин чтения

Платформенная справка ArmSoM по китайскому RK-KF-YF-078 V1.3.0 (Linux 4.4/4.19/5.10/6.1); английский V1.2.1 перечисляет ядра лишь до 5.10. Проверяйте плату, BSP, конфигурацию ядра и регистры по конкретному SoC/TRM; поддержка всех плат ArmSoM не заявляется. Дополнительное английское описание GRF RK356X сохранено ниже. Отдельных технических рисунков в обеих версиях нет. Примеры не выполнялись, аппаратная проверка не проводилась.

Неясности исходника: для RK3506 devmem указан 0x0xff288028, а для io — 0xff288028. Значения RK3588: пауза 0x00010001, продолжение 0x00100000 имеют разные маски в обеих версиях. Значения сохранены, но не разрешены к слепому выполнению: сначала проверьте TRM/BSP. Пример 100MHz указывает 21 секунду (математически примерно 21,47); исходная формула сохранена. Поведение close/V/nowayout зависит от драйвера/ядра. Запись регистров или прекращение обслуживания может перезапустить устройство.

ArmSoM Docs · Rockchip Linux

1. Драйвер WDT

1.1 Файл драйвера

Путь драйвера: drivers/watchdog/dw_wdt.c.

1.2 Настройка узла DTS

См. Documentation/devicetree/bindings/watchdog/dw_wdt.txt. Основные параметры:

interrupts = <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH 0>;

В режиме прерываний сначала возникает прерывание, затем после ещё одного периода тайм-аута формируется сброс.

clocks = <&cru PCLK_WDT>;

Тактирование обеспечивает работу WDT и задаёт период счёта.

2. Использование WDT

Приложение управляет watchdog через /dev/watchdog, как в следующем примере.

int main(void)
{
    int fd = open("/dev/watchdog", O_WRONLY);    // open starts watchdog
    int ret = 0;
    if (fd == -1) {
        perror("watchdog");
        exit(EXIT_FAILURE);
    }
    while (1) {
        ret = write(fd, "\0", 1);      // write feeds watchdog
        if (ret != 1) {
            ret = -1;
            break;
        }
        sleep(10);
    }
    close(fd);
    return ret;
}

О close():

  1. Обычно после close() обслуживание прекращается, и watchdog перезапускает систему по тайм-ауту. echo A > /dev/watchdog записывает символ, отличный от прописной V. Последовательно выполняются open/write/close; после истечения тайм-аута система перезапускается.

  2. Вызовите write(fd, "V", 1); перед close(): прописная V заставляет ядро продолжить обслуживание, поэтому автоматического перезапуска нет. Пример: echo V > /dev/watchdog. В отличие от шага 1, подсистема watchdog обнаруживает V и запускает таймер ядра для автоматического обслуживания после close.

  3. Включите CONFIG_WATCHDOG_NOWAYOUT и повторите шаг 2: ядро не продолжает обслуживание, система перезапускается.

3. Настройка ядра

Symbol: WATCHDOG [=y]
Type  : boolean
Prompt: Watchdog Timer Support
    Location:
(1) -> Device Drivers
    Defined at drivers/watchdog/Kconfig:6

4. Частые вопросы

4.1 WDT невозможно остановить

У WDT нет собственного регистра остановки: остановка возможна отключением тактирования или программным сбросом. На некоторых чипах операции тактирования/сброса доступны только в защищённой среде. Новые SoC косвенно поддерживают остановку WDT через внешние регистры GRF. Поддерживаемые SoC перечислены в разделе о приостановке счёта.

4.2 Разрешение WDT

WDT имеет только 16 уровней с большой разницей числа отсчётов между соседними уровнями; точная настройка недоступна.

0000: 0x0000ffff
0001: 0x0001ffff
0010: 0x0003ffff
0011: 0x0007ffff
0100: 0x000fffff
0101: 0x001fffff
0110: 0x003fffff
0111: 0x007fffff
1000: 0x00ffffff
1001: 0x01ffffff
1010: 0x03ffffff
1011: 0x07ffffff
1100: 0x0fffffff
1101: 0x1fffffff
1110: 0x3fffffff
1111: 0x7fffffff

При тактовой частоте WDT 100 МГц исходник указывает максимальный тайм-аут 0x7fffffff / 100MHz = 21 секунду. Для большего тайм-аута требуется изменить соответствующее тактирование WDT.

4.3 Приостановка счёта

Команды Rockchip io или BusyBox devmem позволяют приостановить и возобновить счёт. Настройте два параметра ядра. Включите:

CONFIG_DEVMEM

Отключите:

CONFIG_STRICT_DEVMEM

Следующие адреса относятся к внешним регистрам WDT. См. главу GRF документа TRM соответствующего чипа.

Чип Пауза Продолжение
RK356X io -4 0xfdc60504 0x00100010 или busybox devmem 0xfdc60504 32 0x00100010 io -4 0xfdc60504 0x00100000 или busybox devmem 0xfdc60504 32 0x00100000
RK3588 io -4 0xfd58c000 0x00010001 или busybox devmem 0xfd58c000 32 0x00010001 io -4 0xfd58c000 0x00100000 или busybox devmem 0xfd58c000 32 0x00100000
RV1126B io -4 0x2010000c 0x04000400 или busybox devmem 0x2010000c 32 0x04000400 io -4 0x2010000c 0x04000000 или busybox devmem 0x2010000c 32 0x04000000
RV1103B io -4 0x20150008 0x00020002 или busybox devmem 0x20150008 32 0x00020002 io -4 0x20150008 0x00020000 или busybox devmem 0x20150008 32 0x00020000
RK3506
wdt0
io -4 0xff288028 0x1 или busybox devmem 0x0xff288028 32 0x1 io -4 0xff288028 0x0 или busybox devmem 0x0xff288028 32 0x0
RK3506
wdt1
io -4 0xff288028 0x4 или busybox devmem 0x0xff288028 32 0x4 io -4 0xff288028 0x0 или busybox devmem 0x0xff288028 32 0x0
RK2118 io -4 0x50210028 0x10001 или busybox devmem 0x50210028 32 0x10001 io -4 0x50210028 0x10000 или busybox devmem 0x50210028 32 0x10000
RK3576 io -4 0x2600a010 0x400040 или busybox devmem 0x2600a010 32 0x400040 io -4 0x2600a010 0x400000 или busybox devmem 0x2600a010 32 0x400000
RK3528 io -4 0xff380000 0x00100010 или busybox devmem 0xff380000 32 0x00100010 io -4 0xff380000 0x00100000 или busybox devmem 0xff380000 32 0x00100000

Согласно исходнику, чипы, отсутствующие в таблице, не поддерживают приостановку.

Дополнение английского V1.2.1 §4.3: адрес 0xfdc60504 относится к GRF_SOC_CON1 блока SYS_GRF; 1 в bit4 приостанавливает счёт, 0 возобновляет; старшие 16 бит — маска записи. Китайская таблица не раскрывает эту деталь, она сохранена из английского исходника.

Другие статьи по теме → · Учебные маршруты →