在drivers/base/core.c 中有dev_err 等的实现
2808 #define define_dev_printk_level(func, kern_level) \
2809 void func(const struct device *dev, const char *fmt, ...) \
2810 { \
2811 struct va_format vaf; \
2812 va_list args; \
2813 \
2814 va_start(args, fmt); \
2815 \
2816 vaf.fmt = fmt; \
2817 vaf.va = &args; \
2818 \
2819 __dev_printk(kern_level, dev, &vaf); \
2820 \
2821 va_end(args); \
2822 } \
2823 EXPORT_SYMBOL(func);
2824
2825 define_dev_printk_level(dev_emerg, KERN_EMERG);
2826 define_dev_printk_level(dev_alert, KERN_ALERT);
2827 define_dev_printk_level(dev_crit, KERN_CRIT);
2828 define_dev_printk_level(dev_err, KERN_ERR);
注意在dev_err 等的函数实现define_dev_printk_level 中的fmt,这样我们在自己的驱动中可以通过定义
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
这样在驱动中通过dev_err(dev, "can't read time\n"); 打印error log的话,实际效果如下:
rtc-efi rtc-efi: can't read time
这里的关键就是KBUILD_MODNAME,
obj-$(CONFIG_RTC_DRV_EFI) += rtc-efi.o
从makefile中就可以看到这个.o的KBUILD_MODNAME 就是rtc-efi.
---------------------
原文:https://blog.csdn.net/tiantao2012/article/details/76443736