linux驱动中打印日志

Linux  printk
printk( ) 函数中可以指定日志的级别。
#define KERN_EMERG    "<0>"    /* system is unusable            */
#define KERN_ALERT    "<1>"    /* action must be taken immediately    */
#define KERN_CRIT    "<2>"    /* critical conditions        */
#define KERN_ERR    "<3>"    /* error conditions            */
#define KERN_WARNING    "<4>"    /* warning conditions        */
#define KERN_NOTICE    "<5>"    /* normal but significant condition    */
#define KERN_INFO    "<6>"    /* informational            */
#define KERN_DEBUG    "<7>"    /* debug-level messages    */

值越小,其级别越高。
printk(KERN_WARNING “abcdefg\n”),指定了此日志的级别为KERN_WARNING
printk(“abcdefg\n”),没有指定日志的输出级别,则使用系统默认的日志级别 DEFAULT_MESSAGE_LOGLEVEL
在printk.c中,定义DEFAULT_MESSAGE_LOGLEVEL
/* printk's without a loglevel use this.. */
#define DEFAULT_MESSAGE_LOGLEVEL CONFIG_DEFAULT_MESSAGE_LOGLEVEL

在内核驱动中,我们常使用的打印函数是
int dev_printk(const char *level, const struct device *dev, const char *fmt, ...)
这个函数相比printk的好处是,它能够打印出设备和驱动名称的信息。
还有一个函数dev_dbg(dev, format, arg...),它实际上是一个dev_printk的简化宏
#if defined(DEBUG)
#define dev_dbg(dev, format, arg...)        \
    dev_printk(KERN_DEBUG, dev, format, ##arg)
这个函数指定了dev_printk 的输出级别为KERN_DEBUG。由其定义可知,要使用此宏,必须在代码中#define DEBUG 1


在内核中,有几个与dev_dbg类似的函数,对应各自不同的日志级别。不过,使用下面这些函数,不需要#define DEBUG 1
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);

#define dev_info(dev, fmt, arg...) _dev_info(dev, fmt, ##arg)
另有两个在debug是很有用的函数
#define dev_WARN(dev, format, arg...) \
    WARN(1, "Device: %s\n" format, dev_driver_string(dev), ## arg);

#define dev_WARN_ONCE(dev, condition, format, arg...) \
    WARN_ONCE(condition, "Device %s\n" format, \
            dev_driver_string(dev), ## arg)
代码里面的对这两个函数的注释是:
* dev_WARN*() acts like dev_printk(), but with the key difference of using a WARN/WARN_ON to get the message out, including the file/line information and a backtrace.
它的日志中包含了文件名 行号 及堆栈等信息。而dev_WARN_ONCE则可以通过condition来指定输出日志的条件。










以上都是关于日志输出及其级别的,控制台通过输出日志级别控制来决定各级别的日志是否需要从控制台输出,例如串口等虚拟控制台。
#define MINIMUM_CONSOLE_LOGLEVEL 1 /* Minimum loglevel we let people use */
#define DEFAULT_CONSOLE_LOGLEVEL 7 /* anything MORE serious than KERN_DEBUG */
int console_printk[4] = {
    DEFAULT_CONSOLE_LOGLEVEL,    /* console_loglevel */
    DEFAULT_MESSAGE_LOGLEVEL,    /* default_message_loglevel */
    MINIMUM_CONSOLE_LOGLEVEL,    /* minimum_console_loglevel */
    DEFAULT_CONSOLE_LOGLEVEL,    /* default_console_loglevel */
};
console_printk的4个数据分别对应控制台日志级别、默认的消息日志级别、最低的控制台日志级别和默认的控制台日志级别。
可用下面的命令设置当前控制台输出日志级别:
# cat  /proc/sys/kernel/printk
# echo 8 > /proc/sys/kernel/printk


另一个比较有效控制log的方法的是使用module_param(debugLevel,int,0),
module_param可以在模块中传入参数,这个参数是可以在终端中通过
echo x > /sys/module/xxx/parameters/debugLevel 来修改的,因此,我们可以此来动态的控制单独某一个模块的log输出,在需要的时候,打印出log。例如:
#define tchip_dev_dbg(dbg_level, dev, format, arg...) \
do {                                      \
if (dbg_level <= debugLevel)       \
dev_info(dev, format, ##arg)    \
}while(0)

或者

#define dprintk(level, fmt, arg...) do {            \
    if (debugLeve >= level)                     \
    printk(KERN_WARNING"rk29xx_ft5x0x: " fmt , ## arg); } while (0)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值