基于PC104(Plus)總線的數據接收存儲顯示系統設計
2.3 工控機顯示存儲模塊設計
本系統利用PLX9054和Linux的DMA技術來實現大量數據的高速傳輸,同時使用Qt/Ernbedded進行人機界面設計和Framebuffer的幀緩沖顯示,以對視頻數據進行存儲和顯示控制。整個軟件的功能圖如圖5所示。本文引用地址:http://www.104case.com/article/202466.htm
PLX9054的PCI設備驅動是DMA傳輸的關鍵,驅動程序利用PLX9054芯片的DMA功能可將FPGA控制模塊中的數據快速傳輸到Linux操作系統的內核內存中。要實現對PLX9054的DMA操作并設置DMA控制寄存器,設備驅動程序需要做兩件事:一是檢測PCI設備并初始化:二是建立DMA操作環境。在Linux2.6內核中,PCI設備檢測和初始化可通過專門的注冊函數pci_regis-ter-driver來實現。內核根據pci_device_id結構中的預設ID來對pci_devices鏈表進行搜索,一旦找到目標PCI設備,pci_register_driver函數將調用設備探測函數(probe)并向該函數傳遞該設備的pci_dev變量,然后由設備探測函數完成對設備的初始化。建立DMA操作環境的工作包括DMA緩沖區的分配和中斷處理。本系統使用流式DMA映射(dma_map_single())來申請適當大小的DMA緩沖區。當一個緩沖區被流式映射后,只有將其unmap除掉以后,驅動程序才能安全地訪問里面的數據內容,并通過request_irq函數實現中斷處理程序的注冊。這里有兩個問題需要注意:一是PCI設備注冊中斷時,必須使用共享中斷方式,并應在中斷處理程序中增加對中斷源的檢查;二是PLX9054的中斷信號一旦產生就一直有效,它必須通過代碼清除中斷。
本系統采用Qt/Embedded(4.5)進行GUI設計,以便為系統用戶提供一個高性能、高可靠的GUl支持。Qt/Embedded是著名的Qt庫開發商Trolltech公司開發的、面向嵌入式系統的Qt版本,許多基于Qt的X Window程序都可以非常方便地移植到Qt/Embedded上,而且與X11版本的Qt在最大程度上接口兼容,因而延續了在XWindow上的強大功能,并在底層徹底摒棄了X lib,而僅采用Framebuffer作為底層圖形接口。同時,使用Qt的多線程設計則使人機交互、視頻顯示和數據存儲能夠同時進行。
本系統采用Framebuffer幀緩沖技術來實現視頻數據的快速顯示。Framebuffer機制模仿的是顯卡的功能,它將顯卡硬件結構抽象掉,可通過Framebuffer的讀寫直接對顯存進行操作。內核編譯時可選上對Framebuffer的支持。進入Framebuffer可以在系統啟動時向內核傳送vga= modenumber的參數來激活Framebuffer設備(如:vga=791)。Framebuffer的設備文件一般是/dev/fb0、/dev/fb1等。
在應用程序中,一般可將Framebuffer設備映射到進程地址空間的方式使用,比如利用下面的程序就可以打開/dev/fb0設備,并通過mmap系統調用進行地址映射,隨后用memset將屏幕清空(這里假設顯示模式是1024x768-32位色模式和線性內存模式):
在子函數initFb中,對映射過的內存地址(即顯存)再進行分行映射,即把原來的一維線性地址轉換為二維線性空間,這樣,映射后的fbp[x][y]就可以在屏幕上表示水平位置為y、垂直位置為x的像素。
利用該映射能夠對顯示區域中的某一行進行操作,也可以對顯示數據包的每一幀進行行分析,進而對每一行進行控制和顯示。這樣既可保證顯示的靈活性,又具有良好的顯示速度。
3 結束語
本文給出了一種基于FPGA控制邏輯的高速數據接收存儲顯示系統的硬件設計方案,同時詳細介紹了Linux系統下基于Qt/Embedded和Fr-amebuffer的工控機存儲顯示程序的實現方法。
評論