PCI 设备 RTX 驱动开发方法 -5565反射内存
PCI 设备 RTX 驱动开发方法
RTX 下操作外设时, 需要把设备从 Windows 移动到 RTX 下面,
具体移植方法可以参考 RTX Help 文档中间 Converting a Windows Device to an RTX Device 一节或者参考附件<<串口设备移植向导.doc>>
PCI驱动程序的特点
在设计驱动程序之前,首先要对欲控制的硬件设备进行细致地分析,更需要详细了解硬件设备的特性。硬件设备的特性会对驱动程序设计产生重大的影响。需要了解的最主要的硬件特性包括: (1) 设备的总线结构 设备采用什么总线结构非常关键,因为不同的总线类型(如ISA和PCI)在许多硬件工作机制上是不同的,所以驱动程序设计也不同。 (2) 寄存器 要了解设置的控制寄存器、数据寄存器和状态寄存器,以及这些寄存器工作的特性。 (3) 设备错误和状态 要了解如何判断设备的状态和错误信号,这些信号要通过驱动程序返回给用户。 (4) 中断行为 要了解设备产生中断的条件和使用中断的数量。 (5) 数据传输机制 最常见的数据传输机制是通过I/O端口(port),也就是通过CPU进行数据读写。PC的另一种重要的传输机制是DMA,但PCI规范不包括从属DMA的说明。 (6) 设备内存 许多设备自身带有内存,PCI设备大多是采用映射的方式映射到PC系统的物理内存。有的设备还要通过驱动程序设置设备的接口寄存器
RTX 驱动整体架构
使用 RTX Device Driver 开发向导, 选择支持 (1) Interrupt Service Routine (ISR) (2) Support for Sharing an Interrupt (3) Basic Port I/O Support (4) Basic Mapped Memory Support, 即可生成 RTX PCI 设备驱动程序框架。 该程序框架分成两个函数, Driver 文件和 DriverFunc 文件: Driver 文件主要包括 main 函数,中断服务程序和中断服务线程; DriverFunc 文件主要是对 PCI 设备的基本操作函数, 包括 PCI 设备搜索, PCI 设备初始化,使能或关闭中断, 处理 PCI 设备共享中断, 以及 PCI 驱动程序资源清理等函数。
完整的 RTX PCI驱动
基于RTX PCI 设备驱动程序框架, 用户需要添加相应的代码, 下面基于反射内存卡的 RTX 驱动进行分析。 反射内存卡的基本特点: (1) PCI、PCIe、PMC、VME 外形, 节点之间组成环形连接或通过光纤 Hub 组成星型连接 (2) 节点之间数据确定性的传输延迟, 延迟小于 750us PCI 反射内存卡的 RTX 驱动也分成 Driver 文件和DriverFunc 文件两个文件。Driver 文件主要包括 main 函数,中断服务程序和中断服务线程, 下面是详细的分析: (1) Main 函数: Main 函数并不是 RTX PCI 驱动程序的一部分, 准确的讲它是如何使用 RTX PCI驱动程序的流程。用户需要做的工作: a. 在 RTX PCI 设备驱动程序框架生成的 main 函数需要在设备初始化 (DeviceInit()) 完成之后与使能 PCI 中断之前添加设备打开(open())函数, 该函数的功能主要是创建信号量和初始化板卡. b. 使能 PCI 中断之后, 用户即可调用 PCI驱动程序里的读写等函数写一段简单的读写测试程序。 (2) 中断服务程序: 这个函数接收到中断后交给中断服务线程来处理, 用户一般不需要改动。 (3) 中断服务线程: 中断服务线程主要完成读取和记录 PCI 板卡的中断信息, 释放相关的信号量等工作, 一般不完成具体的中断处理工作。PCI 驱动程序一般还提供一个函数来捕捉这些释放的信号量, 完成中断具体含义的解析工作。 DriverFunc 文件主要是对 PCI 设备的基本操作函数, 包括 PCI 设备搜索, PCI 设备初始化,使能或关闭中断, 处理 PCI 设备共享中断, 以及 PCI 驱动程序资源清理, 数据读写, 发送和接收消息类中断等函数。下面是详细的分析: (1) DeviceSearch 函数 这个函数根据 PCI 设备的 Vendor ID 和 Device ID 搜索 PCI 设备, 返回 PCI 配置信息和 slot Number. 用户修改 Vendor ID 和 Device ID 即可。 (2) DeviceInit 函数 PCI设备初始化函数. 该函数中间调用了两个RTX 系统函数RtTranslateBusAddress() 和 RtMapMemory(), RtTranslateBusAddress() 作用为把 PCI 设备地址转换为 CPU 可以直接访问的物理地址, RtMapMemory() 函数把物理地址映射到虚拟地址。映射到虚拟地址空间后 ring3用户即可以读写 PCI 内存空间或者 I/O 空间了。用户需要关注的是物理地址到虚拟地址映射的地址范围,一般设置为 4K Bytes. RtMapMemory() 函数默认最大可以映射的地址范围为 64M Bytes, 如果需要更大的范围, 可以参考内存管理一节。 (3) Enable/Disable Interrupts On Chip 函数 使能或者关闭 PCI 设备上的中断。用户根据 PCI 设备进行修改。 (4) IsMyInterrupt函数 RTX 下 PCI 设备中断号可以共享。如果有 RTX 下 PCI 设备共享, 需要在该函数中间区分是否是该设备的中断. (5) DeviceCleanup 函数 该函数释放中断句柄和解除物理地址于虚拟地址之间的映射。用户基本不需要修改该函数。 (6) RFM2gOpen 函数 反射内存功能函数。该函数的功能主要是为 DMA 通道,发送和接收Event(反射内存的一种消息类中断)等硬件功能模块创建信号量和初始化板卡。为了防止对硬件资源的访问冲突, 使用这些硬件资源前需要先拿到信号量, 使用结束后释放这些信号量。 (7) RFM2gEnableEvent函数 反射内存功能函数。使能板卡接收消息类中断。 (8) RFM2gSendEvent 函数 反射内存功能函数。向其它节点发送消息类中断。 (9) RFM2gWaitForEvent函数 反射内存
PCI 设备 RTX 驱动开发方法 -5565反射内存的更多相关文章
- 《Windows内核安全与驱动开发》 3.2 内存与链表
<Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发> 3.2 内存与链表 1. 尝试生成一个链表头并将其初始化. 2. 尝试向内存 ...
- 转: 嵌入式linux下usb驱动开发方法--看完少走弯路【转】
转自:http://blog.csdn.net/jimmy_1986/article/details/5838297 嵌入式linux下的usb属于所有驱动中相当复杂的一个子系统,要想将她彻底征服,至 ...
- Linux驱动开发常用调试工具---之内存读写工具devmem和devkmem【转】
转自:https://blog.csdn.net/gatieme/article/details/50964903 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原 ...
- [Windows驱动开发](四)内存管理
一.内存管理概念 1. 物理内存概念(Physical Memory Address) PC上有三条总线,分别是数据总线.地址总线和控制总线.32位CPU的寻址能力为4GB(2的32次方)个字 ...
- Linux驱动开发7——I/O内存分配
CPU通过物理地址访问DDR和外设,DDR内存称为物理内存地址空间,外设寄存器组称为I/O内存地址空间. ARM采用统一编址,而X86采用独立编制.上一章介绍了DDR内存分配,这一章介绍I/O内存分配 ...
- 【VS开发】【DSP开发】浅谈Linux PCI设备驱动(一)
要弄清楚Linux PCI设备驱动,首先要明白,所谓的Linux PCI设备驱动实际包括Linux PCI设备驱动和设备本身驱动两部分.不知道读者理不理解这句话,本人觉得这句话很重要,对于PCI.US ...
- 利用WinDriver开发PCI设备驱动程序
摘要 WinDriver是Jungo公司出版的一个设备驱动程序开发组件,它可以大大加速PCI设备驱动程序的开发.作者在实际的项目中采用了WinDriver来开发设备驱动程序,取得了相当好的运行效果.从 ...
- 【DPDK】谈谈DPDK如何实现bypass内核的原理 其一 PCI设备与UIO驱动
[前言] 随着网络的高速发展,对网络的性能要求也越来越高,DPDK框架是目前的一种加速网络IO的解决方案之一,也是最为流行的一套方案.DPDK通过bypass内核协议栈与内核驱动,将驱动的工作从内核态 ...
- 2019.05.08 《Linux驱动开发入门与实战》
第六章:字符设备 申请设备号---注册设备 1.字符设备的框架: 2.结构体,struct cdev: 3.字符设备的组成: 4.例子: 5.申请和释放设备号: 设备号和设备节点是什么关系.? 设备驱 ...
- HarmonyOS USB DDK助你轻松实现USB驱动开发
HDF(Hardware Driver Foundation)驱动框架是HarmonyOS硬件生态开放的基础,为开发者提供了驱动加载.驱动服务管理和驱动消息机制等驱动能力,让开发者能精准且高效地开发驱 ...
随机推荐
- 树莓派CM4(一): 镜像烧录
1. 简介 树莓派型号Raspberry Pi CM4 EMMC, 注意是EMMC版本,不是SD卡版本 核心板资源 IO板使用官方IO板Compute module 4 IO Board, 硬件规格 ...
- wiz 为知笔记服务器 docker 跨服务器迁移爬坑指北
本文主要是介绍 wiz 为知笔记服务器 docker 从旧服务器迁移到新服务器的步骤以及问题排查. 旧服务器升级 wiz docker 目的:保持和新服务器拉取的镜像版本一致. 官方只留了 wiz d ...
- MacTeX 使用
MacTeX 是一个 TeX Live 的 macOS 定制版本.它包括: TeX Live GUI 应用程序 Ghostscript 关于 MacTeX 的介绍可以查看 MacTex 主页 安装 b ...
- 【Git代码仓库】之合并分支代码操作到主干代码上(界面版/命令版)
一.代码管理仓库,合并分支代码到主干(界面版*) 1.从远程Git代码仓库克隆到本地 # Git克隆 git clone git@e.coding.net:XXX/SQM/SC_WEB_Project ...
- IDEA 忽然无法打开某个特定文件
背景:IDEA中双击打开一个.py文件时,弹出一个文件类型的弹窗(没注意是什么,估计是不小心按到了什么快捷键),当时随便选的Text,结果不知道为什么,这个文件无法在IDEA中打开(之前都正常) 由于 ...
- java基础 -线程(基础)的 笔记
581,多线程机制 因为需要敌人的坦克可以自由移动并发射子弹,我们的坦克可以移动并发射子弹,这些要用到线程的知识. 根据JConsole监控线程执行情况,发现,主线程执行完了,子线程还没有执行完,并不 ...
- ChatGPT正式登陆iOS平台
6天前,ChatGPT在美区App Store中上架了官方App,累计下载量已经突破 50 万次,OpenAI 的 ChatGPT 应用在上架之后,其热度远超必应聊天等聊天机器人,以及其它使用 GPT ...
- Qml 实现水波进度动画条
[写在前面] 最近看到一个非常有趣的动画效果:水波进度动画. 学习了一下实现思路,觉得很有意思. 不过原版是 HTML + CSS,我这里用的是 Qml,有一些小技巧,分享给大家~ [正文开始] 老样 ...
- c# 8.0
1. nullable string 从前 string 一定是 nullable. 现在则不一定 string? name = null; 要加 ? 才可以表示 nullable 限制泛型不能 n ...
- IOI2000 邮局 加强版 题解
[IOI2000] 邮局 加强版 题解 考虑动态规划,设 \(f_{i,j}\) 为经过了 \(i\) 个村庄,正在建第 \(j\) 个邮局的最优距离. 以及 \(w_{i,j}\) 表示区间 \( ...