Linux Driver 编写思考(3)

2,  实现对硬件设备的访问控制;

只提供接口不负责实现,就是所谓的“银样蜡枪头 ” ,所以驱动最复杂的地方在于如何控制硬件实现我们想实现的功能;而这些具体的实现通常就包含在给上层提供的接口中;而另外一方面一个驱动要实现某项功能很多时候不是自己独立实现的,而是依赖于其它的模块,比如 WIFI 驱动,在我们的平台上,是通过 sdio 口连接的,而 sdio 口是 mmc controller 提供的,而 mmc 本身又是通过 gpio 口实现的,换句话说,如果要 wifi 能正常工作,就必须要 mmc 这一套能正常工作;那么就需要先配置 gpio 口,再移植 mmc 驱动,最后才是 wifi 驱动,而 wifi 芯片本身说不定还需要其它的动作才能正常,比如上电等等;

Driver 和设备之间的连接

如果说 driver 就是由 struct device_driver 来描述,而设备也是有 struct device 来描述的话,那么如何描述 driver 和 driver 所驱动的设备这种关系呢?也就是说如果是父子,或夫妻关系的话,他们是如何相认的,又是如何维持这种纽带的?一个设备通常由一个 driver 驱动,而一个 driver 有时候可以驱动多个设备(这也许是在美好的一夫多妻制时代)

1,  家族的概念

每个人都诞生于一个家庭,而由一系列有血缘关系的家庭又组成家族,我想 bus 的概念有点类似家族;

2,  设备的诞生

当一个设备通过 device_add 的方式调用的话,对它所属的家族来说意味着一个新的小孩诞生了;如果这时候它的配偶已经由上帝指定的话,意味着它的配偶已经住进了它们的家族(挂在了 bus 上),那么上帝就会把它的配偶 driver 指向这个 device 完成婚姻,通常这时候就会调用 driver 提供的 probe 函数进行一系列的初始化操作,这就像丈夫对妻子进行思想教育一样;

3,  driver 的诞生

当一个 driver 调用 driver_register 的时候,也就宣布着新的孩子诞生了,如果它的配偶已经住进他们的家族,也就是说如果驱动的设备已经挂在了总线上,那么就可以结婚了(估计他们是属于一出生就比较成熟的类型),同样这时候就要调用 driver 的 probe 函数进行初始化工作了;

4,  人口登记

不管是男孩还是女孩,对政府来说都是 kobject ,所以一旦有孩子诞生不管是男是女都会调用 kobject_add 登记在案,这样政府就可以完全掌控所有的信息;

5,  配偶的寻找

如果是先有 device ,那么匹配就是通过遍历 bus 上的 driver 来进行的,反之就是通过遍历 bus 上的设备进行的,而匹配的前提就是设备已经注册,并且符合这个家族的族规,而族规通常是由 bus 的 match 函数来控制,而很多时候都是比较设备的名字和 driver 的名字是否相同(这个比结婚要比的东西简朴许多啊,现在结婚比的是 money )当然还有其它许多的匹配方式,如果通过这个测试就可以调用 driver 提供的 probe 函数进行初始化了;

这样的话,设备和 driver 就可以连接起来了,有了这样的人口登记和家族联系,就可以实现诸如睡眠唤醒这样的功能了。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/27782.html