设为首页 加入收藏

TOP

Linux Platform驱动模型详述
2017-02-08 08:16:36 】 浏览:7320
Tags:Linux Platform 驱动 模型 详述

在设备树出现之前,设备信息只能使用C语言的方式进行编写,在3.0之后,设备信息就开始同时支持两种编写方式——设备树、C语言,如果用设备树,手动将设备信息写到设备树中之后,内核就可以自动从设备树中提取相应的设备信息并将其封装成相应的platform_device对象,i2c_device对象并注册到相应的总线中,如果使用设备树,我们就不需要对设备信息再进行编码。如果使用C语言,显然,我们需要将使用内核提供的结构将设备信息进行手动封装,这种封装又分为两种形式,一种是使用平台文件(静态),将整个板子的所有设备都写在一个文件中并编译进内核。另一种是使用模块(动态),将我们需要的设备信息编译成模块在insmod进内核。对于ARM平台,使用设备树封装设备信息是将来的趋势,但是由于历史原因,当下的内核中这三种方式并存。封装好后再创建相应的xxx_device实例最后注册到总线中。针对平台总线的设备信息,我在Linux设备树语法详解一文中已经讨论了设备树的写法,所以,本文主要讨论4个问题:


所谓的设备信息,主要分为两种:硬件信息、软件信息,硬件信息主要包括xxx控制器在xxx地址上,xxx设备占用了xxx中断号,即地址资源中断资源等。内核提供了struct resource来对这些资源进行封装。软件信息的种类就比较多样,比如网卡设备中的MAC地址等等,这些信息需要我们以私有数据的形式封装的设备对象(内核使用面向对象的思想编写,一个设备的设备信息是一个对象,即一个结构体实例,一个设备的驱动方法也是一个对象)中,这部分信息就需要我们自定义结构进行封装。


这个结构用来描述一个地址资源或中断资源,除了这个结构,内核还提供了一些宏来帮助我们快速的创建一个resource对象。


有了这几个属性,就可以完整的描述一个资源,但如果每个资源都需要单独管理而不是组成某种数据结构,显然是一种非常愚蠢的做法,所以内核的resource结构还提供了三个指针:parent,sibling,child(24),分别用来表示资源的父资源,兄弟资源,子资源,这样内核就可以使用树结构来高效的管理大量的系统资源,linux内核有两种树结构:iomem_resource,ioport_resource,进行板级开发的时候,通常将主板上的ROM资源放入iomem_resource树的一个节点,而将系统固有的I/O资源挂到ioport_resource树上。


下面是一个小例子,分别用两种写法表示了地址资源和中断资源,强烈推荐使用DEFINE_RES_XXX的版本


下面是一个资源数组的实例,多个资源的时候就写成数组,这里我同时使用了上面两种写法。


至此,我们已经讨论了使用设备树和resource结构两种方式写设备信息,显然,这两种方式最终是殊途同归的,这里我们简单的讨论一个二者之间的转换问题。下图是我在Linux设备树语法详解一文中用到的dm9000网卡的节点

将它的地址资源写成resource就是这个样子,清晰起见,这里也是两种写法:


这个对象就是我们最终要注册到平台总线上的设备信息对象,对设备信息进行编码,其实就是创建一个platform_device对象,可以看出,platform_device和其他设备一样,都是device的子类


在这个对象中,我们主要关心以下几个成员


准备好了platform_device对象,接下来就可以将其注册进内核,显然内核已经为我们准备好了相关的函数


通常,我们会将platform_device_register写在模块加载的函数中,将platform_device_unregister写在模块卸载函数中。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Linux驱动程序三大结构:inode,fi.. 下一篇从JVM的角度来看Java的多线程

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目