学习韦东山视频心得(二)

                    学习韦东山视频心得(二)

1.字符设备驱动

viewfile?f=66A91C2D59B9219710E547F38E426图2.6 LCD驱动框架

viewfile?f=66A91C2D59B9219710E547F38E426

图2.7 LCD硬件框架

字符设备是Linux设备中最基本的设备驱动是其他大型驱动的基石。字符设

备驱动模型,如下图2.8所示。

Linux内核驱动模块一般由模块加载函数,模块卸载函数,模块许可申明等等组成。在字符设备驱动中在模块加载函数中注册主设备,注册操作方法,创建设备结点等操作。字符设备驱动移植步骤:

(1)在模块加载函数中创建设备文件,注册主设备号,注册操作方法

(2)分别实现各自操作方法

Linux内核驱动模块一般由模块加载函数,模块卸载函数,模块许可申明等等组成。在字符设备驱动中在模块加载函数中注册主设备,注册操作方法,创建

 

viewfile?f=66A91C2D59B9219710E547F38E426    

图2.8 字符设备框架图

  设备结点等操作。字符设备驱动移植步骤:

(1)在模块加载函数中创建设备文件,注册主设备号,注册操作方法

(2)分别实现各自操作方法

2.平台设备驱动机制

对于一些常见的接口比如:I2C,SPI接口。Linux操作系统在内核中抽象出一条虚拟的总线,在这条软件虚拟的总线上挂接这I2C,SPI硬件。通过平台设备驱动机制,使得驱动程序的通用部分和一些特定硬件资源(比如:寄存器地址,中断源等等)分离,从而使驱动更加通用,在驱动的移植过程中往往只要添加资源便可,大大的缩短了驱动的移植难度,提高了驱动的通用性〔8〕

viewfile?f=66A91C2D59B9219710E547F38E426 

图2.9 字符设备框架图

struct platform_device 平台设备结构体,一个平台设备对应一个实际的物理设备,在实际的设备之中最至关重要的是物理设备的硬件信息,比如说:寄存器地址,中断号,等等。在Linux内核中,把上述一些也有的物理硬件资源抽象出来一个void *型指针,用来接收任意数据类型,称为平台数据。平台数据一般存放特定设备资源。在函数接口platform_register_device()注册平台设备结构到平台设备链表中。如上图2.9所示。

   struct platform_driver 平台驱动结构体,一个平台驱动对应一个驱动,函数接口platform_regisister_driver()把设备驱动注册到设备驱动链表中。当驱动或者是平台设备注册相应的链表是不断的查询对方的链表,通过struct platform_mach_id中的结构体的名字跟驱动中的名字是否匹配,当匹配成功时调用设备驱动结构体重probe函数,在probe函数中获取注册的设备结构体,然后获取特定设备的资源,在获取资源之后,初始化特定的硬件,注册中断,注册主设备号,创建设备文件,注册操作方法等等一系列操作。

平台设备驱动机制相比于普通的字符设备而言,使得设备资源与驱动分离,使得驱动移植更加方便与便捷。但是同时,由于为了使得驱动通用性和便于移植的特性,在Linux内核中往往是分为多层结构,多个文件,在驱动内部关系错综复杂,函数调用关系十分繁杂,Linux驱动与内核浑然一体。

在Linux设备驱动中往往采用分层的思想,使得代码有很高的互用性,在大型驱动中,多层结构,关系复杂,同时Linux设备驱动采用面向对象的思想,采用大量的结构体,包含关系也是十分繁杂。如下图2.10所示。

viewfile?f=66A91C2D59B9219710E547F38E426图2.10 Linux驱动思想

    通过上述的分层思想,达到了代码互用的功能,借鉴了面向对象的思想。


你可能感兴趣的:(字符设备,韦东山,视频心得)