平台设备驱动模型

1.总线驱动模型简介

  - 在Linux2.6的设备驱动模型中,关心总线、设备和驱动三个实体。总线将设备和驱动绑定。

  - 在嵌入式系统里,SOC系统中集成的独立的外设控制器、挂接在SOC内存空间的外设等却不依附于此类总线。基于该背景,Linux发明了一种虚拟总线,称为platform总线,相应的设备称为platform_device, 而驱动程序称为platform_driver。

2.特点

  - 分层结构,将驱动程序分成了平台设备和平台驱动

  - 平台设备将设备本身的资源注册进内核,可以由内核统一管理

  - 统一了设备驱动模型,使只能电源管理更容易实现

  - 可移植性,通用性更好

3.platform设备层编程

  - 需要实现结构体struct platform_device

    * 初始化struct resource结构变量

    * 初始化struct platform_device结构变量

    * 向系统注册设备,使用platform_device_register函数

  - 设备层API

    * platform_device_register:向内核注册一个平台设备

    * platform_device_unregister:从内核删除

    * platform_add_devices:把devs数组中的num个平台设备结构注册到内核中

4.platform驱动层编程

  - 需要实现结构体 struct platform_driver

    * 编写探测函数probe

    * 编写探测函数remove

    * 填充struct platform_driver下struct device_driver driver成员的子成员name, name的值需要和device的name相同

    * 调用platform_driver_register函数进行注册

  - proble函数框架

    * 获取平台设备私有数据

    * 获取平台设备占用的物理资源

    * 如果是内存资源,则向内核申请物理内存资源,若为中断资源,则进行中断函数注册

    * 硬件初始化

    * 注册用户空间的接口

  - remove函数框架

    与probe函数为反过程,注销probe函数注册的资源

  - 核心数据结构

    struct device_driver

  - 核心API

    * platform_driver_register:向内核注册一个平台驱动结构

    * platform_driver_unregister:把指针的平台设备从内核删除

    * platform_get_resource:获取物理资源结构地址

    * platform_get_irq:从平台设备指针的资源中获取中断号

原文地址:https://www.cnblogs.com/Mr-ox/p/6410180.html