首页 > 嵌入式软件 > linux

嵌入式Linux设备驱动开发之驱动分层/分离思想

本文引用地址: http://www.21ic.com/embed/software/linuxos/201804/51524.html

我们在学习I2C、USB、SD驱动时,有没有发现一个共性,就是在驱动开发时,每个驱动都分层三部分,由上到下分别是:

1、XXX 设备驱动

2、XXX 核心层

3、XXX 主机控制器驱动

而需要我们编写的主要是设备驱动部分,主机控制器驱动部分也有少量编写,二者进行交互主要时由核心层提供的接口来实现;这样结构清晰,大大地有利于我们的驱动开发,这其中就是利用了Linux设备驱动开发中两个重要思想,下面来一一解析

一、设备驱动的分层思想

在面向对象的程序设计中,可以为某一类相似的事物定义一个基类,而具体的事物可以继承这个基类中的函数。如果对于继承的这个事物而言,其某函数的实现与基类一致,那它就可以直接继承基类的函数;相反,它可以重载之。这种面向对象的设计思想极大地提高了代码的可重用能力,是对现实世界事物间关系的一种良好呈现。

Linux内核完全由C语言和汇编语言写成,但是却频繁用到了面向对象的设计思想。在设备驱动方面,往往为同类的设备设计了一个框架,而框架中的核心层则实现了该设备通用的一些功能。同样的,如果具体的设备不想使用核心层的函数,它可以重载之。举个例子:

return_type core_funca(xxx_device * bottom_dev, param1_type param1, param1_type param2)

{

if (bottom_dev->funca)

return bottom_dev->funca(param1, param2);

/* 核心层通用的funca代码 */

...

}

上述core_funca的实现中,会检查底层设备是否重载了funca(),如果重载了,就调用底层的代码,否则,直接使用通用层的。这样做的好处是,核心层的代码可以处理绝大多数该类设备的funca()对应的功能,只有少数特殊设备需要重新实现funca()。

再看一个例子:

copyreturn_type core_funca(xxx_device * bottom_dev, param1_type param1, param1_type param2)

{

/*通用的步骤代码A */

...

bottom_dev->funca_ops1();

/*通用的步骤代码B */

...

bottom_dev->funca_ops2();

/*通用的步骤代码C */

...

bottom_dev->funca_ops3();

}

上述代码假定为了实现funca(),对于同类设备而言,操作流程一致,都要经过“通用代码A、底层ops1、通用代码B、底层ops2、通用代码C、底层ops3”这几步,分层设计明显带来的好处是,对于通用代码A、B、C,具体的底层驱动不需要再实现,而仅仅只关心其底层的操作ops1、ops2、ops3。图1明确反映了设备驱动的核心层与具体设备驱动的关系,实际上,这种分层可能只有2层(图1的a),也可能是多层的(图1的b)。

这样的分层化设计在Linux的input、RTC、MTD、I2 C、SPI、TTY、USB等诸多设备驱动类型中屡见不鲜。

二、主机驱动和外设驱动分离思想

主机、外设驱动分离的意义

在Linux设备驱动框架的设计中,除了有分层设计实现以外,还有分隔的思想。举一个简单的例子,假设我们要通过SPI总线访问某外设,在这个访问过程中,要通过操作CPU XXX上的SPI控制器的寄存器来达到访问SPI外设YYY的目的,最简单的方法是:

copyreturn_type xxx_write_spi_yyy(...)

{

xxx_write_spi_host_ctrl_reg(ctrl);

xxx_ write_spi_host_data_reg(buf);

while(!(xxx_spi_host_status_reg()&SPI_DATA_TRANSFER_DONE));

...

}

如果按照这种方式来设计驱动,结果是对于任何一个SPI外设来讲,它的驱动代码都是CPU相关的。也就是说,当然用在CPU XXX上的时候,它访问XXX的SPI主机控制寄存器,当用在XXX1的时候,它访问XXX1的SPI主机控制寄存器:

return_type xxx1_write_spi_yyy(...)

{

xxx1_write_spi_host_ctrl_reg(ctrl);

xxx1_ write_spi_host_data_reg(buf);

while(!(xxx1_spi_host_status_reg()&SPI_DATA_TRANSFER_DONE));

...

}

这显然是不能接受的,因为这意味着外设YYY用在不同的CPU XXX和XXX1上的时候需要不同的驱动。那么,我们可以用如图的思想对主机控制器驱动和外设驱动进行分离。这样的结构是,外设a、b、c的驱动与主机控制器A、B、C的驱动不相关,主机控制器驱动不关心外设,而外设驱动也不关心主机,外设只是访问核心层的通用的API进行数据传输,主机和外设之间可以进行任意的组合。

