Linux下PCI字符设备驱动程序数据传输机制的研究

合集下载

Linux 系统下基于PCI 控制器(PLX9054)的DMA 编程

Linux 系统下基于PCI 控制器(PLX9054)的DMA 编程
在 x86 平台下,Linux 2.4 内核将 BIOS 检测到的所有 PCI 设备的相关信息-包括 PCI 配置信息-都存储在 pci_dev 结构中,并 链接到 pci_devices 链表中了。因此配置信 息是在 PCI 设备初始化阶段直接获取的。
建立 DMA 操作环境的工作包括:PCI 设 备检测和初始化、DMA 缓冲区分配和中断处
关 键 词 : Linux; PCI; DMA; 驱 动 程 序 ;
PLX9054;
Abstract: DMA is a way to quickly
transport large amount of data. DMA communication highly depends on operating system and certain hardware. This paper discusses the major problem and solution of DMA programming in Linux operating system. At the same time, an example is given to show how to design DMA communication with PLX9054-PCI controller.
PLX9054 是 PLX 公司生产的 PCI 总线接 口控制器芯片。PLX9054 符合 PCIV2.2 规范, 32 位,工作频率为 33MHz,拥有两个独立的 DMA 通道,传输速度达 132MB/s。PLX9054 提供了 PCI 总线、EEPROM、LOCAL 总线三个 接口,其中 LOCAL 总线有三种工作模式:M 模式、C 模式和 J 模式。在实际的数据采集 时, LOCAL 总线接口一般设置为 C 模式。 PLX9054 芯片在 PCI 总线和 LOCAL 总线之间 有三种直接的数据传输模式:PCI Initiator 模式--LOCAL 总线主设备通过 PLX9054 访问 PCI 总线存储空间和 I/O 空间;PCI Target 模式--PCI 总线主设备通过 PLX9054 访问 LOCAL 总线存储空间和 I/O 空间;DMA 方式 --PLX9054 作为两总线的主设备,实现 PCI 总线存储空间与 LOCAL 总线存储空间之间的 数据传输。

PCI设备驱动

PCI设备驱动

PCI设备驱动1.PCI设备驱动一一、PCI简介PCI是一种外设总线规范。

我们先来看一下什么是总线:总线是一种传输信号的路径或信道。

典型情况是,总线是连接于一个或多个导体的电气连线,总线上连接的所有设备可在同一时间收到所有的传输内容。

总线由电气接口和编程接口组成。

本文讨论Linux 下的设备驱动,所以,重点关注编程接口。

PCI是Peripheral Component Interconnect(外围设备互联)的简称,是普遍使用在桌面及更大型的计算机上的外设总线。

PCI架构被设计为ISA标准的替代品,它有三个主要目标:获得在计算机和外设之间传输数据时更好的性能;尽可能的平台无关;简化往系统中添加和删除外设的工作。

二、PCI寻址从现在开始,我想尽可能通过一些实际的例子来说明问题,而减少理论方面的问题的描述,因为,相关的理论的东西,可以在其它地方找到。

我们先来看一个例子,我的电脑装有1G的RAM,1G以后的物理内存地址空间都是外部设备IO在系统内存地址空间上的映射。

/proc/iomem描述了系统中所有的设备I/O在内存地址空间上的映射。

我们来看地址从1G开始的第一个设备在/proc/iomem中是如何描述的:40000000-400003ff : 0000:00:1f.1这是一个PCI设备,40000000-400003ff是它所映射的内存地址空间,占据了内存地址空间的1024 bytes的位置,而0000:00:1f.1则是一个PCI外设的地址,它以冒号和逗号分隔为4个部分,第一个16位表示域,第二个8位表示一个总线编号,第三个5位表示一个设备号,最后是3位,表示功能号。

因为PCI规范允许单个系统拥有高达256个总线,所以总线编号是8位。

但对于大型系统而言,这是不够的,所以,引入了域的概念,每个PCI域可以拥有最多256个总线,每个总线上可支持32个设备,所以设备号是5位,而每个设备上最多可有8种功能,所以功能号是3位。

linux 开发板之间数据传输方式

linux 开发板之间数据传输方式

linux 开发板之间数据传输方式
Linux开发板之间的数据传输方式有多种,以下是一些常见的方式:1.网络传输:通过网线或Wi-Fi连接,使用TCP/IP协议栈进行数据传
输。

这种方式适合大量数据的快速传输,但需要稳定的网络环境。

2.串口传输:通过串口连接,使用串口通信协议(如RS-232、RS-485
等)进行数据传输。

这种方式适合短距离、低速的数据传输,常用于设备之间的调试和通信。

