设备驱动以及probe的思考

最近无意中有看了一遍Platform机制,发现之前对它的理解有误,以及对probe探测函数的困扰。特此梳理一下。

      Linux驱动模型中的三个基本概念是:驱动、设备、总线。无论是设备还是驱动在注册是都会挂在总线上。总线负责驱动和设备的匹配。但是有一些设备是没有总线这种概念的,比如LED,于是Linux引入了Platform这种机制,虚拟出一条总线。它主要用来管理CPU的片上资源,所以platform多见于平台相关的代码中,比如arch/arm/plat-s3c24xx/common-smdk.c中,platfrom_add_devices注册了网卡DM9000、nand flash等设备,在对应设备的驱动probe函数中通过platform_get_resourceh获得设备信息。

     当理解了Platfrom这种机制之后,有产生了新的疑惑。之前看过USB的驱动,USB设备挂载在HUB总线上,USB HUB协议有枚举过程,从枚举过程中可以得到设备信息,经过的总线的match之后,进而去调用驱动的probe函数,在probe中再去注册设备,完成一系列初始化的操作。我的疑惑是,platfrom肯定没有这种枚举的过程,probe怎么被调用。其实如果总线设为自动匹配,不论设备或驱动谁先注册,总线都会去匹配另一方,匹配是根据name,最终都会调用驱动的probe,完成设备初始化(创建设备节点等)。probe完成的工作,就像不用总线这种机制写的驱动程序中modul_init完成的工作内容。

    linux驱动中,每一种类型的设备都有一个core,比如usb_core、mtd_core、led_core,core归纳了某种设备操作的共性,当需要在它下面添加新的设备时,其实就是按照core提供的结构向core注册。注册就在probe中完成。

你可能感兴趣的:(Linux内核驱动)