ITcool

ITcool.net
IT资源网——精选每一篇高品质的技术干货
  1. 首页
  2. 开源快讯
  3. 正文

、USB、SD驱动开发中两个重要思想解析

2023年7月29日 433点热度

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

1、XXX设备驱动

2、XXX核心层

3、XXX主机控制器驱动

而须要我们编撰的主要是设备驱动部份,主机控制器驱动部份也有少量编撰,两者进行交互主要时由核心层提供的插口来实现;这样结构清晰,大大地有利于我们的驱动开发,这其中就是借助了Linux设备驱动开发中两个重要思想,明天我们来仔细解析一下。

一、设备驱动的分层思想

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

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

[cpp]viewplaincopy

1.return_typecore_funca(xxx_device*bottom_dev,param1_typeparam1,param1_typeparam2)

2.{

3.if(bottom_dev->funca)

4.returnbottom_dev->funca(param1,param2);

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

6....

7.}

上述core_funca的实现中,会检测底层设备是否重载了funca(),假如重载了,就调用底层的代码linux设备驱动开发详解ldd,否则,直接使用通用层的。这样做的用处是如何安装LINUX,核心层的代码可以处理绝大多数该类设备的funca()对应的功能,只有少数特殊设备须要重新实现funca()。

再看一个反例:

[cpp]viewplaincopy

1.return_typecore_funca(xxx_device*bottom_dev,param1_typeparam1,param1_typeparam2)

2.{

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

4....

5.bottom_dev->funca_ops1();

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

7....

8.bottom_dev->funca_ops2();

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

10....

11.bottom_dev->funca_ops3();

12.}

上述代码假设为了实现funca(),对于同类设备而言,操作流程一致,都要经过“通用代码A、底层ops1、通用代码B、底层ops2、通用代码C、底层ops3”这几步,分层设计显著带来的益处是,对于通用代码A、B、Clinux设备驱动开发详解ldd,具体的底层驱动不须要再实现,而仅仅只关心其底层的操作ops1、ops2、ops3。图1明晰反映了设备驱动的核心层与具体设备驱动的关系,实际上,这些分层可能只有2层(图1的a),也可能是多层的(图1的b)信盈达嵌入式要领吧五六体悟四五吧。

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

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

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

在Linux设备驱动框架的设计中,不仅有分层设计实现以外,还有分隔的思想。举一个简单的事例,假定我们要通过SPI总线访问某外设linux使用教程,在这个访问过程中,要通过操作CPUXXX上的SPI控制器的寄存器来达到访问SPI外设YYY的目的,最简单的方式是:

[cpp]viewplaincopy

linux设备驱动开发详解ldd_linux显示驱动开发_linux驱动开发工具

1.return_typexxx_write_spi_yyy(...)

2.{

3.xxx_write_spi_host_ctrl_reg(ctrl);

4.xxx_write_spi_host_data_reg(buf);

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

6....

7.}

若果根据这些方法来设计驱动,结果是对于任何一个SPI外设来讲,它的驱动代码都是CPU相关的。也就是说,其实用在CPUXXX上的时侯,它访问XXX的SPI主机控制寄存器,当用在XXX1的时侯,它访问XXX1的SPI主机控制寄存器:

[cpp]viewplaincopy

1.return_typexxx1_write_spi_yyy(...)

2.{

3.xxx1_write_spi_host_ctrl_reg(ctrl);

4.xxx1_write_spi_host_data_reg(buf);

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

6....

7.}

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

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

LinuxSPI、I2C、USB、ASoC(ALSASoC)等子系统都典型地借助了这些分离的设计思想。

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: 主机 外设 底层 通用 驱动
最后更新:2023年7月29日

IT资源网

每日更新,欢迎收藏♥ 不积跬步无以至千里,加油,共勉。

点赞
< 上一篇
下一篇 >

IT资源网

每日更新,欢迎收藏♥
不积跬步无以至千里,加油,共勉。

