程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Android/Linux驅動開發之使用dev_dbg調試設備驅動

Android/Linux驅動開發之使用dev_dbg調試設備驅動

編輯:Delphi

、最近在寫I2C下EEPROM的驅動程序,但發現使用i2c_new_probed_device函數無法枚舉到設備,於是想調試該函數(位於driver/i2c/i2c-core.c內),看到其中有些調試信息如下:


[cpp]
i2c_new_probed_device(...) 

    ... 
    if (addr_list[i] == I2C_CLIENT_END) { 
        dev_dbg(&adap->dev, "Probing failed, no device found\n"); 
        return NULL; 
    } 
    ... 

i2c_new_probed_device(...)
{
    ...
 if (addr_list[i] == I2C_CLIENT_END) {
  dev_dbg(&adap->dev, "Probing failed, no device found\n");
  return NULL;
 }
 ...
}但加載驅動模塊,該類調試信息並未打印出來(執行dmesg命令後同樣未找到調試信息)。

2、列出dev_dbg源碼實現:(include/linux/device.h中)


[cpp]
#if defined(DEBUG)  
#define dev_dbg(dev, format, arg...)        \  
    dev_printk(KERN_DEBUG , dev , format , ## arg) 

#if defined(DEBUG)
#define dev_dbg(dev, format, arg...)  \
 dev_printk(KERN_DEBUG , dev , format , ## arg)問題找出,只需在引用頭文件#include/linux/device.h前定義DEBUG宏即可。

在include/linux/i2c.h中修改代碼如下:

 

[cpp]
#define DEBUG                  /* add for debug eeprom */  
#include <linux/device.h> /* for struct device */  
#undef DEBUG                   /* add for debug eeprom */ 

#define DEBUG                  /* add for debug eeprom */
#include <linux/device.h> /* for struct device */
#undef DEBUG                   /* add for debug eeprom */
加載驅動驅動模塊後,並沒有調試信息打印出。如下圖:

 

\
但執行dmesg命令後Probing failed, no device found已經能夠打印出來,如下圖:

 \

這是為什麼呢?

3、注意dev_printk的打印級別:


[cpp]
dev_printk(KERN_DEBUG , dev , format , ## arg) 

dev_printk(KERN_DEBUG , dev , format , ## arg)這裡有個KERN_DEBUG的打印級別,其他級別如下(include/linux/kernel.h中):


[cpp]
#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         */ 

#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   */可以看到KERN_DEBUG級別最低為7。
再看/kernel/printk.c下的一個宏:


[cpp]
#define DEFAULT_CONSOLE_LOGLEVEL  7 /* anything MORE serious than KERN_DEBUG */ 

#define DEFAULT_CONSOLE_LOGLEVEL  7 /* anything MORE serious than KERN_DEBUG */該行表示只有打印級別高於DEFAULT_CONSOLE_LOGLEVEL(值小於DEFAULT_CONSOLE_LOGLEVEL的值)的打印才會出現在終端上。而 KERN_DEBUG也為7,所以我們的調試不會直接打印出來。

將該行修改為:


[cpp]
#define DEFAULT_CONSOLE_LOGLEVEL  8 /* anything MORE serious than KERN_DEBUG */ 

#define DEFAULT_CONSOLE_LOGLEVEL  8 /* anything MORE serious than KERN_DEBUG */來保證KERN_DEBU的值小於DEFAULT_CONSOLE_LOGLEVEL,然後加載eeprom驅動模塊後:調試信息能夠正確打印出來。

 \


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved