一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

在Linux環(huán)境下實(shí)現(xiàn)FPGA設(shè)備驅(qū)動(dòng)的設(shè)計(jì)

電子設(shè)計(jì) ? 來(lái)源:郭婷 ? 作者:電子設(shè)計(jì) ? 2019-07-02 08:01 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

引言

Intel公司推出的XScale采用ARM V5TE結(jié)構(gòu),是Strong ARM的升級(jí)換代產(chǎn)品。XScale PXA270處理器最高主頻可達(dá)到624M赫茲,加入了Wireless MMX、Intel SpeedStep等新技術(shù),以其高性能、低功耗、多功能等特點(diǎn)在信息家電、工業(yè)控制等領(lǐng)域得到了廣泛的應(yīng)用。在嵌入式控制中,“微處理器FPGA”是一種常用的解決方案,F(xiàn)PGA(現(xiàn)場(chǎng)可編程門陣列)有編程方便、集成度高、速度快等特點(diǎn),電子設(shè)計(jì)人員可以通過(guò)硬件編程的方法來(lái)實(shí)現(xiàn)FPGA芯片各種功能的開發(fā),在我們的一個(gè)數(shù)控平臺(tái)的研究項(xiàng)目中,采用XScale PXA270作為主CPU,并對(duì)其進(jìn)行FPGA擴(kuò)展,使其具有插補(bǔ)、電機(jī)驅(qū)動(dòng)、信號(hào)處理、I/O口擴(kuò)展的功能。Linux以其內(nèi)核精煉、高效、源代碼開放且免費(fèi)等優(yōu)勢(shì),嵌入式領(lǐng)域得到了廣泛的應(yīng)用。下面以Intel XScale PXA270上的Altera FLEX/ACEX的應(yīng)用為例,詳細(xì)介紹Linux下的FPGA設(shè)備驅(qū)動(dòng)的實(shí)現(xiàn)。

1 Altera FLEX/ACEX芯片結(jié)構(gòu)

Altera FLEX/ACEX芯片是基于查找表LUT(Look-Up-Table)原理而實(shí)現(xiàn)的,LUT本質(zhì)上就是一個(gè)RAM。目前FPGA中多使用4輸入的LUT,所以每個(gè)LUT可以看成一個(gè)有4位地址線的16×1的RAM。當(dāng)用戶通過(guò)原理圖或HDL語(yǔ)言描述一個(gè)邏輯電路以后,F(xiàn)PGA開發(fā)軟件會(huì)自動(dòng)計(jì)算邏輯電路的所有可能的結(jié)果,并把結(jié)果事先寫入RAM,這樣,每輸入一個(gè)信號(hào)進(jìn)行邏輯運(yùn)算都等于輸入一個(gè)地址進(jìn)行查表,找出地址對(duì)應(yīng)的內(nèi)容,然后輸出即可。

由于LUT主要適合SRAM工藝生產(chǎn),所以目前大部分FPGA都是基于SRAM工藝的,而SRAM工藝的芯片在掉電后信息就會(huì)丟失,一定要外加1片專用配置芯片(本實(shí)驗(yàn)電路使用Altera EPC2LC20),在上電時(shí),由這個(gè)專用配置芯片把數(shù)據(jù)加載到FPGA中然后FPGA即可正常工作。由于配置時(shí)間很短,因此不會(huì)影響系統(tǒng)正常工作,在使用ACEX1K50之前,應(yīng)對(duì)其進(jìn)行設(shè)計(jì)編程,實(shí)現(xiàn)相應(yīng)寄存器及I/O口的功能。有關(guān)FPGA的詳細(xì)內(nèi)容請(qǐng)參閱相關(guān)資料。

2 Intel XScale PXA270處理器的系統(tǒng)存儲(chǔ)器接口

PXA270處理器的可編程靜態(tài)存儲(chǔ)體系結(jié)構(gòu)如圖1所示。

在Linux環(huán)境下實(shí)現(xiàn)FPGA設(shè)備驅(qū)動(dòng)的設(shè)計(jì)

在系統(tǒng)上,ACEX1K50位于nCS<2>上,物理地址0x8000000-0x8001000共4K的靜態(tài)地址空間,圖2表示了Intel XScale PXA270與ACEX1K50的硬件連接關(guān)系。

在Linux環(huán)境下實(shí)現(xiàn)FPGA設(shè)備驅(qū)動(dòng)的設(shè)計(jì)

3 Linux下ACEX1K50設(shè)備驅(qū)動(dòng)的實(shí)現(xiàn)

