Linux设备驱动模型(sysfs)

摘要:
总线模型概述>总线设备驱动程序>结构设备_驱动程序*drv)//驱动程序和设备匹配功能}在Linux中注册总线system://The驱动程序所在的总线是int(*probe)(structdevice*dev);intdriver_Register(structdevice_driver*drv)从Linux系统注销总线驱动程序:平台总线设备设计>

<总线模型概述>

随着技术的发展,系统的拓扑结构也越来越复杂,对热插拔。跨平台移植性的要求越来越高,从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内核中加入的一种虚拟总线,其优势在于采用了总线模型对驱动和设备进行管理,这样提高了程序的可移植性。也就是说内核中已经给我们创建好了这种总线,只需要将设备和驱动挂在到总线上就行了。

 

平台总线开发流程:

Linux设备驱动模型(sysfs)第1张 

平台总线设备和驱动的匹配机制:
(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设备驱动模型(sysfs)第2张

备注:在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 contenteditable="false" style="display: none;">

 
 
 
 

免责声明:文章转载自《Linux设备驱动模型(sysfs)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Java 常用类(二):包装类(Wrapper)k8s环境下处理容器时间问题的多种姿势下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

[转载]目前流行的缺陷管理工具

缺陷管理工具:1.  Bugzilla2.  Bugfree3.  TestDirector (Quality Center)4.  ClearQuest5.  JIRA6.  Mantis7.  Bugzero8. BugTracker9. URTracker10.KisTracker11.TestLink12、JTrac13、BugNet14、BugO...

(转)Python虚拟环境pyenv、venv(pyvenv)、virtualenv之间的区别,终于搞清楚了!

原文:https://blog.csdn.net/lovedingd/article/details/106721585 背景问题1:举个例子,tensorflow(tf)是一个十分流行的python机器学习库,你现在手里有两个tf项目,其中项目A需要使用python2.7 + f1.2,项目B需要使用python2.7 + tf1.6.这两个项目你得同时...

LXC-Linux Containers介绍

Linux Containers,Linux的容器,容器嘛,可以想象成一个大的装东西的罐子,罐子口很大,里面可以装很多同样形状,只不过大小不同的小罐子。专业的话,叫做基于容器的操作系统层面的虚拟化技术。 在这个大的容器里面,可以装很多小的容器,每一个容器都具备完整的运行环境,如特定的CPU、memory节点、可分配的cpu时间,IO时间,受限的内存大小(包...

【BIEE】01_下载安装BIEE(Business Intelligence)11g 11.1.1.9.0

环境准备 安装文件 如果操作系统是64位,则下载64位版本,我安装的系统是64位的 1.下载所有安装文件 1.1Oracle Database 11g R2 下载地址: http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html 目前最新版本为Or...

一种新型的低代码嵌入式系统开发平台介绍

同样使用梯形图语言编程,嵌入式开发平台的产品和PLC产品相比,优势在哪里?   (机器编程系列文章三) 嵌入君   一、概念介绍 首先介绍下“低代码开发平台”的概念,按照百度百科给出的解释如下:低代码开发平台是无需编码或通过少量代码就可以快速生成应用程序的开发平台。   按照网上给的定义,我认为,使用梯形图编程的PLC工控机的软件开发平台实际上是一种低代码...

双系统开机引导菜单修复方法 进win7无须重启|metro引导|双系统菜单名字修改

此文转自互联网,一部分是原创。 主要内容 1.修复双系统菜单(win7与win8双系统),进入win7不再需要重启,普通菜单样式(普通引导,非metro界面),更加简洁,实用,开机即可选择操作系统 2.改双系统启动菜单的名字或者改成中文。 3.使用NTbootautofix强力修复 双系统 用win8 metro引导 考虑到win8的稳定性和兼容性,相信很...