Платформенная справка 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 зависит от драйвера/ядра. Запись регистров или прекращение обслуживания может перезапустить устройство.
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():
-
Обычно после
close()обслуживание прекращается, и watchdog перезапускает систему по тайм-ауту.echo A > /dev/watchdogзаписывает символ, отличный от прописной V. Последовательно выполняются open/write/close; после истечения тайм-аута система перезапускается. -
Вызовите
write(fd, "V", 1);передclose(): прописная V заставляет ядро продолжить обслуживание, поэтому автоматического перезапуска нет. Пример:echo V > /dev/watchdog. В отличие от шага 1, подсистема watchdog обнаруживает V и запускает таймер ядра для автоматического обслуживания после close. -
Включите
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 бит — маска записи. Китайская таблица не раскрывает эту деталь, она сохранена из английского исходника.