最新 热点 随机
最新 热点 随机
主流Linux发行版下的JDK环境变量配置文件对比评测 在Linux下将Qt程序打包发布可以通过以下步骤完成 如何通过命令行查看Linux系统版本号 麒麟系统开发笔记(八):ubuntu发布程序打包流程 深度解析LinuxC编程文件修改 刚学习Linux操作系统的启动流程是最基本的内容 kali linux安装qq 如何选择Kalilinux及解决问题 linux指令范例速查手册(第2版) Linux用户空间内存申请性能评测:malloc vs new 市面上的房产中介管理软件有哪些是提供源代码 Linux文件词频统计实用技巧 Linux内核启动过程中的操作系统运行的机理是什么 2023年Linux发行版大揭秘 Linux系统修改文件权限的详细介绍-苏州安亲宝 Linux基础教程:安装与配置 5.4将一条命令的输出插入另一个命令116 服务器安全狗Linux特点解析 QT开发应用运行用到的Qt库:ARMCreatorruninstallinstall gnu/linux linux GNU/Linux:回首往事 如何查看Linux系统中安装的Python版本信息
CGI文件:一场数字世界的魔法如何查看Linux系统中安装的Python版本信息探秘Linux触摸屏驱动RedHatEnterpriseLinux5Samba服务器介绍(hostname10)联想电脑装linux系统(光驱笔记本光驱装鸿蒙系统教程)使用GTK来开发LinuxGUI界面的开源工具包应用程序实现这个协议的常用服务器有:apacheIIS等请求基于主机的虚拟化基于存储设备的存储虚拟存储方法Linux版本查询技巧Linux系统内核与Linux发行套件系统的不同作用介绍Snort开源入侵检测系统的技术特点及应用价值特点分析Linux下写FAT32文件系统的错误处理方式的参数提升数据库性能:Linux下设置MySQL变量的经验联想ThinkPad将向用户提供预装Linux操作系统的笔记本电脑深入探讨Linux桌面虚拟化的优势魔方OA办公管理系统的OA源码给企业提供了自由定制和二次开发的机会Linux下重启MySQL数据库的注意事项LINUX发行版同LINUX应用程序的良好结合具体地说Linux文件系统中inode的重要性基于命令`lsoffilename`检查文件权限的解决办法!
Python升级到最新版本,您需要首先了解当前的版本 启动终端后不进入conda环境,直接修改conda的配置文件 不知道装了什么东西,又把Ubuntu的桌面搞没了! 深入解析Linux mmap文件的技巧 消息队列:全面拥抱云原生基础设施的核心演进方向 新型后门程序针对全球范围内的超级计算机发动网络攻击 视频直播系统源码开发的盈利功能和技术优势,云豹 linux服务器内存不够怎么办?脚本定时监测 Linux版本查看攻略 有哪个Linux操作系统推荐?发行版本介绍及解析 如何实现Linux0.01或Linux0.11内核编译编译?|回答 Linux编译神器:makefile提速秘籍 八款不错的开源商城系统,只有简短的评述 Linux基础入门:Ubuntu、Fedora、openSUSE,你该选哪个? Linux安装deb文件方法详解 上帝之火本系列之开源实时监控告警解决方案 Linux系统配置Tomcat环境 Linux系统管理员useradd命令语法命令选项:usermod命令命令 WordPress:免费开源建站系统首选 魔方OA办公管理系统的OA源码给企业提供了自由定制和二次开发的机会
标签聚合
内核 命令 应用 目录 软件 linux服务器 文件 开源 操作 linux系统
书籍
课程
技术群
技术干货大合集↓
  • 2023年12月 / 12篇
  • 2023年11月 / 83篇
  • 2023年10月 / 124篇
  • 2023年9月 / 119篇
  • 2023年8月 / 123篇
  • 2023年7月 / 122篇
  • 2023年6月 / 119篇
  • 2023年5月 / 124篇
  • 2023年4月 / 70篇
友情链接:

Linux书籍 | Linux命令 | Linux系统 | RHCE红帽认证 | Linux软件 | Linux教程 | CentOS系统 | Linux内核 | Linux服务器 | Linux大神 | IT资源

COPYRIGHT © 2024 ITcool.net ALL RIGHTS RESERVED.

京ICP备14023444号-4