zoukankan      html  css  js  c++  java
  • 总线设备驱动模型

    总线设备驱动模型

    一个总线设备驱动包含三个元素:总线驱动设备

    总线是处理器设备之间的同道,在设备模型中,所有的设备都通过总线相连,甚至是内部的虚拟“platform”总线。

     

    总线:

    描述总线的数据结构如下:

     

    总线注册和删除使用:

     

    下面介绍几个比较重要的总线方法:

     

     

    总线属性Buf_attribute的结构定义如下:

     

     

    而总线设备和总线属性的结合和解除如下:

     

     

    设备:

    Linux系统中的每一个总线设备由一个struct device描述:

     

     

    设备的注册与注销:

     

     

    设备属性由struct device_attribute描述:

     

     

    设备属性的创建与删除:

     

     

    驱动:

    驱动程序由struct device_driver描述:

     

     

    驱动注册与注销:

     

     

    驱动的属性使用struct driver_attribute来描述,其中attr代表一个文件,showstore代表读写:

     

     

    驱动属性的创建与删除:

     

     

     

    注意:昨天一边玩一边学,恶果深重,今天从新把代码写一遍。

     

    1._init是告诉操作系统,带着这个标示符的函数,调用一次就可以从内存中删除了。

     

    2.宏定义中的##号代表连接。

     

     

    3.总线也是一种设备,所以注册总线的时候也要注册总线设备。

     

    4.热插拔:带电插拔,比如没有关机的情况下插拔硬件。

     

    5.当拔掉一个设备后会调用驱动的remove函数,当驱动连接一个设备的时候会调用prob函数。

     

    6初始化总线,设备,驱动的区别:

    总线:                

     

    设备:

     

    驱动:

     

     

    Platform平台驱动:

    Platform总线是linux2.6内核加入的一种虚拟总线platform机制本身使用并不复杂,由两部分组成:Platform_deviceplatform_driver

    Platform驱动与传统的设备驱动模型相比,优势在于platform机制将设备本身的资源注册进内核,有内核统一管理,在驱动程序使用这些资源时使用统一的接口,这样提高了程序的可移植性。

    通过platform机制开发底层设备驱动的流程如图:

     

     

    平台设备:

      挂到platform总线上的设备使用struct Platform_device来描述:

     

    struct Platform_device使用如下函数:

     

     

    平台设备的注册如下:

     

     设备的资源描述结构体如下:

     

      下面是设备资源的例子:

     

    可以通过如下的方式获取设备的资源:

     

        一个平台设备内核模块的典型编写方式如下:

     

     

    平台驱动:

    平台驱动描述的数据结构struct platform_driver

     

     

    平台驱动注册函数:

     

    下面是编写平台驱动内核模块的一个例子:

     

     

    中断处理:

     

     

    中断的注册:

    注册函数如下:

     

     

    其中flags的可能值如下:

     

    快速中断和慢中断:

     

     

    共享中断:

     

     

    注意:

    1. 共享中断的dev_id是唯一的。

    2. 共享中断不能使用disable_irq(),否则会导致其他使用这个中断的硬件设备也无法中断。

     

     

     

     

    使用完毕后应该释放中断:

     





  • 相关阅读:
    openresty 使用 log_by_lua 发送日志到 syslog-ng
    uuid 了解
    基于openresty 的几个开发框架
    openresty 几个插件使用
    kong 了解
    openresty && hashids&& redis 生成短链接
    kong k8s 安装 以及可视化管理界面
    hashids 了解
    Apache Tez 了解
    Cascalog了解
  • 原文地址:https://www.cnblogs.com/dchipnau/p/5010059.html
Copyright © 2011-2022 走看看