【C语言】Linux内核pci_read_config_和pci_write_config_

一、pci_read_config_讲解

这些函数是Linux内核中用于从PCI设备的配置空间读取信息的函数。配置空间是PCI设备的一小块内存,它存储了关于该设备的重要信息,例如设备ID、供应商ID、中断设置等。
pci_read_config_byte、`pci_read_config_word`、`pci_read_config_dword`函数可以分别读取1个字节、2个字节和4个字节的数据。这些函数是根据读取数据的长度划分的,分别对应8位、16位和32位的读取请求。以下是函数的详细中文解释:
1. pci_read_config_byte:该函数用于从PCI设备的配置空间中读取一个字节(8位)的数据。
   - 参数`const struct pci_dev *dev`:指向代表要访问的PCI设备的`pci_dev`结构的指针。
   - 参数`int where`:指定从哪个偏移地址开始读取数据。
   - 参数`u8 *val`:用来存放读取到的数据的字节指针。
2. pci_read_config_word:该函数用于从PCI设备的配置空间中读取一个字(16位)的数据。
   - 参数类似于`pci_read_config_byte`,但是`u16 *val`用于存放读取到的两个字节的数据。
3. pci_read_config_dword:该函数用于从PCI设备的配置空间中读取一个双字(32位)的数据。
   - 参数类似于前两个函数,但是`u32 *val`用于存放读取到的四个字节的数据。
在每个函数内部,首先调用了`pci_dev_is_disconnected`来检查对应的PCI设备是否已经断开连接。如果设备已断开连接,函数会将参数`val`的值设置为全1(0xFF、0xFFFF或0xFFFFFFFF),并返回一个错误码`PCIBIOS_DEVICE_NOT_FOUND`。
如果设备连接正常,函数会通过调用`pci_bus_read_config_byte`、`pci_bus_read_config_word`或`pci_bus_read_config_dword`来实际完成数据的读取操作。这些函数将会读取指定的PCI总线上的配置空间数据。
最后,`EXPORT_SYMBOL`宏用于导出符号,使得这些函数可以被模块之外的其他模块使用。这是Linux内核模块间通信的常用方法之一。

二、pci_write_config_讲解

这段代码展示了在Linux内核中,如何通过PCI(Peripheral Component Interconnect)总线接口来写入PCI设备的配置空间。每段代码中包括一个函数,用于把一个字节(u8), 两个字节(u16), 或者四个字节(u32)的值写入到指定的配置寄存器中。
这里是每个函数的中文讲解:
1. pci_write_config_byte函数:
   - 功能:将一个字节值(val)写入一个PCI设备的配置空间的特定位置(where)。
   - 参数:
     - const struct pci_dev *dev:指向需要操作的PCI设备的指针。
     - int where:要写入数据的配置空间的偏移地址。
     - u8 val:要写入的数据的字节值。
   - 返回值:如果设备没有连接,则返回一个错误代码`PCIBIOS_DEVICE_NOT_FOUND`。如果写入操作成功执行,则返回`0`。
2. pci_write_config_word函数:
   - 功能:与`pci_write_config_byte`类似,但是这个函数写入的是两个字节(16位)的数据。
   - 参数与`pci_write_config_byte`相同,不过`u16 val`替代了`u8 val`。
   - 返回值与`pci_write_config_byte`相同。
3. pci_write_config_dword函数:
   - 功能:与`pci_write_config_byte`类似,但是这个函数写入的是四个字节(32位)的数据。
   - 参数与`pci_write_config_byte`相同,不过`u32 val`替代了`u8 val`。
   - 返回值与`pci_write_config_byte`相同。
在每个函数里,首先会检查传入的PCI设备是否处于断开状态(`pci_dev_is_disconnected(dev)`)。如果设备已经断开,则函数会返回一个错误码`PCIBIOS_DEVICE_NOT_FOUND`。如果设备处于连接状态,它会调用相应的`pci_bus_write_config_*`函数以写入数据至设备的配置空间。
每个函数的最后一行`EXPORT_SYMBOL()`是一个宏,用于导出这些函数的符号,使得其他的内核模块可以在运行时使用这些函数。 

三、中文注释

