linux驱动-- 平台设备驱动platform devices

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010631857/article/details/78452380

platform平台设备驱动是基于设备总线驱动模型,它只不过是将device进一步封装成为platform_device,将device_driver进一步封装成为

platform_device_driver。


linux设备模型的目的:为内核建立一个统一的设备模型,从而有一个对系统结构的一般性描述,也就是说,linux设备模型提取了

设备操作的共用属性,进行抽象,并将这部分共同属性在内核的实现,而为需要添加新设备或驱动提供一般性的统一接口,这使得驱动程序

的开发变得更加的简单,而程序员只需要去学习接口就行了。

在内核里,有各种各样的总线,如usb,spi,pci,platform,i2c等,内核通过总线将设备与驱动分离。


设备模型是层次的结构,层次的每一个节点都是通过kobiect实现的,在文件上则体现在sysfs文件系统。


对于整个设备总线驱动模型,bus负责维护注册进来的device和driver,每注册进来一个device或者driver都会调用bus_match函数,将device

与driver进行配对,并将它们加入链表,如果配对成功,调用BUs-》probe或者driver-》probe函数,调用kobject-uevent函数设置环境变量,mdev

进行设备节点等操作。主要有三部分:bus,driver,device


bus:


在设备总线驱动模型中,bus就像一个月老一样,通过他的match函数,将注册到bus的device和driver经行配对,那么每一个不同的bus都有自己

的match函数。

.......................


如果platform_device_driver中定义了id_table,则调用platform_match_id经行匹配,用此ID遍历整个Id_table数组,寻找是否有与platform_device-name同名的

,如果有则返回这个platform_device_id,使用Id_table打破原本设备总线驱动模型。

如果没有则只有根据platform_device_driver-name和platform——driver-name进行比较。匹配成功则调用driver-probe函数...


在linux中,系统资源包括IO,memory,Register,IRQ,DMA,Bus等多种类型,这些资源太多具有独占性,不允许多个设备同时使用,因此linux内核提供了一些API,用于分配管理这些资源。

当某个设备需要使用某个资源时,只需利用struct resource组织这些资源,用名称,类型,起始,结束地址等。并保存在该设备的resource指针中即可。

然后再设备probe时,设备需求会调用资源管理接口,分配使用这些资源,而内核的资源管理逻辑,可以判断这些资源是否已被使用,是否可被使用等等。


猜你喜欢

转载自blog.csdn.net/u010631857/article/details/78452380