Переходя на платформу ARM думаем как можно упростить и удешевить сторожевой таймер, оставив его независимым.
Мы пользуемся только функциями аппаратной перезагрузкой системы, в случае глухого зависания.
И сброс питания модема в случае его залипания - я читал на форуме, что вроде как можно программно обесточить USB и заново подать питания, чтобы модем перезагрузился по питанию. Но как конкретно это делать - я не нашел, если можно, подскажите.
На многих SoC есть встроенный сторожевой таймер - это обычный аппаратный счетчик (вернее не совсем обычный - он специально предназначен для этого, его можно сконфигурировать только один раз - после этого даже если произойдет ошибочная запись в регистры его нельзя остановить или наоборот запустить) который достигнув порогового значения генерирует сигнал reset, чтобы он не сработал кто-то должен постоянно периодически обнулять счетчик. В Linux есть стандартный интерфейс для WDT и программы юзерспейс для его обнуления.
Для AT91SAM9G45 написана простенькая утилита для управления питанием USB портов (при загрузке ее лог выводится).
Писал ее по не знанию, достаточно было в системе прописать управляющие пины как GPIO, а далее рулить всем уже через скрипты.
В Linux есть еще стандартный интерфейс для управления питанием USB, не помню где нужно дергать через sysfs (можно нагуглить) но я не уверен - сработает ли это на этих платах (хотя пины для управления питанием прописаны в board-файлах - теоретически должно работать), на некоторых PC срабатывает.
он отключается в bootstrap - как я уже говорил отключить или сконфигурировать его можно только один раз, поэтому в ядре после этого уже ничего нельзя сделать. Не забывайте что убут грузится тоже не мгновенно так что там тоже нужно включать поддержку - иначе загрузка может и не успеть завершиться до запуска демона в юзерспейс который будет обнулять счетчик с заданной периодичностью - сторожевой таймер перезагрузит систему и так по кругу :)
А то непонятно что-то. Сам не настраивал ничего пока, демон запускается так по-умолчанию: watchdog -t 60 /dev/watchdog
Вроде как, получается, что таймер на 15 секунд, а сброс - через 60. То есть, должно бы всё перегружаться регулярно, но нет. Однако, в принципе, оно работает: если убить процесс watchdog, следует перезагрузка. Только перегружается в пределах 4-х секунд, раз 5 уже пробовал - невозможно же так попадать под конец работы счётчика... Ядро, при этом, грузится секунд 11-12...
1. bootstrap для nand собирается из того же at91bootstrap, только собирается с Flash Memory Technology > (x) NAND flash ?
Смущает расположение его в каталоге utils/SD_bootstrap (речь про виртуальный образ, который с платой раздаётся).
2. При сборке новым комилятором возникает ошибка
undefined reference to `__gnu_thumb1_case_uqi'
Кое-что в сети про это пишут, но мало. Я, пока, собрал для SD без "Build in thumb mode". Это только на размер влияет, как пишут, или ещё засады есть, всё же ? Кстати, тут тоже надо править файл board/<что-то>, если пытаться bootstrap обновить до 3.4.4, скажем ?
Судя вот по этому патчу: http://starterkit.ru/html/index.php?name=files&op=view&id=13
проблема замечена только в drivers/mtd/at45.c. В принципе, в u-boot-2010.09, как я смотрю, WATCHDOG_RESET() много где встречается. Так что, иметь ввиду надо, но не факт, что сразу наступишь. По крайней мере, у меня проблемы не видно пока с исходным u-boot.