概述
自己的工作内容比较乱,今天gui明天内核驱动,偶尔还弄一下430。这脑子就跟饺子馅似的。
好记性不如烂笔头,稍微记录一下,只为自己留个印象。如果有碰到相同问题的,可以讨论讨论
写了个很简单的驱动程序,然后修改Kconfig,使它可以被编译成模块:
config LEDS_CTL
tristate "Enable LEDS config"
default y
help
Enable LEDS config
tristate 这个东西算是编程里面的变量声明,可以支持y,n,m三种变量。bool只能支持y,n。为了能够把驱动编译成模块,一定要改成tristate。
然后修改Makefile:
obj-$(CONFIG_LEDS_CTL) += itop4412_leds.o
然后,自我觉得该修改的都修改了。没问题了。谁知道连驱动里面的probe都没有执行到!!我怎么知道的呢!printk告诉我的。printk(KERN_ALERT “啥也没有啊n”);我靠为什么连这个都没执行呢。后来想了想,平台设备和驱动需要匹配,怎么匹配呢?就在相应的平台设备配置文件里面,而且匹配实际就是对应的名字一样。
驱动中的名字:
static struct miscdevice leds_dev = {
.minor = MISC_DYNAMIC_MINOR,
.fops = &leds_ops,
.name = "leds",
};
平台设备中的名字:
<pre name="code" class="cpp">struct platform_device s3c_device_leds_ctl = {
.name = "leds",
.id = -1,
};
好了,这样才有可能匹配上。问题是没问题啊,都一样。还是匹配不上。为什么?
一般在平台设备对应的文件中,会有很多#ifdef 的使用。实际就是对应的Kconfig。例如我这里面:
</pre><pre name="code" class="cpp">#ifdef CONFIG_LEDS_CTL
struct platform_device s3c_device_leds_ctl = {
.name = "leds",
.id = -1,
};
#endif
完整的实际应该是这个样子的。这样的配置,在Kconfig中,只能使用bool的变量进行控制,也就是不能被编译成模块,那在看看其他能被编译成模块的是怎么写的,就知道,就是把所有的条件编译都去掉就可以了。
最后
以上就是漂亮小土豆为你收集整理的linux 驱动probe不执行的全部内容,希望文章能够帮你解决linux 驱动probe不执行所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复