博文

目前显示的是 四月, 2012的博文

关于Probe分析

从probe函数说起 每一个driver module,只要是挂载在platform bus这根虚拟总线上的,无一例外都需要自己实现一个probe函数。这个probe函数将会做真正的驱动加载操作。以pxa688的uart驱动为例: drivers/tty/serial/pxa.c: 840 static struct platform_driver serial_pxa_driver = { 841         .probe          = serial_pxa_probe, 842         .remove         = serial_pxa_remove, 843 844         .driver         = { 845                 .name   = "pxa2xx-uart", 846                 .owner  = THIS_MODULE, 847 #ifdef CONFIG_PM 848                 .pm     = &serial_pxa_pm_ops, 849 #endif 850         }, 851 }; 840~851定义了一个platform类型总线上驱动 serial_pxa_driver.其内部的成员变量中probe和remove以及driver成员都需要自己实现。其中,probe是用于驱动被加载的时候用;remove用于驱动被卸载的时候(如果驱动是built-in进kernel的,在runtime时,是没有模块这个概念的。所以,卸载仅仅是对于编译为module的ko模块--因为它才有可能被rmmod ^-^);.driver.name是用于驱动匹配设备的,这个成员不能少,并且和设备的name要一模一样(在驱动去寻找它的归属设备时,就是用这种简单的方式);.driver.owner这个成员在所有的模块中都是一成不变的THIS_MODULE,这个THIS_MODULE是非常“有故事”的:如果built-in进kernel,那么它为NULL;如果是一个模块,那么是一个struct module的指针值。这个指针值是在模块被modpro