1. RTX 下操作外設時, 需要把設備從 Windows 移動到 RTX 下面, 具體移植方法可以參考 RTX Help 文檔中間Converting a Windows Device to an RTX Device 一節或者參考附件<<串口設備移植向導.doc>> 2. PCI驅動程序的特點 在設計驅動程序之前,首先要對欲控制的硬件設備進行細致地分析,更需要詳細了解硬件設備的特性。硬件設備的特性會對驅動程序設計產生重大的影響。需要了解的最主要的硬件特性包括: (1) 設備的總線結構 設備采用什么總線結構非常關鍵,因為不同的總線類型(如ISA和PCI)在許多硬件工作機制上是不同的,所以驅動程序設計也不同。 (2) 寄存器 要了解設置的控制寄存器、數據寄存器和狀態寄存器,以及這些寄存器工作的特性。 (3) 設備錯誤和狀態 要了解如何判斷設備的狀態和錯誤信號,這些信號要通過驅動程序返回給用戶。 (4) 中斷行為 要了解設備產生中斷的條件和使用中斷的數量。 (5) 數據傳輸機制 最常見的數據傳輸機制是通過I/O端口(port),也就是通過CPU進行數據讀寫。PC的另一種重要的傳輸機制是DMA,但PCI規范不包括從屬DMA的說明。 (6) 設備內存 許多設備自身帶有內存,PCI設備大多是采用映射的方式映射到PC系統的物理內存。有的設備還要通過驅動程序設置設備的接口寄存器 3. 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 驅動程序資源清理等函數。 4. 完整的 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 空間了。用戶需要關注的是物理地址到虛擬地址映射的地址范圍,一般設置為 4KBytes. 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函數 反射內存 |