3.1 Linux下設(shè)備驅(qū)動(dòng)基本原理

設(shè)備驅(qū)動(dòng)程序是應(yīng)用程序與硬件之間的一個(gè)中間軟件層,設(shè)備驅(qū)動(dòng)程序?yàn)閼?yīng)用程序屏蔽了硬件的細(xì)節(jié)。這樣在應(yīng)用程序看來(lái),硬件設(shè)備只是一個(gè)設(shè)備文件,應(yīng)用程序可以像操作普通文件一樣對(duì)應(yīng)用設(shè)備進(jìn)行操作,設(shè)備驅(qū)動(dòng)程序是內(nèi)核的一部分,它主要實(shí)現(xiàn)的功能有:對(duì)設(shè)備進(jìn)行初始化和釋放;把數(shù)據(jù)從內(nèi)核傳送到硬件和從硬件讀取數(shù)據(jù);讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù),回送應(yīng)用程序請(qǐng)求的數(shù)據(jù)以及檢測(cè)和處理設(shè)備出現(xiàn)的錯(cuò)誤。

Linux將設(shè)備分為最基本的兩大類:一類是字符設(shè)備;另一類是塊設(shè)備,字符設(shè)備和塊設(shè)備的主要區(qū)別在于是否使用了緩沖技術(shù),字符設(shè)備以單個(gè)字節(jié)為單位進(jìn)行順序讀/寫操作,通常不使用緩沖技術(shù),塊設(shè)備為了提高效率,利用一塊系統(tǒng)內(nèi)存作為讀/寫操作的緩沖區(qū),由于涉及緩沖區(qū)管理、調(diào)度和同步等問(wèn)題,實(shí)現(xiàn)起來(lái)比字符設(shè)備復(fù)雜得多。

Linux通過(guò)設(shè)備文件系統(tǒng)對(duì)設(shè)備進(jìn)行管理,各種設(shè)備都以文件的形式存放在/dev目錄下,稱為“設(shè)備文件”。應(yīng)用程序可以像普通文件一樣打開、關(guān)閉和讀/寫這些設(shè)備文件,為了管理這些設(shè)備,系統(tǒng)為設(shè)備編了號(hào),每個(gè)設(shè)備號(hào)又分為主設(shè)備號(hào)和次設(shè)備號(hào),主設(shè)備號(hào)用來(lái)區(qū)分不同種類的設(shè)備,而次設(shè)備號(hào)用來(lái)區(qū)分同一類型的多個(gè)設(shè)備,Linux為所有的設(shè)備文件都提供了統(tǒng)一的操作函數(shù)接口,方法是使用數(shù)據(jù)結(jié)構(gòu)struct FILE_operations,這個(gè)數(shù)據(jù)結(jié)構(gòu)中包括許多操作函數(shù)的指針,如open()、close()、read()和write()等,但由于外設(shè)的種類較多,操作方式各不相同,struct file_operations結(jié)構(gòu)體中的成員為一系列的接口函數(shù),如用于讀/寫的read/write函數(shù)和用于控制的ioct1等。打開一個(gè)文件就是調(diào)用這個(gè)文件file_operations中的open操作,不同類型的文件(如普通的磁盤數(shù)據(jù)文件)有不同的file_operations成員函數(shù),接口函數(shù)完成磁盤數(shù)據(jù)塊讀/寫操作,而對(duì)于各種設(shè)備文件,則最終調(diào)用各自驅(qū)動(dòng)程序中的I/O函數(shù)進(jìn)行具體設(shè)備的操作,這樣,應(yīng)用程序根本不必考慮操作的是設(shè)備還是普通文件,可一律當(dāng)做文件處理,具有非常清晰 、統(tǒng)一的I/O接口,所以file_operations是文件層次的I/O接口。

3.2 ACEX1K50在Linux下設(shè)備驅(qū)動(dòng)的實(shí)現(xiàn)

驅(qū)動(dòng)程序中使用內(nèi)存映射可以提供給用戶程序直接訪問(wèn)設(shè)備內(nèi)存的能力。使用內(nèi)存映射得好處是處理大文件時(shí)速度明顯快于標(biāo)準(zhǔn)文件I/O,無(wú)論讀/寫,都少了一次用戶空間與內(nèi)核空間之間的復(fù)制,在用戶空間對(duì)ACEX1K50 FPGA設(shè)備的訪問(wèn)是通過(guò)內(nèi)存映射來(lái)實(shí)現(xiàn)的。