B传输:通过USB接口连接,使用USB协议进行数据传输。

这种
方式速度较快,适用于大量数据的传输,但需要开发板支持USB接口。

4.SD卡/eMMC传输:将数据存储到SD卡或eMMC等存储介质中,
然后通过插槽或接口连接到另一块开发板进行数据传输。

这种方式适合大量数据的存储和传输,但需要开发板支持相应的存储接口。

5.I2C/SPI传输:通过I2C或SPI等总线协议进行数据传输。

这种方式
适用于短距离、低速的数据传输,常用于设备之间的通信和控制。

具体选择哪种传输方式,需要根据应用场景、传输距离、传输速率、设备接口等因素综合考虑。

一、如何编写LinuxPCI驱动程序

一、如何编写LinuxPCI驱动程序

⼀、如何编写LinuxPCI驱动程序PCI的世界是⼴阔的,充满了(⼤部分令⼈不快的)惊喜。

由于每个CPU体系结构实现不同的芯⽚集,并且PCI设备有不同的需求(“特性”),因此Linux内核中的PCI⽀持并不像⼈们希望的那么简单。

这篇简短的⽂章介绍⽤于PCI设备驱动程序的Linux APIs。

1.1 PCI驱动程序结构PCI驱动程序通过pci_register_driver()在系统中"发现"PCI设备。

事实上,恰恰相反。

当PCI通⽤代码发现⼀个新设备时,具有匹配“描述”的驱动程序将被通知。

详情如下。

pci_register_driver()将设备的⼤部分探测留给PCI层,并⽀持在线插⼊/删除设备[因此在单个驱动程序中⽀持热插拔PCI、CardBus和Express-Card]。

pci_register_driver()调⽤需要传⼊⼀个函数指针表,从⽽指⽰驱动程序的更⾼⼀级结构体。

⼀旦驱动程序知道了⼀个PCI设备并获得了所有权,驱动程序通常需要执⾏以下初始化:启⽤设备请求MMIO / IOP资源设置DMA掩码⼤⼩(⽤于⼀致性DMA和流式DMA)分配和初始化共享控制数据(pci_allocate_coherent())访问设备配置空间(如果需要)注册IRQ处理程序(request_irq())初始化non-PCI(即LAN/SCSI/等芯⽚部分)启⽤DMA /处理引擎当使⽤设备完成时,可能需要卸载模块,驱动程序需要采取以下步骤:禁⽌设备产⽣irq释放IRQ (free_irq())停⽌所有DMA活动释放DMA缓冲区(包括流式DMA和⼀致性DMA)从其他⼦系统注销(例如scsi或netdev)释放MMIO / IOP资源禁⽤该设备下⾯⼏节将介绍这些主题中的⼤部分。

其余部分请查看LDD3或<linux/pci.h>。

如果PCI⼦系统没有配置(没有设置CONFIG_PCI),下⾯描述的⼤多数PCI函数都被定义为内联函数,要么完全空,要么只是返回⼀个适当的错误代码,以避免在驱动程序中出现⼤量ifdefs。

Linux下PCI设备驱动开发详解

Linux下PCI设备驱动开发详解

一、设备驱动程序概述自Linux在中国发展以来,得到了许多公司的青睐。

在国内的玩家也越来越多了,但目前还是停留在玩的水平上,很少有玩家对Linux的系统进行研究。

因为它的开放,我们可以随时拿来“把玩”。

这也是Linux一个无可比拟的优势,这样我们可以修改后再加入到里面。

但很少有专门的书籍讲到Linux驱动程序的开发,像上海这样的大城市也很少有讲Linux驱动开发的资料,唉,谁让这个是人家的东西呢,我们还是得跟着人家跑。

我现在讲的这些驱动开发的细节,并不特定哪个版本的内核,这只是大体的思路与步骤。

因为大家都知道Linux 2.6.x 与Linux 2.4.x是有不少改动的。

所以,具体的大家可以去参考Linux Device Driver 2.4 和Linux Device Driver 2.6这几本书。

这是我们学习开发驱动必不可少的东西。

好了,下面就开始学习吧。

根据设备的行为,我们可以把设备分为字符设备和块设备,还有网络设备。

字符设备是以字节为单位进行顺序读写,数据缓冲系统对它们的访问不提供缓存。

而块设备则是允许随机访问与读写,每次读写的数据量都是数据块长度的整数倍,并且访问还会经过缓冲区缓存系统才能实现。

与Unix版本不同的是:Linux的内核允许不是数据块长度整数倍的数据量被读取,用官方的语言就是:但这种不同只是纯粹学术方面的东西。

