关于编译为ko的一些宏定义

在写这篇博客时我先深深的反省了一下!

一直以来我自认为工作严谨,我曾鄙视别人把没有编译验证的代码提交的服务器上,从而导致服务器代码编译出错。

我自己多年来一直坚持在push代码前一定要编译一次来进行确认。因此从来没有出现过编译事故。

就在上周我还向一个朋友抱怨我们公司经常出现服务器编译错误这样的问题。似乎显得我很认真很严谨一样!

我想我是骄傲了吧。。。

我昨天就干了一件让我很后悔的事情,ltr558的驱动先前是编译进内核的,一直工作的很好。因为考虑到这个驱动在probe的过程中初始化部分有600ms的延时,为了加速启动过程,需要把这个驱动编译为module后期在用insmod进行加载。

这很简单,只要在arch/arm/configs/XXXdefconfig 中将对应的CONFIG_INPUT_LTR558_I2C=y 改为 CONFIG_INPUT_LTR558_I2C=m即可。这样编译kernel时便会将对应的驱动编译为ko放到/system/lib/modules/中,然后在相关的init.rc中通过insmod命令加载该ko即可。如此想当然,我便修改了这样两处,并检查了编译结果,看到确实有相关的ko生成。我认为这肯定没问题了。所以就没有下载到手机上进行测试,就直接push了代码。

今天早上就收到了测试人员的邮件,P&L-sensor失效了!我赶紧将昨天的img烧到手机确认,,,果然挂了。。。

要是我昨天不想当然的话,,也不至于这么尴尬啊。。。

今天找了一天这个问题。


#if(defined(CONFIG_INPUT_LTR558_I2C))  

       注册ltr_558als对应的i2c  device

#endif

原来是因为当CONFIG_INPUT_LTR558_I2C=m 后,这个宏判断的结果就为假,因此这注册设备的代码就不会编译!

改为下边即可:

#if(defined(CONFIG_INPUT_LTR558_I2C)||defined(CONFIG_INPUT_LTR558_I2C_MODULE))

       注册ltr_558als对应的i2c  device

#endif

当CONFIG_INPUT_LTR558_I2C=m 时,宏CONFIG_INPUT_LTR558_I2C_MODULE会被自动定义!

我没有找到 宏CONFIG_INPUT_LTR558_I2C_MODULE到底在哪里被定义了,但是通过实验方法,我得到了一个结论:

CONFIG_INPUT_LTR558_I2C=y时:defined(CONFIG_INPUT_LTR558_I2C)返回真     defined(CONFIG_INPUT_LTR558_I2C_MODULE)返回假

CONFIG_INPUT_LTR558_I2C=m时:defined(CONFIG_INPUT_LTR558_I2C)返回假     defined(CONFIG_INPUT_LTR558_I2C_MODULE)返回真




顺便发现一个android4.1的特性

init: skipping insecure file '/system/lib/modules/ltr_558als.ko'

如果你的ko权限不对的话,在通过init.rc加载模块时也会报上述出错信息!这些ko文件的权限应为 0644 

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

root cause:

在arch/arm/configs/中将ltr558的编译方式该为 =m 后,却忽视了board.c中的相关宏开关,导致ltr558的device未注册,继而导致驱动的probe未执行。表现为P&L-sensor失效。




你可能感兴趣的:(关于编译为ko的一些宏定义)