ACEX1K50可以看作是硬件連接在PXA270微處理器的nCS<2>上的一段物理地址來(lái)尋址。因?yàn)橛刑摂M內(nèi)存管理單元,所以如果Linux下,必須先把物理地址映射到虛擬地址空間,然后才能對(duì)該段地址進(jìn)行讀/寫。

在內(nèi)核驅(qū)動(dòng)程序的初始化階段,通過(guò)ioremap()將ACEX1K50的這段物理地址映射到內(nèi)核虛擬空間;在驅(qū)動(dòng)程序的mmap系統(tǒng)調(diào)用中,使用remap_page_range()將該塊COM映射到用戶虛擬空間,這樣內(nèi)核空間和用戶空間都能訪問(wèn)ACEX1K50的這段被映射后的虛擬地址。

由于ACEX1K50位于nCS<2>上,參照PXA270靜態(tài)存儲(chǔ)體系結(jié)構(gòu)映射表,其物理起始地址為0x08000000。另外,其設(shè)備名稱及主次設(shè)備號(hào)定義如下:

在Linux環(huán)境下實(shí)現(xiàn)FPGA設(shè)備驅(qū)動(dòng)的設(shè)計(jì)

其中FPGA主設(shè)備號(hào)定義為零,使得操作系統(tǒng)可以隨機(jī)為該設(shè)備分配主設(shè)備號(hào)。

ioremap()的作為是把一個(gè)物理內(nèi)存地址點(diǎn)映射為一個(gè)內(nèi)核指針,被映射數(shù)據(jù)的長(zhǎng)度由size參數(shù)設(shè)定,該函數(shù)的實(shí)質(zhì)上把一塊物理區(qū)域二次映射到一個(gè)可以從驅(qū)動(dòng)程序里訪問(wèn)的虛擬地址上去,以下是該函數(shù)的定義:

void*ioremap(unsigned long phys_addr,unsigned long size);

設(shè)備驅(qū)動(dòng)通過(guò)fpga_init()函數(shù)初始化FPGA設(shè)備,最終通過(guò)init_module(fpga_init)在內(nèi)核啟動(dòng)時(shí)初始化FPGA設(shè)備。

fpga_init()函數(shù)的流程如圖3所示。

在Linux環(huán)境下實(shí)現(xiàn)FPGA設(shè)備驅(qū)動(dòng)的設(shè)計(jì)

ioremap()調(diào)用的語(yǔ)句如下:

pxa270_fpga_base=(unsigned long)ioremap(FPGA_PHY_START,SZ_4K);

可以通過(guò)ioremap()調(diào)用的返回值pxa270_fpga_base來(lái)判斷FPGA物理地址到內(nèi)核虛擬空間是否映射成功。

if(!pxa270_FPGA_base){

printk(“ioremap pxa270 fpga failed\n”);

return-EINVAL;

}

向設(shè)備文件系統(tǒng)注銷FPGA設(shè)備通過(guò)調(diào)用cheanup_module()函數(shù)來(lái)實(shí)現(xiàn)。其代碼如下:

在Linux環(huán)境下實(shí)現(xiàn)FPGA設(shè)備驅(qū)動(dòng)的設(shè)計(jì)

在向內(nèi)核設(shè)備文件系統(tǒng)注冊(cè)該FPGA驅(qū)動(dòng)后,還須實(shí)現(xiàn)設(shè)備驅(qū)動(dòng)的file_operations結(jié)構(gòu),ACEX1K50的設(shè)備驅(qū)動(dòng)定義了如下file_operations成員函數(shù):

在Linux環(huán)境下實(shí)現(xiàn)FPGA設(shè)備驅(qū)動(dòng)的設(shè)計(jì)

其中fpga_open和fpga_release系統(tǒng)調(diào)用的功能只簡(jiǎn)單地實(shí)現(xiàn)了FPGA設(shè)備使用計(jì)數(shù)器的遞增與遞減,fpga_ioctl系統(tǒng)調(diào)用也只是簡(jiǎn)單的打印一條沒有ioctl控制的信息提示。這里不再分析實(shí)現(xiàn)的具體代碼。下面具體分析fpga_mmap的實(shí)現(xiàn)過(guò)程:

在Linux環(huán)境下實(shí)現(xiàn)FPGA設(shè)備驅(qū)動(dòng)的設(shè)計(jì)

在Linux環(huán)境下實(shí)現(xiàn)FPGA設(shè)備驅(qū)動(dòng)的設(shè)計(jì)

4 ACEX1K50設(shè)備驅(qū)動(dòng)在用戶程序中的使用