// 读取PCI配置空间的一个字节
int pci_read_config_byte(const struct pci_dev *dev, int where, u8 *val)
{// 如果PCI设备已断开连接,则设置val为全1,并返回设备未找到的错误if (pci_dev_is_disconnected(dev)) {*val = ~0;return PCIBIOS_DEVICE_NOT_FOUND;}// 使用pci_bus_read_config_byte函数从PCI总线读取配置return pci_bus_read_config_byte(dev->bus, dev->devfn, where, val);
}
EXPORT_SYMBOL(pci_read_config_byte);// 读取PCI配置空间的一个字
int pci_read_config_word(const struct pci_dev *dev, int where, u16 *val)
{// 如果PCI设备断开连接,则设置val为全1,并返回设备未找到的错误if (pci_dev_is_disconnected(dev)) {*val = ~0;return PCIBIOS_DEVICE_NOT_FOUND;}// 使用pci_bus_read_config_word函数从PCI总线读取配置return pci_bus_read_config_word(dev->bus, dev->devfn, where, val);
}
EXPORT_SYMBOL(pci_read_config_word);// 读取PCI配置空间的一个双字
int pci_read_config_dword(const struct pci_dev *dev, int where, u32 *val)
{// 如果PCI设备断开连接,则设置val为全1,并返回设备未找到的错误if (pci_dev_is_disconnected(dev)) {*val = ~0;return PCIBIOS_DEVICE_NOT_FOUND;}// 使用pci_bus_read_config_dword函数从PCI总线读取配置return pci_bus_read_config_dword(dev->bus, dev->devfn, where, val);
}
EXPORT_SYMBOL(pci_read_config_dword);// 往PCI配置空间写入一个字节
int pci_write_config_byte(const struct pci_dev *dev, int where, u8 val)
{// 如果PCI设备断开连接,返回设备未找到的错误if (pci_dev_is_disconnected(dev))return PCIBIOS_DEVICE_NOT_FOUND;// 使用pci_bus_write_config_byte函数向PCI总线写入配置return pci_bus_write_config_byte(dev->bus, dev->devfn, where, val);
}
EXPORT_SYMBOL(pci_write_config_byte);// 往PCI配置空间写入一个字
int pci_write_config_word(const struct pci_dev *dev, int where, u16 val)
{// 如果PCI设备断开连接,返回设备未找到的错误if (pci_dev_is_disconnected(dev))return PCIBIOS_DEVICE_NOT_FOUND;// 使用pci_bus_write_config_word函数向PCI总线写入配置return pci_bus_write_config_word(dev->bus, dev->devfn, where, val);
}
EXPORT_SYMBOL(pci_write_config_word);// 往PCI配置空间写入一个双字
int pci_write_config_dword(const struct pci_dev *dev, int where, u32 val)
{// 如果PCI设备断开连接,返回设备未找到的错误if (pci_dev_is_disconnected(dev))return PCIBIOS_DEVICE_NOT_FOUND;// 使用pci_bus_write_config_dword函数向PCI总线写入配置return pci_bus_write_config_dword(dev->bus, dev->devfn, where, val);
}
EXPORT_SYMBOL(pci_write_config_dword);

请注意,`EXPORT_SYMBOL`宏用于导出符号,这样其他内核模块就可以调用这些导出的函数。这些函数用于访问PCI设备的配置空间,通常包括设备的硬件设置和状态信息。如果设备已断开连接,它们会返回一个错误,并将输出值设置为特定的值(通常是全1,即`~0`)。这些函数在Linux内核的PCI支持中十分关键。

具体函数定义drivers\pci\access.c文件中,include\linux\pci.h中声明。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/736778.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

章六、集合(1)—— 概念、API、List 接口及实现类、集合迭代

零、 关闭IDEA调试时自动隐藏空元素 一、 集合的概念 存储一个班学员信息,假定一个班容纳20名学员 当我们需要保存一组一样(类型相同)的元素的时候,我们应该使用一个容器来存储,数组就是这样一个容器。 数组有什么缺…

一文读懂:公网IP地址证书

公网IP证书是一种SSL证书,用于验证和确认特定的公网IP地址是否实际属于申请者。如果验证通过,证书颁发机构将向该IP地址持有人颁发一个以IP地址为主题的SSL证书。使用公网IP证书可以有效提升IP身份的辨识度,减少网站链接被假冒的风险&#xf…

学会这7种SQL进阶用法,让你少走99%的弯路!

引言 在日常业务开发中,熟练掌握SQL语言是至关重要的。除了基础的增删改查操作外,了解和掌握一些进阶的SQL用法能够让你更高效地处理各种复杂的数据操作。本文将介绍几种SQL进阶用法,让你少走99%的弯路,提高数据处理效率。 自定…

【Idea】八种Debug模式介绍

1.行断点 在对应的代码行左侧边栏点击鼠标左键,会出现一个红色圆圈,以debug模式执行时当代码运行到此处则会停止,并可以查询相关上下文参数 2.方法断点 在方法左侧点击创建断点,在方法进入时会停止,同时可以右键断点,…

vite vue3 路由配置@找不到文件问题描述

问题描述 在vite.config.js文件中配置路由的时候,添加路由界面,找不到指定的文件,提示错误,如图所示: 但是换成 ./ 或者 ../ 就正常了,也没有报错问题 解决办法 1.安装一个path的插件 npm install --sav…

风车IM即时通讯系统APP源码DJ2403版完整苹果安卓教程

关于风车IM,你在互联网上能随便下载到了基本都是残缺品, 经过我们不懈努力最终提供性价比最高,最完美的版本, 懂货的朋友可以直接下载该版本使用,经过严格测试,该版本基本完美无缺。 1.宝塔环境如下: Ngin…

