在启动我的linux内核时,我得到了这样的日志文件,导致这个以及如何解决..?
------------[ cut here ]------------
WARNING: at drivers/gpio/gpiolib.c:1423 0xa02147ab()
Modules linked in:
Backtrace: no frame pointer
---[ end trace ccc3de96c2b87179 ]---
------------[ cut here ]------------
WARNING: at drivers/gpio/gpiolib.c:1423 0xa02147ab()
Modules linked in:
Backtrace: no frame pointer
---[ end trace ccc3de96c2b8717a ]---
------------[ cut here ]------------
WARNING: at drivers/gpio/gpiolib.c:1423 0xa02147ab()
Modules linked in:
Backtrace: no frame pointer
---[ end trace ccc3de96c2b8717b ]---
ds3232 0-0068: rtc core: registered ds3232 as rtc0
i2c-gpio i2c-gpio.0: using pins 27 (SDA) and 28 (SCL)
答案 0 :(得分:1)
密切注意内核日志中的以下行:
WARNING: at drivers/gpio/gpiolib.c:1423 0xa02147ab()
这表示此打印是从文件1423
drivers/gpio/gpiolib.c
触发的
WARN_ON()
。
int __gpio_get_value(unsigned gpio)
{
struct gpio_chip *chip;
chip = gpio_to_chip(gpio);
WARN_ON(extra_checks && chip->can_sleep);
return chip->get ? chip->get(chip, gpio - chip->base) : 0;
}
<子>
注意:上面的代码是(arch = x86上的v2.6.33)。在继续上述分析之前,请确认您确实在x86硬件上运行Linux Kernel v2.6.33。行号随内核版本而变化。您可能会在不同内核版本的同一行上同时遇到WARN_ON()
的不同函数。
子>
更新:
由于此问题是在与RTC-DS3232外围设备通信时造成的(否则其工作正常),我们可以禁用警告。
执行此操作的一种方法是在Linux内核构建配置中禁用CONFIG_DEBUG
。这反过来会禁用gpio驱动程序中的extra_checks
。
或者,可以在 drivers/gpio/gpiolib.c:34 处覆盖extra_checks
的定义,如下所示
/* When debugging, extend minimal trust to callers and platform code.
* Also emit diagnostic messages that may help initial bringup, when
* board setup or driver bugs are most common.
*
* Otherwise, minimize overhead in what may be bitbanging codepaths.
*/
#ifdef DEBUG
#define extra_checks 1
#else
#define extra_checks 0
#endif
/* override extra_checks irrespective of debug-mode */
#define extra_checks 0