在kernel4.4下,添加模块时,使用module_init来进行注册,发现在module_init中的一句log信息打印不出来,具体代码如下:
static const struct i2c_device_id xxxx_i2c_id[] = {
{XXXX_I2C_NAME, 0},
{}
};
static const struct of_device_id extpa_of_match[] = {
{.compatible = "xxxx,xxxx_pa"},
{}
};
static struct i2c_driver xxxx_i2c_driver = {
.driver = {
.owner = THIS_MODULE,
.name = xxxxx_I2C_NAME,
.of_match_table = extpa_of_match,
},
.probe = xxxx_i2c_probe,
.remove = xxxx_i2c_remove,
.id_table = xxxx_i2c_id,
};
static int __init xxxx_pa_init(void)
{
int ret;
// 就是这里的这句log信息,没有打印出来
pr_info("%s enter, driver version: %s\n", __func__, XXXX_DRIVER_VERSION);
ret = i2c_add_driver(&xxxx_i2c_driver);
if (ret) {
pr_info("%s Unable to register driver (%d)\n", __func__, ret);
return ret;
}
return 0;
}
static void __exit xxxx_pa_exit(void)
{
pr_info("%s enter\n", __func__);
i2c_del_driver(&xxxx_i2c_driver);
}
module_init(xxxx_pa_init);
module_exit(xxxx_pa_exit);
static void __exit xxxx_pa_exit(void)
{
pr_info("%s enter\n", __func__);
i2c_del_driver(&xxxx_i2c_driver);
}
module_init(xxxx_pa_init);
module_exit(xxxx_pa_exit);
问题就是在xxxx_pa_init()中的这句
“pr_info("%s enter, driver version: %s\n", func, XXXX_DRIVER_VERSION);”
按照我的理解,kernel启动时,会按照一定的顺序优先级去执行通过module_init注册的函数体内的内容,那log应该是要打印出来的。
然而,神奇的事情发生了,(为了保密,将vendor信息用XXXX代替了),在上述代码中compatible中,定义的名字为" xxxx, xxxx_pa",其实原先dtsi里定义的名字就只有"xxxx, xxxx",并没有末尾的"_pa",后来我将这两者保持统一后,xxxx_pa_init()中的那句log又能打印出来了!!!
对此,有了疑惑:
compatible影响的应该只是我I2C设备能不能成功挂载上,为什么compatible不匹配,会影响前面语句的执行呢?这在内核启动的时候,是不是还存在着某些限定?