linuxカーネルはどのように自分の印刷関数を定義します

2105 ワード

自分がwatchdogドライブをするときに使う簡単な例を共有します.
定義:
#define WDT_INFO(fmt, ...) \
	pr_info("mero_wdt: %s: " fmt, __func__, ##__VA_ARGS__)
#define WDT_ERROR(fmt, ...) \
	pr_err("mero_wdt: %s: " fmt, __func__, ##__VA_ARGS__)
#define WDT_DEBUG(fmt, ...) \
	pr_debug("mero_wdt: %s: " fmt, __func__, ##__VA_ARGS__)

次の操作を行います.
static void
__wdt_stop_nolock(struct mero_watchdog_device *mw)
{
	u32 wtcon, wtclr;
	
	wtcon = ioread32(mw->wdt_base + WDT_WTCON);
	WDT_ERROR("WDT_WTCON ---->  0x%x", wtcon); 

	wtcon = ioread32(mw->wdt_base + WDT_WTCON);
	wtcon &= ~(WDT_CON_ENABLE | WDT_CON_RSTEN);

	WDT_ERROR("0x%x ----> WDT_WTCON", wtcon); 
	iowrite32(wtcon, mw->wdt_base + WDT_WTCON);
	wtcon = ioread32(mw->wdt_base + WDT_WTCON);
	WDT_ERROR("WDT_WTCON ---->  0x%x", wtcon); 
	
	WDT_ERROR("0x12345678 ----> WDT_WTCLRIN");
	iowrite32(0x12345678, mw->wdt_base + WDT_WTCLRINT);
	wtclr = ioread32(mw->wdt_base + WDT_WTCLRINT);
	WDT_ERROR("WDT_WTCLRINT ----> 0x%x", wtclr);
	
	WDT_ERROR("0x87654321 ----> WDT_WTCLRIN");
	iowrite32(0x87654321, mw->wdt_base + WDT_WTCLRINT);
	wtclr = ioread32(mw->wdt_base + WDT_WTCLRINT);
	WDT_ERROR("WDT_WTCLRINT ----> 0x%x", wtclr);

	wtcon = ioread32(mw->wdt_base + WDT_WTCON);
	WDT_ERROR("WDT_WTCON ---->  0x%x", wtcon); 

}

出力:

[  205.619600] mero_wdt: wdt_stop: wdt_stop is called
[  205.620384] mero_wdt: __wdt_stop_nolock: WDT_WTCON ---->  0x9
[  205.621061] mero_wdt: __wdt_stop_nolock: 0x0 ----> WDT_WTCON
[  205.621874] mero_wdt: __wdt_stop_nolock: WDT_WTCON ---->  0x8
[  205.622674] mero_wdt: __wdt_stop_nolock: 0x12345678 ----> WDT_WTCLRIN
[  205.623487] mero_wdt: __wdt_stop_nolock: WDT_WTCLRINT ----> 0x12345678
[  205.624396] mero_wdt: __wdt_stop_nolock: 0x87654321 ----> WDT_WTCLRIN
[  205.625319] mero_wdt: __wdt_stop_nolock: WDT_WTCLRINT ----> 0x87654321
[  205.626229] mero_wdt: __wdt_stop_nolock: WDT_WTCON ---->  0x0