1、最近在寫I2C下EEPROM的驅動程式,但發現使用i2c_new_probed_device函數無法枚舉到裝置,於是想調試該函數(位於driver/i2c/i2c-core.c內),看到其中有些調試資訊如下:
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中)
#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中修改代碼如下:
#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已經能夠列印出來,如下圖:
這是為什麼
但是這個開啟了之後,也不能順利的輸出資訊,原因是printk有預設的資訊層級。
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>"
可以看到KERN_DEBUG是層級最低的。
2、修改檔案kernel/printk檔案
#define DEFAULT_MESSAGE_LOGLEVEL 4
#define MINIMUM_CONSOLE_LOGLEVEL 1
#define DEFAULT_CONSOLE_LOGLEVEL 8
其中DEFAULT_CONSOLE_LOGLEVEL 為終端console輸出的最低層級,比這嚴重的都將輸出。原來該值為7,則調試資訊無法輸出,修改為8則全部有輸出。 PS:這樣即可
echo 8 > /proc/sys/kernel/printk