android底层驱动学习之log的输出
2016-12-13 14:39
1601 查看
1.对于printk()函数:
用法:printk( KERN_DEBUG "Serial: 21285 driver\n");//红色字体为level
那么在linux/kernel文件中:
#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>"
而当前默认的level为
#define DEFAULT_CONSOLE_LOGLEVEL 7
所以例子中的信息是打不出来的,要level大于7的才可以打出来。
将#define DEFAULT_CONSOLE_LOGLEVEL 7--------》#define DEFAULT_CONSOLE_LOGLEVEL
8
这样就可以了!
2.对于 dev_emerg/dev_alert/dev_crit/dev_err/dev_warn/dev_notice/_dev_info 函数
#define define_dev_printk_level(func, kern_level)
\
int func(const struct device *dev, const char *fmt, ...)
\
{ \
struct va_format vaf;
\
va_list args;
\
int r;
\
\
va_start(args, fmt);
\
\
vaf.fmt = fmt;
\
vaf.va = &args;
\
\
r = __dev_printk(kern_level, dev, &vaf);
\
va_end(args);
\
\
return r;
\
} \
EXPORT_SYMBOL(func);
define_dev_printk_level(dev_emerg, KERN_EMERG);
define_dev_printk_level(dev_alert, KERN_ALERT);
define_dev_printk_level(dev_crit, KERN_CRIT);
define_dev_printk_level(dev_err, KERN_ERR);
define_dev_printk_level(dev_warn, KERN_WARNING);
define_dev_printk_level(dev_notice, KERN_NOTICE);
define_dev_printk_level(_dev_info, KERN_INFO);
#endif
这里利用宏 define_dev_printk_level 定义了 dev_emerg/dev_alert/dev_crit/dev_err/dev_warn/dev_notice/_dev_info 等几个函数。其实这几个函数归根结底都是函数调用__dev_printk。
那下面再来看下__dev_printk函数的定义:
int __dev_printk(const char *level, const struct
device *dev,
struct va_format *vaf)
{
if (!dev)
return printk("%s(NULL device *): %pV", level, vaf);
return printk("%s%s %s: %pV",
level, dev_driver_string(dev), dev_name(dev), vaf);
}
而__dev_printk调用的就是prinkk函数,该函数上面已经讲过,就是通过DEFAULT_CONSOLE_LOGLEVEL
来控制的,一般现在这个值为7,所以这几个函数的信息全部都可以打印出来。
3.对于dev_dbg()
还是先看定义:
#define
dev_dbg(dev, format, arg...) \
dev_printk(KERN_DEBUG, dev, format, ##arg)
看到没有歧视调用的也是dev_printk(),只不过level变成KERN_DEBUG,也就是打印不出来,所以如果需要将其信息打印出来还是要改DEFAULT_CONSOLE_LOGLEVEL为8才行。
用法:printk( KERN_DEBUG "Serial: 21285 driver\n");//红色字体为level
那么在linux/kernel文件中:
#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>"
而当前默认的level为
#define DEFAULT_CONSOLE_LOGLEVEL 7
所以例子中的信息是打不出来的,要level大于7的才可以打出来。
将#define DEFAULT_CONSOLE_LOGLEVEL 7--------》#define DEFAULT_CONSOLE_LOGLEVEL
8
这样就可以了!
2.对于 dev_emerg/dev_alert/dev_crit/dev_err/dev_warn/dev_notice/_dev_info 函数
#define define_dev_printk_level(func, kern_level)
\
int func(const struct device *dev, const char *fmt, ...)
\
{ \
struct va_format vaf;
\
va_list args;
\
int r;
\
\
va_start(args, fmt);
\
\
vaf.fmt = fmt;
\
vaf.va = &args;
\
\
r = __dev_printk(kern_level, dev, &vaf);
\
va_end(args);
\
\
return r;
\
} \
EXPORT_SYMBOL(func);
define_dev_printk_level(dev_emerg, KERN_EMERG);
define_dev_printk_level(dev_alert, KERN_ALERT);
define_dev_printk_level(dev_crit, KERN_CRIT);
define_dev_printk_level(dev_err, KERN_ERR);
define_dev_printk_level(dev_warn, KERN_WARNING);
define_dev_printk_level(dev_notice, KERN_NOTICE);
define_dev_printk_level(_dev_info, KERN_INFO);
#endif
这里利用宏 define_dev_printk_level 定义了 dev_emerg/dev_alert/dev_crit/dev_err/dev_warn/dev_notice/_dev_info 等几个函数。其实这几个函数归根结底都是函数调用__dev_printk。
那下面再来看下__dev_printk函数的定义:
int __dev_printk(const char *level, const struct
device *dev,
struct va_format *vaf)
{
if (!dev)
return printk("%s(NULL device *): %pV", level, vaf);
return printk("%s%s %s: %pV",
level, dev_driver_string(dev), dev_name(dev), vaf);
}
而__dev_printk调用的就是prinkk函数,该函数上面已经讲过,就是通过DEFAULT_CONSOLE_LOGLEVEL
来控制的,一般现在这个值为7,所以这几个函数的信息全部都可以打印出来。
3.对于dev_dbg()
还是先看定义:
#define
dev_dbg(dev, format, arg...) \
dev_printk(KERN_DEBUG, dev, format, ##arg)
看到没有歧视调用的也是dev_printk(),只不过level变成KERN_DEBUG,也就是打印不出来,所以如果需要将其信息打印出来还是要改DEFAULT_CONSOLE_LOGLEVEL为8才行。
相关文章推荐
- android底层驱动学习之内核信息的输出以及控制方式
- android底层驱动学习之调试驱动DEVICE_ATTR的原理及用法
- android底层驱动学习之I2C概述及工作原理(一)
- android底层驱动学习之如何通过debugfs创建文件的方式来调试内核信息
- android底层驱动学习之java基本语法的学习(二)
- 【2】android底层驱动开发学习及Ubuntu使用问题
- android底层驱动学习之DebugFS的用法,以及对file_operations的进一步理解
- android底层驱动学习之debug方法(proc、sysfs、debugfs)
- android底层驱动学习之设备树驱动及设备匹配过程
- android底层驱动学习之日志信息、printk的个人理解
- android底层驱动学习之工作队列work_queue相关参数
- android底层驱动学习之内存初步
- 【1】android底层驱动开发学习及Ubuntu使用问题
- android底层驱动学习之focaltech触屏实例理解
- android底层驱动学习之I2C(二)---以C语言理解IIC
- android底层驱动学习之从应用程序如何到底层driver的调用
- android底层驱动学习之linux输入子系统的理解
- 【4】android底层驱动开发学习
- android底层驱动学习之 module_init的内核调用顺序
- android底层驱动学习之java基本语法的学习(一)