我是靠谱客的博主 漂亮小土豆,最近开发中收集的这篇文章主要介绍linux 驱动probe不执行,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

自己的工作内容比较乱,今天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不执行所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部