當(dāng)設(shè)備驅(qū)動(dòng)實(shí)現(xiàn)后就可以在用戶空間使用該設(shè)備了。在用戶空間主要是通過(guò)調(diào)用mmap()函數(shù)來(lái)實(shí)現(xiàn)對(duì)FPGA設(shè)備的訪問(wèn)。以下是用戶空間應(yīng)用程序的一個(gè)示例:

在Linux環(huán)境下實(shí)現(xiàn)FPGA設(shè)備驅(qū)動(dòng)的設(shè)計(jì)

結(jié)語(yǔ)

本文通過(guò)介紹ACEX1K50在Linux操作系統(tǒng)下設(shè)備驅(qū)動(dòng)的實(shí)現(xiàn)過(guò)程,為FPGA在嵌入式領(lǐng)域的應(yīng)用提供了一種方法。在實(shí)際應(yīng)用中,通過(guò)用戶程序能夠很好地實(shí)現(xiàn)對(duì)FPGA硬件編程后的各種功能的控制。


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1645

    文章

    22036

    瀏覽量

    618071
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11509

    瀏覽量

    213673
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    7142

    瀏覽量

    125540
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    嵌入式Linux的USB設(shè)備驅(qū)動(dòng)技術(shù)

    嵌入式Linux的USB設(shè)備驅(qū)動(dòng)技術(shù) Linux以其穩(wěn)定、高效、易定制、硬件支持廣泛、源代碼開放等特點(diǎn),已在嵌入式領(lǐng)域迅速崛起,被國(guó)際上
    發(fā)表于 05-08 08:30 ?1955次閱讀
    嵌入式<b class='flag-5'>Linux</b><b class='flag-5'>下</b>的USB<b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>技術(shù)

    基于嵌入式Linux系統(tǒng)的LCD驅(qū)動(dòng)實(shí)現(xiàn)Implementa

    本文首先介紹Linux 系統(tǒng)設(shè)備驅(qū)動(dòng)的特點(diǎn),然后以S3C2410 平臺(tái)為硬件開發(fā)環(huán)境,實(shí)現(xiàn)Linux
    發(fā)表于 05-26 09:55 ?28次下載

    Linux環(huán)境USB的原理、驅(qū)動(dòng)和配置

    本文對(duì) Linux 環(huán)境USB 的原理、驅(qū)動(dòng)和配置進(jìn)行詳細(xì)介紹。隨著生活水平的提高,人們對(duì) USB 設(shè)備的使用也越來(lái)越多,鑒于
    發(fā)表于 01-16 16:57 ?33次下載

    PCI總線協(xié)議的FPGA實(shí)現(xiàn)驅(qū)動(dòng)設(shè)計(jì)

    PCI總線協(xié)議的FPGA實(shí)現(xiàn)驅(qū)動(dòng)設(shè)計(jì) 摘要! 采用FPGA技術(shù)! 公司的flex6000系列芯片上
    發(fā)表于 03-12 14:30 ?37次下載

    Linux環(huán)境實(shí)現(xiàn)ARM9的CAN總線通信

    Linux環(huán)境實(shí)現(xiàn)ARM9的CAN總線通信 1.  引言CAN(Controller Area Network)總線最早是由德國(guó)BOSCH公司提出,
    發(fā)表于 11-02 15:06 ?1058次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>環(huán)境</b><b class='flag-5'>下</b><b class='flag-5'>實(shí)現(xiàn)</b>ARM9的CAN總線通信

    Linux2.6環(huán)境USB設(shè)備驅(qū)動(dòng)實(shí)現(xiàn)

    Linux2.6環(huán)境USB設(shè)備驅(qū)動(dòng)實(shí)現(xiàn) 0  概述嵌入式
    發(fā)表于 04-09 10:44 ?1359次閱讀
    <b class='flag-5'>Linux</b>2.6<b class='flag-5'>環(huán)境</b><b class='flag-5'>下</b>USB<b class='flag-5'>設(shè)備</b>的<b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>實(shí)現(xiàn)</b>

    Linux基于I2C協(xié)議的RTC驅(qū)動(dòng)開發(fā)

    首先研究了Linux環(huán)境字符設(shè)備驅(qū)動(dòng)程序框架,然后介紹12C協(xié)議,在此基礎(chǔ)上開發(fā)基于12C協(xié)議的RTC字符
    發(fā)表于 03-02 16:15 ?48次下載
    <b class='flag-5'>Linux</b><b class='flag-5'>下</b>基于I2C協(xié)議的RTC<b class='flag-5'>驅(qū)動(dòng)</b>開發(fā)

    ARM-Linux-IIC設(shè)備的添加與驅(qū)動(dòng)實(shí)現(xiàn)

    本文分析了ARM-LinuxIIC總線及其設(shè)備驅(qū)動(dòng)的層次結(jié)構(gòu),指出了IIC設(shè)備添加與驅(qū)動(dòng)
    發(fā)表于 06-13 14:37 ?57次下載
    ARM-<b class='flag-5'>Linux</b>-IIC<b class='flag-5'>設(shè)備</b>的添加與<b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>實(shí)現(xiàn)</b>

    WinCE環(huán)境指紋識(shí)別設(shè)備驅(qū)動(dòng)的設(shè)計(jì)和實(shí)現(xiàn)

    WinCE環(huán)境指紋識(shí)別設(shè)備驅(qū)動(dòng)的設(shè)計(jì)和實(shí)現(xiàn)
    發(fā)表于 10-25 09:48 ?3次下載
    WinCE<b class='flag-5'>環(huán)境</b><b class='flag-5'>下</b>指紋識(shí)別<b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>的設(shè)計(jì)和<b class='flag-5'>實(shí)現(xiàn)</b>

    LinuxFPGA設(shè)備驅(qū)動(dòng)實(shí)現(xiàn)

    編程方便、集成度高、速度快等特點(diǎn),電子設(shè)計(jì)人員可以通過(guò)硬件編程的方法來(lái)實(shí)現(xiàn)FPGA芯片各種功能的開發(fā)。我們的一個(gè)數(shù)控平臺(tái)的研
    發(fā)表于 10-30 10:50 ?0次下載
    <b class='flag-5'>Linux</b><b class='flag-5'>下</b><b class='flag-5'>FPGA</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>的<b class='flag-5'>實(shí)現(xiàn)</b>

    基于Linux的LCD驅(qū)動(dòng)程序實(shí)現(xiàn)

    基于Linux的LCD驅(qū)動(dòng)程序實(shí)現(xiàn)
    發(fā)表于 10-30 16:45 ?12次下載
    基于<b class='flag-5'>Linux</b><b class='flag-5'>下</b>的LCD<b class='flag-5'>驅(qū)動(dòng)</b>程序<b class='flag-5'>實(shí)現(xiàn)</b>

    基于FPGA嵌入式系統(tǒng)的設(shè)備驅(qū)動(dòng)開發(fā)

    基于FPGA嵌入式系統(tǒng),PowerPC 架構(gòu)的Linux2.6 操作系統(tǒng)環(huán)境,對(duì)通用輸入輸出接口(GPIO)控制器的
    發(fā)表于 11-18 11:32 ?2492次閱讀
    基于<b class='flag-5'>FPGA</b>嵌入式系統(tǒng)的<b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>開發(fā)

    Linux的硬件驅(qū)動(dòng)—USB設(shè)備

    RESERVED FOR FUTURE USE INCLUDE FILES--> 前言在上篇《 Linux的硬件驅(qū)動(dòng)--USB設(shè)備(上)(驅(qū)動(dòng)
    發(fā)表于 04-02 14:37 ?537次閱讀

    如何在Linux環(huán)境實(shí)現(xiàn)Python環(huán)境的搭建

    本文檔的主要內(nèi)容詳細(xì)介紹的是如何在Linux環(huán)境實(shí)現(xiàn)Python環(huán)境的搭建。
    發(fā)表于 08-24 12:12 ?14次下載
    如何在<b class='flag-5'>Linux</b><b class='flag-5'>環(huán)境</b><b class='flag-5'>下</b><b class='flag-5'>實(shí)現(xiàn)</b>Python<b class='flag-5'>環(huán)境</b>的搭建

    虹科干貨 |?多設(shè)備協(xié)同無(wú)憂:Linux環(huán)境PCAN固定設(shè)備ID/通道分配指南

    在車輛網(wǎng)絡(luò)系統(tǒng)和工業(yè)自動(dòng)化等多設(shè)備環(huán)境中,確保設(shè)備識(shí)別的一致性對(duì)于維護(hù)系統(tǒng)穩(wěn)定性至關(guān)重要。虹科PCAN適配器提供了一種解決方案,允許用戶Linux
    的頭像 發(fā)表于 06-11 15:03 ?802次閱讀
    虹科干貨 |?多<b class='flag-5'>設(shè)備</b>協(xié)同無(wú)憂:<b class='flag-5'>Linux</b><b class='flag-5'>環(huán)境</b><b class='flag-5'>下</b>PCAN固定<b class='flag-5'>設(shè)備</b>ID/通道分配指南