什么是Git引用和分支?

一. 引言 什么是Git引用和分支?比如我在 Github 上一个项目的 .git/refs目录下: ├─heads │ dev │ master │ ├─remotes │ └─origin │ master │ └─tags refs 目录下包含了 heads、remote、tags 三个子目录&#xff0…

openCV制作九宫格图片

我想将任意九张图片按照九宫格排列方式合并成一张大图,使用openCV实现。 如果用画图工具来实现的话,需要事先准备一个600 X 600像素的画布。用openCV实现也是同理,准备一张600 X 600的图片。然后将图片划分成9份,每一份替换成小图…

《Ubuntu20.04环境下的ROS进阶学习0》

一、逛ROS应用商店 在上一专栏http://t.csdnimg.cn/oGlcu,我们了解了ROS的基本功能。这一专栏将会在此基础上做出进一步拓展学习。那么首先我们要学会下载并阅读别人的代码。常用的两个应用商店一个是ROS的官方应用商店ROS index,另一个就是我们熟知的gi…

11---数字温度 OR 湿度传感器电路设计

视频链接 数字温度or湿度传感器电路设计02_哔哩哔哩_bilibili 数字温度 OR 湿度传感器电路设计 1、温湿度传感器 DHT11 DHT11是一款有已校准数字信号输出的温湿度传感器。 其精度湿度-5%RH, 温度-2℃,量程湿度20-90%RH, 温度0~50℃。 D…

MySQL临时表创建出错(OS errno 13 - Permission denied)

一个客户向我抱怨:在MySQL查询小表没有问题,查询大表出错,下面是他发给我的出错的部分截屏(客户的表名被我隐藏了)。 这里的给出的信息已经比较明显了,是向/tmp目录中创建临时表失败(临时表的路…

【嵌入式——QT】Splash与登录窗口

一般的大型应用程序在启动时会显示一个启动画面,即Splash窗口,Splash窗口是一个无边对话框,一般显示一个图片,展示软件信息,Splash窗口显示时,程序在后台做一些比较耗时的启动准备工作,Splash窗…

Websocket在Asp.net webApi(.net framework)上的应用

之前在写看板部分的web api的时候,都是通过Ajax在规定时间内轮询调用web api,这样简单省事,但是当看板多了(并发量上来)以后,比较消耗服务器的性能,所以最近研究了websocket,希望使用…

【CSS面试题】外边距折叠的原因和解决

参考文章 什么时候出现外边距塌陷 外边距塌陷,也叫外边距折叠,在普通文档流中,在垂直方向上的2个或多个相邻的块级元素(父子或者兄弟)外边距合并成一个外边距的现象,不过只有上下外边距才会有塌陷&#x…

每日一题——LeetCode1668.最大重复字符串

方法一 includes()repeat()秒了 使用repeat()将word重复i次&#xff0c;看是否包含于sequence中&#xff0c;将最大的i赋值给k var maxRepeating function(sequence, word) {let k0for(let i1;i*word.length<sequence.length;i){if(sequence.includes(word.repeat(i))){k…

Python从0到100(三):Python中的变量介绍

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

CleanMyMac X4.15具有哪些功能和特点?

CleanMyMac X具有许多其他功能和特点&#xff0c;以下是一些主要亮点&#xff1a; 系统清理&#xff1a;它能够深入扫描macOS系统&#xff0c;识别并清除各种垃圾文件&#xff0c;如缓存、日志、无用的语言文件等。这不仅有助于释放硬盘空间&#xff0c;还可以提高系统的整体性…

基于51单片机超声波测距

目录 摘 要 2 ABSTRACT 3 目 录 4 1 绪论 1 1 概述 12 国内外发展现状 1 2 系统总体方案设计 21 设计要求 2 1&#xff09;可进行距离测量。 2 2&#xff09; 采用数码管显示距离数据。 2 3&#xff09; 可按键设置距离门限值 2 4&#xff09; 具有报警功能 22 方案选择 2 1 …

Python开源项目周排行 2024年第5周

Python 趋势周报&#xff0c;按周浏览往期 GitHub,Gitee 等最热门的Python开源项目&#xff0c;入选的项目主要参考GitHub Trending,部分参考了Gitee和其他。排名不分先后&#xff0c;都是当周相对热门的项目。 入选公式&#xff1d;70%GitHub Trending20%Gitee10%其他 关注微…

杠杆和保证金关系,很简单,众汇一个表格解决

很多投资者都能一眼就可以理清杠杆和保证金的关系&#xff0c;但是众汇外汇也看到很多交易届的新手&#xff0c;有时还浪费精力在杠杆和保证金的关系上&#xff0c;白白损失了许多盈利的机会&#xff0c;其实很简单&#xff0c;今天众汇就一个表格解决这个问题。 在使用表格之…