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的变量进行控制,也就是不能被编译成模块,那在看看其他能被编译成模块的是怎么写的,就知道,就是把所有的条件编译都去掉就可以了。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值