精华内容
下载资源
问答
  • LINUX 驱动模型

    2009-11-27 02:29:49
    LINUX 驱动模型 LINUX 驱动模型
  • linux驱动模型 linux驱动模型 linux驱动模型 linux驱动模型
  • linux驱动模型

    2013-08-26 16:12:34
    系统描述了linux系统里的驱动模式,以及典型事例
  • Linux驱动模型

    千次阅读 2012-02-28 09:52:39
    这几天在为s3c2440添加TVP5150驱动时,首次理解多了一些Linux驱动模型。在这里共享一下学习心得。 总线 说总线之前,先想想,计算机里的设备很多都是寄生在一个“总线”上的。比如USB键盘和鼠标是属于USB总路线...
    这几天在为s3c2440添加TVP5150驱动时,首次理解多了一些Linux驱动模型。在这里共享一下学习心得。
    
    总线

    说总线之前,先想想,计算机里的设备很多都是寄生在一个“总线”上的。比如USB键盘和鼠标是属于USB总路线上的设备,网卡是在PCI总线上的。于是Linux中每一个设备都可以属于一个总线。


    对于一个总线而言,可以通过定义一个struct bus_type来描述一个总线:

     struct bus_type {
             const char              *name;
             struct bus_attribute    *bus_attrs;
             struct device_attribute *dev_attrs;
             struct driver_attribute *drv_attrs;
     
             int (*match)(struct device *dev, struct device_driver *drv);
             int (*uevent)(struct device *dev, struct kobj_uevent_env *env);
             int (*probe)(struct device *dev);
             int (*remove)(struct device *dev);
             void (*shutdown)(struct device *dev);
     
             int (*suspend)(struct device *dev, pm_message_t state);
             int (*resume)(struct device *dev);
     
             const struct dev_pm_ops *pm;
             struct bus_type_private *p;
     };

    当检测到一个设备“插入”时(谁去检测暂且不关心),便会枚举所有存在的驱动,挨个以它为参数调用bus_type->match 函数,match函数的作用就是判断这个刚“插入”的设备是否与当前驱动吻合(也就是这个驱动是不是这个设备的驱动),如果是的话,就加载这个驱动,剩下的设备(struct device)初始化等事情,交给设备驱动(struct device_driver)来做。
    设备

    一个设备可以有两种方式添加,一种就是现在流行的热拔插(HOTPLUG),一种是固定的设备。一个设备添加时,便会导致内核枚举所有驱动以寻找该设备的驱动(如上一章所说),匹配设备由总线驱动完成。

    在Linux中设备以struct device来表示。
    设备驱动

    设备驱动在Linux中以struct device_driver来表示。如总线一章所说设备驱动是在总线驱动匹配成功设备和驱动之后调用的。
    举例

    这里以在s3c2440中添加一个tvp5150视频解码芯片作为例子,说明这个驱动模型的工作。首先,tvp5150使用的是I2C总线,Linux的S3C2440已经有了I2C总线的驱动。然而,I2C总线不具备自动探测设备的功能,由于情景限制,我们也不需要自动探测设备,于是我们手动添加一个struct device。这里提到静态的设备,即不能自动探测的,系统中固定有的设备,用struct platform_device表示。这个struct platform_device字面上的意思就是“平台设备”,它和struct device的关系很微妙,从C++的角度来看,struct platform_device是struct device的子类,只不过在这儿用了C语言来实现。

    对于静态的设备(“平台设备”),我们在架构初始化的函数中添加,对于 mini2440而言,这个函数位于 arch/arm/mach-s3c2440/mach-mini2440.c中。我们添加一个描述设备的静态函数:

    static struct i2c_board_info mini2440_tvp5150_info = {
                      I2C_BOARD_INFO("tvp5150",0xba),
                      .irq = IRQ_EINT20,
    };
     
    static struct platform_device s3c_device_tvp5150 = {
                      .name = "s3c2440_tvp5150_adapter",
                      .id   = -1,
                      .dev  = {
                                             .platform_data = &mini2440_tvp5150_info
                      },
    };

    最重要的参数就是platform_device中的name和dev了。name指明了这个平台设备的名称,在platform总线(该总线为一虚拟的总线,用于管理静态设备的)中匹配驱动要靠这个名称,只有这个名称和驱动的名称一样时,才能调用相应的驱动。platform_data可以作为在调用驱动时,设备给予驱动的一些数据信息。在这里为i2c_board_info的,其中指明了i2c设备的名称和地址。稍候在驱动程序中,我们将使用这个数据来创建一个i2c设备。
    其实我们在这是绕一个圈子,本来可以直接添加一个i2c设备到i2c总线上,i2c总线自然会加载这个设备驱动(Linux中已经包含TVP5150的驱动)。这里这么做的原因是,我们还要为我们自己的情景,自定义这个tvp5150的参数,为了不破坏内核原有的驱动,我们只能自己增加驱动来完成我们的工作。
    在一个标准的Linux内核模块里,我们要添加一个驱动,即有:

    static struct platform_driver s3c2440_tvp5150_driver = {
                      .probe                = s3c2440_tvp5150_probe,
                      .remove       = s3c2440_tvp5150_remove,
                      .driver       = {
                                             .name  = "s3c2440_tvp5150_adapter",
                                             .owner = THIS_MODULE,
                      }
    };
     
    static int __init s3c2440_tvp5150_init (void){
                      return platform_driver_register (&s3c2440_tvp5150_driver);
    }
    static void __exit s3c2440_tvp5150_cleanup (void){
                      platform_driver_unregister (&s3c2440_tvp5150_driver);
    }
     
    module_init (s3c2440_tvp5150_init);
    module_exit (s3c2440_tvp5150_cleanup);

    这里就声明并初始化了一个platform_driver,它是struct device_driver的“子类”,里面的name参数必须和设备里的name一致才能匹配成功。在模块初始化函数里,我们调用了platform_driver_register来注册这个驱动。当设备添加,总线匹配成功的时候,调用s3c2440_tvp5150_probe函数,在这个函数里面,我们添加了一个i2c设备到i2c总线上,于是tvp5150的驱动便被调用起来了。
    展开全文
  • 本文通过对Linux下串口驱动的分析。由最上层的C库。到操作系统系统调用层的封装,再到tty子系统的核心。...再到最底层的硬件操作从串口驱动到Linux驱动模型,从一个模型入手,详细的分析了流程,一些思想结构
  • linux 驱动模型文档中文. Linux内核文档翻译汇总--device model将这些文档整理到一起,方便大家阅读
  • Linux驱动模型简介

    2013-07-26 19:04:08
    Linux驱动模型可以从底层和上层两个层次来探究: 设备底层模型 和 设备模型的上层容器 Linux驱动模型和sysfs文件系统紧密相连,在内核中注册的每个kobject对象对应sysfs文件系统中的一个目录。 sysfs的引入是为了...

    Linux驱动模型可以从底层和上层两个层次来探究:  设备底层模型 和 设备模型的上层容器

    Linux驱动模型和sysfs文件系统紧密相连,在内核中注册的每个kobject对象对应sysfs文件系统中的一个目录。
    sysfs的引入是为了方便调试,设备模型的开发者将设备结构树导出为一个文件系统,这就是sysfs文件系统,它可以帮助用户能以一个简单文件系统的方式来观察系统中各种设备的拓扑结构。sysfs代替了先前处于/proc下的设备相关文件;另外它为系统对象提供了一个很有效的视图。

    1. Linux设备底层模型

    kobject, ktype 和 kset
    kobject代表设备驱动模型中一个基本对象,是一个顶级,抽象类,
    用来嵌入某一个具体的设备结构体中
    ktype是kobj_type类型的结构体, 记录了kobject对象的一些属性(对象公共属性,sysfs操作集,对象释放处理方法等)
    kset是一个kobject集合,包含了一系列的kobject,同时它本身也是一个kobject


    相关操作函数:
    kobject 相关函数

    复制代码
       kobject_init()            // 初始化kobject结构
       kobject_add()             // 将kobject对象注册到系统
       kobject_init_and_add()    // 初始化kobject,并将其注册到系统
       kobject_create()
       kobject_create_and_add()
       kobject_set_name()        // 设置kobject的名字
       kobject_del()             // 从系统中删除kobject对象
       kobject_get()             // 将kobject对象的引用计数加1,同时返回该对象指针
       kobject_put()             // 将kobject对象的引用计数减1,如果引用计数降为0,则调用release方法释放该kobject对象
    复制代码

    kset也有类型的函数

    复制代码
       kset_init()                // 
       kset_register()            // 
       kset_unregister()        
       kset_create_and_add()
       kobject_del()              // 
       kset_get()                 // 
       kset_put()
    复制代码


    关于详细的描述可以参考内核文档 Documentation/kobject.txt

     

    http://code.google.com/p/xue-xi/source/checkout

    展开全文
  • Linux驱动模型的编程模式 1.总线类型逻辑  定义一个总线类型(struct bus_type)对象,在该对象中,需要指定总线类型的名字,还需要实现一些回调函数,例如match,probe等。  在子系统或模块加载时调用bus_...
    Linux驱动模型的编程模式

    1.总线类型逻辑
        定义一个总线类型(struct bus_type)对象,在该对象中,需要指定总线类型的名字,还需要实现一些回调函数,例如match,probe等。
        在子系统或模块加载时调用bus_register函数向Linux内核注册这个总线类型,在子系统或模块卸载时调用bus_unregister函数从Linux内核注销这个总线类型。一般子系统或模块也可以根据需要对bus_register和bus_unregister函数进行封装。
        如果所有功能不是在一个模块中实现,就需要使用EXPORT_SYMBOL宏导出总线类型以便其他代码使用。
    2.设备逻辑
        定义功能设备结构体,通常将驱动模型设备描述符(struct device)作为一个域嵌入到这个结构体。此外,还可以在结构体中嵌入另一个驱动模型设备描述符(struct device)。如果是这样,那么前一个我们称为“内嵌的通用设备”,它是为了将这个功能设备链入到总线类型的设备链表而用的,而后一个我们称为“内嵌的类设备”,它是为了将这个功能设备链入到类的设备链表而用的。建议定义专门的宏或内联函数实现从驱动模型设备获得功能设备,这种定义方式可以让编译器检查要执行的操作的类型安全性。
        在功能设备被发现时,除了业务逻辑所必须的初始化外,还需要对“内嵌的通用设备”以及“内嵌的类设备”进行初始化。对于“内嵌的通用设备”,最重要的要初始化大的域有bus_id,parent和bus。bus_id域是一个ASCII字符串,包含了设备在总线上的地址,这一点在sysfs中表示设备非常重要。parent是设备物理意义上的父亲。总线驱动需要正确设置这个域。bus域是一个指向设备所属总线类型的指针,这个域应该设置为前面声明并初始化的bus_type。对于“内嵌的类设备”,最重要的要初始化的域有class。当然,也可以调用device_initialize函数对它们执行一些基本的初始化动作。
        在其后的某个时间,应该调用device_add函数,分别传入的地址,向Linux内核添加功能设备。这将会把功能模块同时链入到总线类型的设备链表,以及类的设备链表中。它还会在sysfs文件中为功能设备创建相应的目录,并添加属性文件以及符号链接文件等。如果要从linux内核中删除功能设备,则应该分别针对“内嵌的通用设备”和“内嵌的类设备”调用device_del函数。
         功能设备被添加到系统,它就确确实实存在了。至于是何时被绑定到功能驱动,那就是驱动模型核心的事情了。
    3.驱动逻辑
        驱动逻辑和设备逻辑类似。首先是声明一个功能驱动结构体,将驱动模型驱动描述符作为它的一个域,还可以根据需要包含了驱动模型核心可能调用的操作集。
        在稍后的某个时刻,调用driver_register函数向Linux内核注册功能驱动,以其内嵌的驱动模型驱动描述符为参数,在注册之前,必须初始化一些必要的域,例如name和bus。与此相反,在驱动从Linux内核注销时,调用driver_unregister函数。
         注册驱动会将功能驱动挂入总线类型的驱动链表,并在sysfs文件系统中为功能驱动创建对应的目录,以及属性文件和符号链接等。与此同时,驱动模型会尝试将驱动去绑定总线类型的设备链表中的设备。是否可以绑定完全是功能特定的,因此往往最终要调用功能驱动中定义的回调方法。
    4.类和接口逻辑
        取决于具体的功能,子系统或模块也可以实现类和接口逻辑。
    展开全文
  • LINUX驱动模型中bus与platform_bus区别和异同 首先要明确的是platform_bus是BUS的一个字集,也就是说platform_bus是BUS定义的一个总线类型。可以看到platform与其它BUS下的总线是等级的。也就是说platform也是总线...
    

    LINUX驱动模型中busplatform_bus区别和异同

    首先要明确的是platform_busBUS的一个字集,也就是说platform_busBUS定义的一个总线类型。可以看到platform与其它BUS下的总线是等级的。也就是说platform也是总线的一种。我们可以看到I2C,USB等总线下面都可以挂接多个相关设备,这说明i2c usb等总线是管理这类设备的一个主控制器。因此对于一个主控制器可以管理很多同类外围设备的就可以用bus_register注册一个总线,会对应的建立一个/sys/bus/xx总线名。这样就可以用device_register driver_register函数来完在对应子设备的添加和驱动注册。同时这个/sys/bus/xxp完成这类设备的管理和相关共用低层驱动的框架。那platform是什么了。我们从前面分析可以知道对于不具备主控制器功能既可以挂载多个子设备的,为了方便驱动和与设备的方便管理我们引入了虚拟总线platfrom平台设备总线。这个平台设备总线是由bus_register创建的。它下面可以挂载多个不同类型的设备,它们不具同一个类型的驱动关系。我们仅仅是借用platfrom来管理它们。这样platform就与其它平级的总一样挂载了多个子设备。但它们不具同类型的功能。Palftformusb等总线是平级的。但usb总线下面挂载是同一个类型的设备。Plaftrom则相反。因此我们称plaftform为虚拟总线,并不是真正的总线的意思。Plaftform下面的子设备由platform_device_register  platform_driver_register函数来完成建立。

    展开全文
  • 基于platform模型的驱动模型下的probe函数的调用在linux2.6的内核之上,驱动基于kobject模型,向上搭建驱动模型。本文以platform模型来讨论platform_driver下的probe函数被调用的过程。
  • linux驱动模型学笔记——kobject&kset

    千次阅读 2010-09-19 21:42:00
    想看linux驱动模型好长时间了,老是看一点就坚持不住,结果最后是什么都没有学会,这回又下决心看这个,这次一定要坚持住~~ kobject, kobj_type, kset简介 kobject是linux设备模型中最基本的结构。要说明的是...
  • 通过前面的学习,我们知道Linux内核是由大量而且复杂的代码组成的,而内核源码中又有很大一部分是各种驱动程序组成的。为了不使参与到Linux内核开发的“黑客”们不会被内核代码的复杂性淹没,设备驱动程序就是一个很...
  • linux驱动模型分析总括

    千次阅读 2009-01-08 21:53:00
    LINUX设备驱动模型在2.4和2.6之间有非常大的变化。感觉最大的变化就是2.6中加入了一些面相对象的方法进行管理设备驱动,其实在LINUX中早就使用了该方法。 为了有一个全面的了解,今天特意理清了一下思路,为下一步...
  • 1、概述: 通常在Linux中,把SoC系统中集成的独立外设单元(如:I2C、IIS、RTC、看门狗等)都被当作平台设备来处理。...Linux中大部分的设备驱动,都可以使用这套机制,设备用platform_device表示,驱动用platform
  • 1、概述: 通常在Linux中,把SoC系统中集成的独立外设单元(如:I2C、IIS、RTC、看门狗等)都被当作平台设备来处理。...Linux中大部分的设备驱动,都可以使用这套机制,设备用platform_device表示,驱动用platform
  • Linux 设备驱动模型中,按照层次的组织结构,抽象成总线(struct bus_type),设备(struct device),驱动(struct device_driver)的层次组织形式,这是最原始的抽象结构,在此基础之上,根据不同类型的总线/设
  • kobject数据结构 kset数据结构
  • 本课程是linux驱动开发的第5个课程,主要内容是linux的设备驱动模型,包括总线、类、设备、驱动等概念,重点通过platform平台总线的工作来演示设备驱动模型的工作方法,实践环节对上个课程的LED驱动进行平台总线式...
  • Linux内核驱动模型---设备总线驱动

    千次阅读 2021-02-15 20:08:31
    内核驱动模型何为驱动模型Linux驱动模型驱动模型dev类型 何为驱动模型 在我看来模型就是对一系列事务,进行抽象、统一、管理。所呈现出的一种层次关系。就像一个公司有部门、小组、个人这样的一个组织关系。那么这样...
  • linux设备驱动模型 - 驱动框架

    千次阅读 2017-03-29 23:08:49
    linux驱动模型框架如图所示:1. kernfs驱动最终是提供给用户层使用,那么其中的接口就是通过kernfs文件系统来注册,kernfs是一个通用的内核虚拟文件系统2. sys/kobjectsys是设备驱动文件系统,在/sys目录下会把各个...
  • linux内核驱动模型

    2008-08-29 16:31:55
    linux内核驱动模型linux内核驱动模型linux内核驱动模型
  • linux设备驱动模型

    千次阅读 2016-04-16 15:17:52
    基于一个虚拟总线分析linux设备驱动模型
  • Linux Platform驱动模型

    2019-05-28 17:53:13
    Linux Platform驱动模型(一) _设备信息:https://www.cnblogs.com/xiaojiang1025/p/6367061.html Linux Platform驱动模型(二) _驱动方法:...Linux Platform驱动模型(三) _platform+cdev:h...
  • Linux驱动设备驱动模型

    千次阅读 2010-12-17 01:03:00
    Linux驱动设备驱动模型 <br />序言 从这一章开始,我们将详细的介绍Linux的设备驱动模型。Linux设备驱动模型是一个相当复杂的系统,对于初学者来说真有些无从入手。而且更加困难的是,随着新的Linux...
  • Linux驱动程序开发-设备驱动模型 Linux2.6设备驱动模型的基本元素是Class、Bus、Device、Driver,下面我们分别介绍各个部分。
  • Linux 设备驱动模型

    千次阅读 2013-10-17 22:54:56
    从这一章开始,我们将详细的介绍Linux的设备驱动模型Linux设备驱动模型是一个相当复杂的系统,对于初学者来说真有些无从入手。而且更加困难的是,随着新的Linux Kernel的release,Linux的设备驱动模型总会有或大或...
  • 五.linux设备驱动模型

    千次阅读 2019-09-29 16:19:14
    一.linux 设备驱动模型简介 1.1、 什么是设备驱动模型 1.2、 为什么需要设备驱动模型 1.3、 驱动开发的2个点 二.设备驱动模型的底层架构 2.1、kobject结构体 2.2、kobj_type结构体 2.3、kset结构体 三.总线...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 98,071
精华内容 39,228
关键字:

linux驱动模型

linux 订阅