大多数设备驱动程序都要通过文件系统来进行访问的,但网络设备是不同的。

/dev子目录里都是关于设备的特殊文件,但看起来它们与普通的目录没有什么两样。

如下:$ ls -l /dev...brw-rw--- 1 root disk 22, 1 May 5 1998 hdc1crw-rw--- 1 root daemon 6 0 May 5 1998 lp0与普通文件有所不同是开头的“C” 和“B”,即char 和block的意思,即字符设备和块设备。

再后面的“22,1” 和“6,0”即设备的主设备号和次设备号,主设备号表明它是哪一种设备,这与你在Windows里添加硬件时看到的那些是一个意思。

Linux之PCIE三种空间解析

Linux之PCIE三种空间解析

Linux之PCIE三种空间解析一、PCIE概述总结PCI Express,是计算机总线PCI的一种,它沿用现有的PCI编程概念及通信标准,但建基于更快的串行通信系统。

PCIE总线使用的是高速差分总线,并采用端到端的连接方式,现在的高速总线基本上都是串行总线,这样可以使用更高的时钟频率。

当前pcie协议支持到5.0版本,不同PCIe版本对应的传输速率如下:二、pcie总线的拓扑结构PCIe采用的是树形拓扑结构,它的体系架构一般由root complex,switch,endpoint等类型的PCIe设备组成root complex: 根桥设备,是PCIe最重要的一个组成部件; root complex主要负责PCIe报文的解析和生成。

RC接受来自CPU的IO 指令,生成对应的PCIe报文,或者接受来自设备的PCIe TLP报文,解析数据传输给CPU或者内存。

switch: PCIe的转接器设备,目的是扩展PCIe总线。

和PCI并行总线不同,PCIe的总线采用了高速差分总线,并采用端到端的连接方式, 因此在每一条PCIe链路中两端只能各连接一个设备,如果需要挂载更多的PCIe设备,那就需要用到switch转接器。

switch在linux下不可见,软件层面可以看到的是switch的上行口(upstream port,靠近RC的那一侧)和下行口(downstream port)。

一般而言,一个switch 只有一个upstream port,可以有多个downstream port.PCIe endponit: PCIe终端设备,是PCIe树形结构的叶子节点。

比如网卡,NVME卡,显卡都是PCIe ep设备。

lspci -tv命令可以显示pcie的总线拓扑,如上图所示,一个PCIe 设备的ID由以下几个部分组成:以0000:00:00.0为例,分别对应PCI 域,总线号,设备号,功能号。

1.PCI域:PCI域ID,目的是为了突破pcie256条总线的限制。

基于pci-e总线的加密网卡驱动及应用程序设计

基于pci-e总线的加密网卡驱动及应用程序设计

