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