首先,在LK中,有一个对log打印级别的控制文档,其路径一般为:vendor\mediatek\proprietary\bootable\bootloader\lk\include\debug.h(以mtk平台为例)
在include\debug.h重要代码为:
//下面做个判断:意思是如果makefile(相应的平台mk文件) 定义了DEBUG的值,就是用它,否则默认为2等级
//在bootloader\lk\project\rlk6737m_65_n.mk中:DEBUG := 2
#if defined(DEBUG)
#define DEBUGLEVEL DEBUG
#else
#define DEBUGLEVEL 2
#endif
/* debug levels 调试级别*/
#define CRITICAL 0 //数字越小级别越高,打印的信息log越少
#define ALWAYS 0
#define INFO 1
#define SPEW 2
/* output */ 输出方式介绍
void _dputc(char c); // XXX for now, platform implements 平台工具
int _dputs(const char *str);
int _dprintf(const char *fmt, ...) __PRINTFLIKE(1, 2);
int _dvprintf(const char *fmt, va_list ap);
//下面的这些打印方法具体含义是:如果级别<=之前定义的调试级别的话就打印否则不打印
#define dputc(level, str) do { if ((level) <= DEBUGLEVEL) { _dputc(str); } } while (0)
#define dputs(level, str) do { if ((level) <= DEBUGLEVEL) { _dputs(str); } } while (0)
#define dprintf(level, x...) do { if ((level) <= DEBUGLEVEL) { _dprintf(x); } } while (0)
#define dvprintf(level, x...) do { if ((level) <= DEBUGLEVEL) { _dvprintf(x); } } while (0)
相关DEBUG的定义有不同的方式方法,如下例子:
法①、在bootable\bootloader\lk\project\rlk6757_66_n.mk:
DEBUG :=2
这时也要注意:不要看到这里是2就表示都会打印,我现在遇到一个项目虽然在\lk\project\rlk6757_66_n.mk文件中配置了DEBUG :=2,但log并没有打印出来,原因最后找到了:
#ifdef LK_PROFILING
dprintf(INFO, "[PROFILE] ------- WDT Init takes %d ms -------- \n", (int)get_timer(time_wdt_early_init)); //打印不出来
#endif
最后发现在类似的bootable\bootloader\lk\target\rlk6757_66_n(project)\rules.mk中:
LK_PROFILING := no //LK_PROFILING := yes 一般项目都会使这个宏,所以之前并没有太关注,后续项目可能会为了性能,把log后期以这种方式关掉,注意一下
法②、在lk\include\platform\debug.h中定义了这个函数:
void debug_set_trace_level(int trace_type, int level); //设置调试级别
法③、还有在具体的代码中:如:
#define DEBUG //这里定义了这个宏
#ifdef DEBUG //判断是不是定义了,定义了就执行下面的
#define LCM_DEBUG(fmt, args...) _dprintf(fmt, ##args)
#else
#define LCM_DEBUG(fmt, args...) do {} while(0)
#endif
printk日志打印級別
#define KERN_EMERG "<0>" 系统崩溃
#define KERN_ALERT "<1>" 必须紧急处理
#define KERN_CRIT "<2>" 临界条件,严重的硬软件错误
#define KERN_ERR "<3>" 报告错误
#define KERN_WARNING "<4>" 警告
#define KERN_NOTICE "<5>" 普通但还是须注意
#define KERN_INFO "<6>" 信息
#define KERN_DEBUG "<7>" 调试信息
#通过输入命令设置printk打印输出log的等级
echo "1 2 3 4" > /proc/sys/kernel/printk
分别表示:
1:当前控制台日志级别 ,第一个参数设置为1表示 KERN_ALERT
2:默认消息日志级别
3:最小的控制台级别
4:默认控制台日志级别