AM437X uboot增加硬體看門狗

2021-09-25 01:12:07 字數 1836 閱讀 5914

剛開始想的方案是利用uboot中的看門狗定時器,在中斷裡面進行餵狗。但是經過幾天的折騰,內部看門狗開啟後達到溢位條件就會直接復位,沒辦法進入中斷,而且復位動作沒找到遮蔽的方法,所以只能放棄這個方案。

之後在網上搜到了一篇關於am335x uboot 看門狗餵狗的文章,寫的很詳細,根據這篇文章解決了這個問題。

1、在include/watchdog.**件中有巨集定義

#ifdef config_hw_watchdog 

#if defined(__assembly__)

#define watchdog_reset bl hw_watchdog_reset

#else

extern void hw_watchdog_reset(void);

#define watchdog_reset hw_watchdog_reset

#endif

其實,在uboot已經在原始碼中比較耗時、需要餵狗的地方穿插了餵狗函式。

所以,我們只需要開啟config_hw_watchdog開關以及實現hw_watchdog_reset餵狗函式。

2、開啟硬體看門狗,在板級標頭檔案中include/configs/am437x_evm.**件中加上巨集定義

#define config_hw_watchdog 1 

#define gpio_watchdog (3<<5 | 23)

gpio_watchdog這個值的設定是通過分析uboot原始碼中gpio_set_value()函式才知道如何設定。

根據原理圖找到引腳,然後在資料手冊中搜尋,查到看門狗復用gpio引腳為gpio3_23

3、然後在板級檔案board/ti/am437x/board.c中加入看門狗初始化函式以及餵狗函式hw_watchdog_reset

#ifdef config_hw_watchdog

void hw_watchdog_reset(void)

else }

void hw_watchdog_init(void)

#endif

4、在board/ti/am437x/mux.c新增引腳初始化**,並在board/ti/am437x/board.h中加上函式宣告。

static struct module_pin_mux wdt_pin_mux = ,	/* spi2_d1 */

,};void enable_wdt_pin_mux(void)

5、在common/board_f.c裡面已經呼叫了看門狗初始化函式並餵狗。最後編譯,uboot燒寫後即可使用。

用sd卡燒寫檔案系統即大檔案的時候系統會重啟,原因應該是讀寫sd卡檔案的函式沒有進行餵狗,

解決辦法:

sd卡燒寫檔案系統時餵狗

在drivers/mmc/omap_hsmmc.c檔案中加上標頭檔案

#include

修改函式如下:

static int mmc_read_data(hsmmc_t *mmc_base, char *buf, unsigned int size) 

} while (mmc_stat == 0);

……………………………….

} static int mmc_write_data(hsmmc_t *mmc_base, const char *buf, unsigned int size)

} while (mmc_stat == 0);

……………………….

}