如果我们不进行上图的主机和外设分离,外设a、b、c和主机A、B、C进行组合的时候,需要9个不同的驱动。设想一共有m个主机控制器,n个外设,分离的结果是需要m+n个驱动,不分离则需要m*n个驱动。

Linux SPI、I2C、USB、ASoC(ALSA SoC)等子系统都典型地利用了这种分离的设计思想。

换一批

延伸阅读

[行业资讯] 暂停EUV设备采购?三星电子应对存储器市场趋缓改主意

暂停EUV设备采购?三星电子应对存储器市场趋缓改主意

半导体产业景气转弱又出现新信号!韩国媒体报导,三星电子宣称引进的EUV设备数量已经足够应付现况,预计明年不会购买EUV(极紫外线)设备,未来若要持续引进,将会评估2020年晶圆代工和存储器半导体部门的订单再做决定。 ......

关键字:半导体 存储器 EUV设备

[行业资讯] 英国HyperSurfaces开发新传感器 改写人机互动模式

英国HyperSurfaces开发新传感器 改写人机互动模式

现在智能设备几乎随处可见,但你是否想过未来能够透过一种特殊的芯片,把任何一项物品转化成可以接收触控感应的计算机输入设备?根据《Digital Trends》报导,一间名为HyperSurfaces的英国新创公司正在进行一项实验,希望能透过特......

关键字:智能设备 触控屏幕 芯片

[行业资讯] 歌尔智能传感器项目入驻青岛崂山区 助力微电子产业发展

歌尔智能传感器项目入驻青岛崂山区 助力微电子产业发展

9月11日,青岛市崂山区人民政府和歌尔股份有限公司在青岛市府新大厦举行智能传感器项目签约仪式。崂山区委副书记、区长赵燕和歌尔股份副董事长兼总裁姜龙作为双方代表进行签约,双方将在项目建设、人才引进、技术研发、成果产业化等方面开展合作,助力崂山......

关键字:智能传感器 青岛 驱动器

[行业资讯] TCL李东生:如果真做晶圆,500亿元不够, 格力能成功吗?

TCL李东生:如果真做晶圆,500亿元不够, 格力能成功吗?

在家电业做芯片的风潮中,格力是最决绝的。2017年格力不分红,格力电器董事长董明珠斩钉截铁地说,芯片一定要做。随后,格力创始人朱江洪遥相提醒:“格力做高端芯片,我没有太大信心”。 ......

关键字:芯片 变频驱动芯片 格力

[行业资讯] 国际IDM大厂或将成为全球首座8英寸GaN代工厂

国际IDM大厂或将成为全球首座8英寸GaN代工厂

从硅晶圆到8英寸晶圆代工报价调涨,世界先进8英寸产能供需吃紧一路畅旺到年底,并积极扩增氮化镓(GaN)产能,已有国际IDM大厂看好电动车产业后市,预先包下世界先进GaN产能,明年中GaN产出将快速放量,成为全球首座8英寸GaN代工厂。 ......

关键字:半导体 硅晶圆 面板驱动
条评论

我 要 评 论

网友评论

大家都爱看

  • 扇出型晶圆级封装的优势和挑战!

    我们有能力创造一些能保持前代性能并且更好更小的电子设备,例如今天的可穿戴设备、智能手机或平板电脑,这是由于很多因素超过摩尔定律而快速发展,从而能够从底层的嵌入组件发展到今天把它们封…

    2018-03-29
  • Xilinx推出革命性的新型自适应计算产品

    自适应和智能计算的全球领先企业赛灵思公司(Xilinx, Inc.,(NASDAQ:XLNX)),近日宣布推出一款超越FPGA功能的突破性新型产品,名为ACAP(Adaptive Compute Acceleration Platform,自适应计算加速…

    2018-03-20
  • 赛普拉斯为树莓派3 B+ IoT单板计算机提供强大稳定的无

    先进嵌入式系统解决方案的领导者赛普拉斯(纳斯达克代码:CY)近日宣布其Wi-Fi®和蓝牙®combo解决方案为全新的树莓派 3 B+(Raspberry Pi 3Model B+)IoT单板计算机提供强大稳定的无线连接…

    2018-03-20
  • 观看直播领红包,SEED-A10加速卡助力人工智能

    随着云服务器、云计算的发展,大家对硬件加速的需求越来越多,但是随着设备功耗的上升、性能需求越来越高,常规加速设备以及开始不能满足需求,因此FPGA逐渐在硬件加速中找到了自己的位置,而艾…

    2018-03-19
  • 特朗普:博通不得以任何形式收购高通

    白宫周一(3月12日)晚发出声明,川普(特朗普)总统出于“国家安全”考量、禁止新加坡博通公司(Broadcom)收购美国高通公司(Qualcomm)。

    2018-03-14