zoukankan      html  css  js  c++  java
  • Linux设备驱动模型(sysfs)

    <总线模型概述>

    随着技术的发展,系统的拓扑结构也越来越复杂,对热插拔。跨平台移植性的要求越来越高,从Linux2.6内核开始提供全新的设备模型。将所有的驱动挂载到计算机的总线上(比如USB总线),当有设备连接到总线上的时候,总线能够感知到,这时系统就会把挂载到总线上是所有驱动和设备匹配。通过不同的识别方式,知道找到相应的驱动。

     

    <总线设备驱动>

    定义并描述总线设备:
    struct bus_type{

    const char  //总线名称

    int(*match)(struct device *dev,struct  device_driver *drv);  //驱动和设备的匹配函数

    }

     

    linux系统注册总线:

    bus_register(struct bus_type *bus)

    如果注册成功,新总线将被添加进系统,并在/sys/bus下看到相应的目录。 

    Linux系统注销总线:

    void bus_unregister(struct bus_type *bus)

     

    定义并描述Linux总线驱动:

     

    struct device_driver{

    const char ;//驱动名称

    struct bus_type *bus;//驱动程序所在总线

    int (*probe)(struct device *dev);

    }

     

    Linux系统注册总线驱动:

    int driver_register(struct device_driver *drv)

     

    Linux系统注销总线驱动:
    void driver_unregister(struct device_driver*drv)

     

     

    <设备>

    描述设备:

    struct device

    {

    const char *name ; //设备的名称

    struct bus_type *bus;//设备所在的总线

    }

    注册:

    int device_register(struct device *dev)

     

    注销:

    void device_unregister(struct device *dev)

     

    在总线上挂载一个设备

    平台总线对总线驱动模型做详细的讲解:

    <平台总线设备设计>

    1)平台总线概述

    平台总线(platform bus)是Linux2.6内核中加入的一种虚拟总线,其优势在于采用了总线模型对驱动和设备进行管理,这样提高了程序的可移植性。也就是说内核中已经给我们创建好了这种总线,只需要将设备和驱动挂在到总线上就行了。

     

    平台总线开发流程:

     

    平台总线设备和驱动的匹配机制:
    (1)如果驱动中有id_table ,这就用设备号进行匹配

    (2)但是大多是用设备名和驱动名进行匹配

    2)平台设备

    描述平台设备:
    struct platform_device{

    const char *name;//设备名

    int id;//设备编号,配合设备名使用

    struct device dev;

    u32 num_resources;

    struct resource  *resource ;  //设备资源

     };

    注意:设备资源,主要是指设备中的寄存器,中断号等。

    struct resource {

    resource_size_t start;

    resource_size_t end;

    const char *name;

    unsigned long flags;//资源类型,内核已经用宏定义好了

    struct resource  *parent,*sibling,*child;

    }

    注册平台设备:

    int platform_device_register(struct platform _device *pdev)

    3)平台驱动

    描述平台结构:

    struct platform_driver{

    int (*probe)(struct platform_device *)

    int(*remove)(struct platform_device *);

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

    }

     
    <kobject和kobj_type以及kobj_type和attribute/sysfs_ops 之间的关系>

    备注:在linux 设备模型中的,在“内核”中使用kobject 结构来表示,在"用户空间"使用sysfs来表示,表象形式是文件夹和文件树。
    a:kobject 代表sysfs 系统中的一个目录,其中name就是其中的该目录的名称
    b:kobjec 在sysfs 中的位置(组织层次结构)由parent 指定.
        所有属于该kset 的kobject的parent指针都指向kset 的kobject
        所有属于该kset 的kobject的kset 指针都指向该kset
    c:当kobject中的引用计数为0 时,系统将调用kobj_type 中的函数release()将驱动所占有的资源释放掉
    d:添加非默认属性文件的调用函数
        int sysfs_create_file(struct kobject *kobj,const struct atrribute *attr)
    e:kobj_type
        所谓属性,是指对于任何一个硬件有该硬件的特点,比如硬件喇叭,会有最基本的音量属性。

    <wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

  • 相关阅读:
    【SR】MAP
    【SR】Example-based
    【SR】论文资源相关
    【SR】正则化超分辨率复原
    词汇累记
    单模光纤与多模光纤的实际使用
    光纤中的光波长
    数码相机常用CCD/CMOS尺寸对比
    尼康D90多点对焦
    Python3.x:日期库dateutil简介
  • 原文地址:https://www.cnblogs.com/big-devil/p/8589867.html
Copyright © 2011-2022 走看看