platform设备驱动组织方式

1、 platform设备驱动组织方式

(1)bus_type结构体,关键是match函数和uevent函数,每个总线根据自己的需要使用里面的资源

            
(2)比如我们的要定义一个平台总线,name就是总线名字,下面就是我们使用到的总线提供的部分资源。值得说明的是,里面的match,就是我们到时候device和driver匹配的函数。

           

(3)__init 可知代码会放到.init 段,Kernel启动时会自动执行

            
下图就是利用device_register()注册过的总线(ubuntu中的内核)          



2、 总线下面的device和driver
device
(1)被抽象出来的Struct device 这个结构体的功能是产生一个变量,这个变量代表着一个硬件设备,它把这个设备的硬件信息都封装进来了,封装了之后等我们匹配上后,将里面硬件信息传给驱动。
(2)然后向内核注册它,用device_register这里注册这个设备所用到的GPIO,中断,和一些系统的资源,就是注册这些东西。
(3)通常这个device不会单独使用,而是被包含在一个具体的设备结构体中,比如struct usb_device 、struct platform_device等, 因为device里面都是些共有硬件属性,而对于一个具体的设备,它只是里面的一部分。如下,platform_device里面包含一个struct device,然后去调用。

           
(4)在如针对mini2440的开发板的mach-mini2400.c,然后把mini2440_led1,注册。  

       

         

          

 

 

 


Driver

       

          

(1)struct device_driver是驱动程序在内核驱动框架中的抽象
(2)关键元素1:name,驱动程序的名字,很重要,经常被用来
作为驱动和设备的匹配依据
(3)关键元素2:probe,驱动程序的探测函数,用来检测一个设
备是否可以被该驱动所管理,就是一个驱动程序得以执行时,要考虑这个设备是否能和驱动匹配,如何确定,就看我们这个驱动的prob函数能不能和设备对上。如果一个SD卡,prob先去操控它,看它是否返回一个正确的值,正确说明对的上,也就是探测好了,我们就初始化,并安装好,就可以使用了。

             
(4)而驱动就是驱动工程师要写的,如我们网上找一个驱动,例如led.ko文件,然后我们装载模块,或者直接编译进内核,编写makefile和Kconfig然后用make menuconfig 配置。
(5)它也会被注册和device一样, 在安装模块时,或者编译进内核,在,init段自动执行,当他们两各自注册后,platforn的match函数执行时,发现他们两匹配后,调用driver的probe函数来完成驱动的初始化和安装,设备就工作起来了。

(6)platform_match函数就是平台总线的匹配方法。该函数的工作方法是:如果有id_table就说明驱动可能支持多个设备,所以这时候要去对比id_table中所有的name,只要找到一个相同的就匹配上了不再找了,如果找完id_table都还没找到就说明每匹配上;如果没有id_table或者每匹配上,那就直接对比device和driver的name,如果匹配上就匹配上了,如果还没匹配上那就匹配失败。

                  

猜你喜欢

转载自blog.csdn.net/qq_40334837/article/details/78155668
今日推荐