AbstractWith the rapid development of Internet technology, the security issues of network information become acute increasingly. Network information security should be a height priority to protect people's livelihood, national security in this era of global Internet.A hardware encryption network card is designed to keep network information security. To ensure network information security, the user data was encrypted and then transmitted through the public Internet. The driver and application of encryption network card in the Linux system was discussed in this paper.This program is based on Ubuntu16.04 system, Linux4.4 kernel. The application is based on Qt. This paper introduces the knowledge about Linux driver, TCP/IP protocol, PCI-e and DMA first, as well as the hardware structure of the encryption card. And then discuss the study of the encryption network card application system, focusing on the design of encryption card driver and the application. Int the end of the paper, the test of the driver and the application will be talked about.Encryption card is a low-cost efficient solutions to keep network information security. Developping drivers and applications base on the Linux system conform to the the ideological line to develop domestic operating system based on the Linux kernel under the background of vigorously developping domestic operating system, and conducive to the promotion of Linux system. When the domestic operating system matures and promote the use, it is easy to transplant the program into the domestic operating system.Keywords: encryption network card; Linux; driver; application; PCI-e;DMA目 录中文摘要 (I)Abstract ............................................................................................................................. I I 第1章绪论 . (1)1.1 课题研究的背景 (1)1.2 课题研究的意义 (2)1.3 国内外研究现状 (3)1.4 论文的内容及组织结构 (4)第2章基础知识 (6)2.1 Linux驱动程序概述 (6)2.1.1 Linux驱动程序的分类 (6)2.1.2 Linux设备驱动的模块化 (7)2.2 TCP/IP协议介绍 (7)2.2.1 以太网数据封装 (7)2.2.2 以太网首部 (8)2.2.3 IP协议首部 (9)2.2.4 UDP协议首部 (10)2.2.5 TCP协议首部 (10)2.3 PCI-e/PCI总线 (11)2.3.1 PCI/PCI-e设备的初始化过程 (12)2.3.2 PCI-e总线配置空间 (14)2.3.3 PCI-e的MSI中断 (17)2.4 PCI/PCI-e设备DMA传输分析 (18)2.5 加密网卡硬件结构介绍 (19)2.5.1 加密网卡总体结构介绍 (19)2.5.2 FPGA数据接收发送链路结构介绍 (21)2.6 本章小结 (21)第3章加密网卡应用系统设计 (22)3.1 系统总体结构设计 (22)3.2 驱动程序结构设计 (23)3.2.1 驱动程序功能模块设计 (23)3.2.2 数据加密设计 (24)3.3 应用程序结构设计 (25)3.3.1 应用程序server端设计 (25)3.3.2 应用程序client端设计 (26)3.3.3 应用层数据封包格式设计 (28)3.4 本章小结 (28)第4章驱动程序设计 (29)4.1 驱动程序加载和卸载 (29)4.1.1 PCI-e驱动程序和设备的匹配 (29)4.1.2 PCI-e驱动程序的加载和卸载 (30)4.1.3 设备初始化和关闭 (31)4.2 Linux下的DMA编程 (34)4.2.1 DMA地址掩码 (35)4.2.2 DMA地址映射 (36)4.3网络设备的注册和初始化 (38)4.3.1 网络设备的注册和移除 (38)4.3.2 网络设备初始化流程 (39)4.4 网络设备的打开和关闭 (41)4.5 网络设备中断处理设计 (43)4.6 网络数据的接收和发送 (44)4.6.1 struct sk_buff结构体 (44)4.6.2 数据发送流程 (46)4.6.3 数据接收流程 (50)4.7 物理链路连接状态检测 (52)4.8 字符设备程序设计 (54)4.8.1 字符设备注册 (55)4.8.2 字符设备操作方法设计 (56)4.9 本章小结 (58)第5章应用程序设计 (59)5.1 视频及文件传输程序设计 (59)5.1.1 应用层协议设计 (59)5.1.2 client端与server端连接的建立流程 (62)5.1.3 视频码流处理框架设计 (63)5.1.4 环形缓冲区的设计 (64)5.1.5 视频传输流程设计 (68)5.1.6 文件传输流程设计 (69)5.2 秘钥管理程序设计 (70)5.3 系统测试 (71)5.3.1 网卡传输速率测试 (71)5.3.2 数据加密传输测试 (74)5.4 本章小结 (76)结论 (77)参考文献 (78)致谢 (84)攻读硕士学位期间发表的学术论文 (85)独创性声明 (86)第1章绪论1.1 课题研究的背景进入21世纪以来,互联网技术得到了长足的发展和进步。

Linux下PCI设备流式DMA驱动开发

Linux下PCI设备流式DMA驱动开发

1 前

Lu i x内核与外部设备之 间的接 口。在 L u n i x操作 n 系统下有三类主要的设备文件类型 , 字符设备 , 块设 备和网络设备 。在 L u 系统 中, ix n 对于设 备文件 和 普通文 件 的访 问都 是通 过其 IO子 系统 向 内核 中的 / 其他部分提供统一 的标准设 备接 口——包含在 i n . e d/iu/sh中 的 数 据 结 构 fe oe tn 来 完 l el xf. u n i — pr i s l ao 成的:
发复杂。通过对 v 2 1 C 实验板 L u 驱动程序 w 00 I P ix n 的分析 , 介绍 了 Lnx下 P I 动 的框 架 结 构 , iu C驱 并且 重 点分析 了编 程接 口和 一种 先 进 的 流媒 体 D A实 M
现机制 。
} ቤተ መጻሕፍቲ ባይዱ

这个结构的每一个成员 的名字都对应着一个系 统调用 , 系统调用通过设备文件的主设备号找到相 应的设备驱动程序 , 然后读取 这个数据结构相应的 函数指针 , 接着 把控制权 交给该 函数。这是 L u ix n
e p cal he i lme tto fo i d o h  ̄e m s e i l t mp e n ai n o ne k n ft e s a DMA. y Ke r s: nu Vw2 0; iv r PCI DMA y wo d Li x; 01 Dr e ; ;
摘 要 : 在简要介绍了 L u 和具有 M E 1 一 , 4 ix n P G一 , 2 一 硬件编解码功能的 v 2 1 w 00芯片后, 分 析了 v2 1 w 00芯片的 P I i x C n 驱动程序, Lu 然后从驱动程序开发 的角度讨论 了在24 X内核版本下 .. PI C 驱动程序的结构框架和 内核驱动程序编程接 口, 较为详细的分析 了一种流媒体 D A的实现方 M
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档