剛開始想的方案是利用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);
……………………….
}